ネット上には毎日たくさんの情報がアップロードされ続けています。それらの情報を効率よく収集するにはどうしたらいいでしょう?
- ポータルサイト、まとめサイトを定期的にチェックする
これが一般的な方法でしょうか。
ぼくもRSSリーダでポータルサイトのチェックは欠かさず行っています。
しかし、興味の対象(キーワード)が、ポータルサイトが無いようなマイナーな物だったらどうしましょう?
- 毎日、そのキーワードでググる(google検索)
のがベストでしょうか?でも、手で毎日検索するなんてめんどくさいですよね。それに忘れやすい。そういう事はコンピュータにやらせましょう。
Contents
自動でキーワードをググってHTMLで書き出すプログラムをpythonを使って作る
最近は、仕事でpythonで書かれたシステムの運用しています。APIを叩いたり、監視ツールでは見えないようなステータスを監視したりと大部分の運用業務ならばシェルスクリプトで行えていました。が、しかし、pythonで書かれたシステム内部については、pythonに慣れないとどうにもなりません。
そんなわけで、何かpythonで自分が毎日使うようなツールを作りたい、あわよくばもっとpythonに慣れたいと思っていたのです。
探してはいませんが、google検索をかけてその結果を保存するようなプログラムは、世の中にそれこそ星の数ほど存在している事でしょう。自分に足りていない機能があればオープンソースなツールならばパッチを作る事もできるでしょう。
しかし、ここはあえて車輪の再発明をすることにします。その方が楽しいので。
以前にも書いたかもしれませんが、ぼくは仕事としてプログラムを書いたことはありません。あくまでも趣味なので、最初からきっちりと設計はしない(というか、できない)で、 最小機能を実装してから肉付けをしていこうと書き始めました。
おおまかな設計
- google apiを叩き、結果を取得する
- 結果は、HTMLで出力するが、一覧表示はapacheのindex機能を利用する
- pythonは3系を使い、virtualenv環境下で動作させる
- プログラムの定期起動はcronから行う
- 検索キーワードと除外するキーワードを指定できるようにする
- 複数のキーワードで検索をかけられるようにする
- 24時間以内に更新されたコンテンツを検索する
1st step
- 各種バラメータはハードコーディング
- google APIを叩き結果をbeautifulsoupで取り出し文字列として取得
- apacheのDocumentRoot配下に結果をHTMLで書き出す
この段階でやりたいことの基本的な部分が出来上がっています。が、見た目は悪いし、検索結果で見たいページへのリンクにgoogleのトラッキング情報が含まれてしまっていました。
BeautifulSoupを使ったことがなかったので、どなたかのblogを参考にしながら実装を進めましたが、BeautifulSoupで処理した結果をreで置換したりと変なことをしていました。公式ドキュメントを読み実装を進めたほうが良かったなー
できあがったスクリプトは、6時間毎に結果を出力するようにcronに登録します。
1 2 |
$ crontab -l 0 */6 * * * (cd /home/somewhere/getupdate ; /home/somewhere/virtualenv/getupdate/bin/python /home/somewhere/my/getupdate/getupdate.py) |
外からも結果を参照したいので結果出力用ディレクトリにapacheでACLをかけます。身元がはっきりしているアドレスからは認証なし、その以外からはBASIC認証をかけました。
1 2 3 4 5 6 7 8 |
<Directory "/home/www/home.momiage.org/html/daily_search"> AuthType Basic AuthName "Auth" AuthUserFile /home/www/home.momiage.org/conf/.htpasswd Require valid-user Require ip 192.168.0.0/23 <-- 自宅ネットワークアドレス Require ip xxx.xxx.xxx.xxx/32 <-- 職場のGWアドレス </Directory> |
ここで注意が必要なのは、UA(User Agent)によりGoogleが返してくるタグが変わってくるということ。自分の環境のUAとタグを確認して、テストしないと意図した結果が得られません。
2nd step
1st setpで大まかな実装を終えたので、2nd stepでは、使い勝手の向上を目指します。
- パラメータを設定ファイルから読み込めるようにする
- 複数の設定ファイルを扱えるようにする
- 出力するHTMLファイルに、CSSで修飾できるようにする
スクリプト言語の良いところは、ソースを変更してもコンパイルをする必要が無いところ。検索キーワードを変更したくなった時でも、ソースコードの中に書かれている文字列を書き換えればそれで完了。なのですが、それではやはり不便なので設定ファイルに変更され得る値を書き出すのがスマートなのでしょう。
設定ファイルの形式はなにが一般的なのでしょうか。いくつか調べてみて、簡単そうなtomlフォーマットという形式を採用しました。
その副作用で起動時に設定ファイルを指定すれば、1つのコードで複数のキーワード検索をさせることができるようになりました。
1 2 3 |
0 */6 * * * (cd /somewher/getupdate ; /somewher/virtualenv/getupdate/bin/python /somewher/getupdate/getupdate.py) 3 */6 * * * (cd /somewher/getupdate ; /somewher/virtualenv/getupdate/bin/python /somewher/getupdate/getupdate.py --config /somewher/getupdate/gold_prospect.toml) 6 */6 * * * (cd /somewher/getupdate ; /somewher/virtualenv/getupdate/bin/python /somewher/getupdate/getupdate.py --config /somewher/getupdate/treasure.toml) |
1st setpでは、シンプルなHTMLを出力していました。が、しかし、ブラウザで表示させると、少し読みづらい。というわけで、div tagを入れて、CSSで装飾できるようにしてみました。
選択されている(マウスカーソルが乗っている)項目に、囲い線をつけてみました。
3rd step
2nd stepまでの実装で一通り使えるようになり、しばらくは定期的にWebを確認していたのですが、だんだんとめんどくさくなり・・・気づくと2ヶ月も放置していました。
見なくなった原因は、携帯でブラウザを起動するのがめんどくさいこと。それならばと、結果をメールで送信するような機能を追加してみました。
これがとっても便利。携帯でWebブラウザを立ち上げるのはしんどいですが、メーラーならばさっと見る事ができます。
しばらくは、このまま使ってみようと思っています 🙂
動作環境やソースコード類
Debian + Python 3.7で動作を確認しています。
ソースコードは、githubにあげてあります。