Webページがちゃんと表示されてるか、アプリのレビューはどうなってるか、ダウンロード数はどうなっているか、などなど。
・・・理由はともあれ、そんな方は多いのではないでしょうか。
筆者もいろいろあって(?)とあるページがちゃんと表示されているかどうかを1日1回チェックすることになりました。
が、いちいち見に行くのはとっても面倒なうえに大変です。
しかも「あ、昨日チェックするの忘れてた・・・」なんてこともリスクとして容易に想像できますね。
そこで、先日公開したWM3500Rのバッテリー残量をチェックするスクリプトをベースに、Webページをスクレイピング+スクレイピングしたデータをメールで送信(レポート)するスクリプトを作成してみました。
スクレイピングにはBeautifulSoup、メール送信にはメールに関するモジュール(email.MIMEText/email.Header/email.Utils)を使いました。
メールを送信するには「受信者(送信先)のアドレス」はもちろんのこと、「送信元アドレス/SMTPサーバー」の指定/設定が欠かせません。
ここでは送信元に「Gmailのアドレス/サーバーを設定する」ことを想定してスクリプトを作成してみました。
#そのためSMTPサーバーの指定がGmailのものになっています。
このスクリプトのポイントは下記3点です。
- スクレイピングするページの有効/無効を「HTTPステータスコード」ではなく「取得したページに文字列が存在するかどうか」で判断条件としています。(ページによってはコンテンツが見つからない場合に、HTTP200+白紙ページを返すものがあるため)
- pythonは内部文字列をUnicodeとして扱っているため、内部文字列とスクレイピングした文字列を連結させたい場合には「スクレイピングした文字をUnicodeへデコード」するようにしてください。
- メールのメッセージをつくるときには、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