2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【風変わり】Linuxのコマンドだけでyahooのトップニュースの見出しとURLをスクレイピングする

Posted at

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は以下の感じ
スクリーンショット 2021-12-07 16.03.59.png
気になった見出しがあればすぐさま飛んでいけますねw

(おまけ)crontabコマンドで定期実行させよう。

せっかくなので、crontabというlinuxコマンドでOS起動中に指定した間隔(もしくは時刻)で自動で動いてくれるように設定して終わりにします。

いろんな方法があると思いますが、自分はshスクリプトを書いて、それをshコマンドで定期実行させる方向でしました。
以下、

curl_yahoo.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のファイルは
[分] [時] [日] [月] [曜日] [実行ユーザ名(システム用設定ファイルでのみ指定)] [コマンド]で記載。

スクリーンショット 2021-12-07 16.19.06.png

毎日とか、2時間おきに、みたいな方法もありますが、今回は飛ばします。
(これが終わればcrontab -lで登録されたかどうか確認しておきましょう。)

今回は7時28分に実行されるようにしていますので、その前後とファイルのタイムスタンプも見ておきましょう。

7:22の時
スクリーンショット 2021-12-07 16.22.50.png
まだ.shファイルとかもろもろしかありません。

7:28のとき
スクリーンショット 2021-12-07 16.28.37.png
ちゃんと作成されていることが確認できましたね。

これ以降定期実行が不要な場合はcrontab -rで削除しておきましょう

今回参考にさせていただいた記事

プリキュアで学ぶワンライナーWebスクレイピング

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?