2012年2月13日月曜日

PythonでWebページをスクレイピング+スクレイピングしたデータをメールで送信

「ページを1日1回必ずチェックしなきゃ 」

Webページがちゃんと表示されてるか、アプリのレビューはどうなってるか、ダウンロード数はどうなっているか、などなど。
・・・理由はともあれ、そんな方は多いのではないでしょうか。

筆者もいろいろあって(?)とあるページがちゃんと表示されているかどうかを1日1回チェックすることになりました。

が、いちいち見に行くのはとっても面倒なうえに大変です。
しかも「あ、昨日チェックするの忘れてた・・・」なんてこともリスクとして容易に想像できますね。

そこで、先日公開したWM3500Rのバッテリー残量をチェックするスクリプトをベースに、Webページをスクレイピング+スクレイピングしたデータをメールで送信(レポート)するスクリプトを作成してみました。
スクレイピングにはBeautifulSoup、メール送信にはメールに関するモジュール(email.MIMEText/email.Header/email.Utils)を使いました。

メールを送信するには「受信者(送信先)のアドレス」はもちろんのこと、「送信元アドレス/SMTPサーバー」の指定/設定が欠かせません。
ここでは送信元に「Gmailのアドレス/サーバーを設定する」ことを想定してスクリプトを作成してみました。
#そのためSMTPサーバーの指定がGmailのものになっています。

このスクリプトのポイントは下記3点です。
  1. スクレイピングするページの有効/無効を「HTTPステータスコード」ではなく「取得したページに文字列が存在するかどうか」で判断条件としています。(ページによってはコンテンツが見つからない場合に、HTTP200+白紙ページを返すものがあるため)
  2. pythonは内部文字列をUnicodeとして扱っているため、内部文字列とスクレイピングした文字列を連結させたい場合には「スクレイピングした文字をUnicodeへデコード」するようにしてください。
  3. メールのメッセージをつくるときには、Subjectの位置に注意してください。SubjectをToより先に書いてメールを送信すると、To部分が "undisclosed-recipients:" となってしまう場合があります。

サンプルスクリプトはこちら。
とあるWebページの<h1>要素をスクレイピングして、その内容をメールで送るようにしています。
メールのSubjectやMessage部分は、送りたい内容が入るように main 部分を書き換えてください。


このスクリプトをcronに登録しておけば、忘れることもないですね。
ここでは毎朝5時にチェックするようにしています。
お約束ですが、過度なスクレイピングはしないようにしてください。
$ vi crontab.txt
0 5 * * * /usr/bin/env python /path/to/scrape2email.py > /dev/null 2>&1
$ crontab ./crontab.txt

筆者はPerlをよく使うのですが、こうやってPython/Rubyをたまに使ってみるのも面白いですね。
#機会があればPerlに関連するエントリも書いてみようと思います。

ステキなスクレイピングライフを!

■参考ページ
http://labs.unoh.net/2007/06/python_2.html