pythonやC言語でスクレイピングすることが一般的だと思いますが、
Linuxのコマンドでもスクレイピング(もどき)なものができることを知りました。
偉大なるLinux。。
今回はLinux初学者(LinuC level1の取得を目指している)人がlinuxのコマンドだけで軽めのスクレイピングをする流れをみて行きます。
crontabで定期実行するところまでしますが、細かな仕様(一般ユーザでもできるようにする、ファイル作成の場所)などはこだわらず進めます。
おそらく劇的に変わることはないと思いますが、なんかあれば追記しようと思います。
環境
今回UTMの仮想化ソフトウェアを使用。
Ubuntu 20.04 LTS上で動かしています。
情報取得のcurl
pythonならseleniumやbs4.Beautifulsoupなどでスクレイピングしたりするかと思いますが、Linuxはcurlコマンドを使います。
(スクレイピング、と記載していますが、curlコマンドは厳密にはいろんなプロトコルに対応したデータを転送するコマンドで、ダウンロードやhttpレスポンスの確認などの用途で使われるので、意味合いは違います。
しかし、現時点での詳細な説明は難しいので、とりあえず以後「スクレイピング」という用語は控えます)
ざっくりとした外観
curl URL
でとりあえずどのようなものが出てくるかみてみましょう
curl www.google.com
>>>
<!doctype html><html itemscope="" itemtype~
というhtmlソースがずらりと取得できます
オプション
めっちゃオプションありますが、今回は以下を使います。
・-o(--output):保存するファイル名
・-s(--silent): 実行中のメッセージの非表示
などなど。
情報を取得し、トップニュースの抜き出しをgrepで行う。
htmlソースがとれることが理解できたので、grepコマンドでyahooトップニュースの該当箇所を取得します
(下手な正規表現を駆使していますが、もっとスマートにとれることは間違いないと思うので、各自お好きなように)
curl -Ls news.yahoo.co.jp | grep -oP '<ul>.*?<li .*?>.*</li></ul>' | sed -e 's/</\n/g'
※UTMがコピペできない(設定の問題?)ので直打ちしています。
もしかしたら打ち間違いあるかもです。
正規表現の非貪欲とかも使ってますが、基本的には上記コマンドを打つと、
箇条書きでいろんなタグと要素が出てきます。
なので、該当部分である「a href="news~" data-~>~」のみを取得していけばよい。
一旦、上記の出力をファイルに書き込んでそれを処理する方向で進めたいので、
curl -Ls news.yahoo.co.jp | grep -oP '<ul>.*?<li .*?>.*</li></ul>' | sed -e 's/</\n/g' >> /root/curl_yahoo.txt
※crontabを使う関係でとりあえずrootのホームディレクトリ直下にしていますが、全然他の場所でいいです。
grep 'a href=".*\/pickup\/.*"' /root/curl_yahoo.txt > root_news_lists.txt
sed -i -e 's/a href="//g' -e 's/" data.*>/, /g' -e '$d' /root/news_lists.txt
※最後の-e '$d' ~は最終行の削除をしています。
きったたないコーディングですが、これで出てくるnews_lists.txtは以下の感じ
気になった見出しがあればすぐさま飛んでいけますねw
(おまけ)crontabコマンドで定期実行させよう。
せっかくなので、crontabというlinuxコマンドでOS起動中に指定した間隔(もしくは時刻)で自動で動いてくれるように設定して終わりにします。
いろんな方法があると思いますが、自分はshスクリプトを書いて、それをshコマンドで定期実行させる方向でしました。
以下、
#!/bin/bash
if [ -e /root/news_lists.txt ]; then
rm /root/news_lists.txt
fi
if [ -e /root/curl_yahoo.txt ]; then
rm /root/curl_yahoo.txt
fi
curl -Ls news.yahoo.co.jp | grep -oP '<ul>.*?<li .*?>.*</li></ul>' | sed -e 's/</\n/g' >> /root/curl_yahoo.txt
grep 'a href=".*\/pickup\/.*"' /root/curl_yahoo.txt > root_news_lists.txt
sed -i -e 's/a href="//g' -e 's/" data.*>/, /g' -e '$d' /root/news_lists.txt
こんな感じ。
これを/root直下において、
crontab -e
でcronの実行を編集します
crontabのファイルは
[分] [時] [日] [月] [曜日] [実行ユーザ名(システム用設定ファイルでのみ指定)] [コマンド]で記載。
毎日とか、2時間おきに、みたいな方法もありますが、今回は飛ばします。
(これが終わればcrontab -l
で登録されたかどうか確認しておきましょう。)
今回は7時28分に実行されるようにしていますので、その前後とファイルのタイムスタンプも見ておきましょう。
7:22の時
まだ.shファイルとかもろもろしかありません。
7:28のとき
ちゃんと作成されていることが確認できましたね。
これ以降定期実行が不要な場合はcrontab -r
で削除しておきましょう