Scrapy+SES でWebページの変化を感知&メールでお知らせ


概要

webページの新しい投稿や価格変動...などの更新を知らせて欲しいってことはよくある。本稿では
webスクレイピングフレームワークscrapyで得たwebページの変化を、AWSのSES(Simple Email Service)によりメールでお知らせする方法の片鱗を紹介する。もちろん複数ページ可能。

詳細

PasSとしてScrapinghubを使う。クラウドサーバーによる定期実行、データベースとして使える。
spidername.pyscriptname.pyを時間差で定期実行する。
(scrapinghub上ではscrapyで制御されたspiderの他、普通のpython scriptも実行できる。デプロイのためにsetup.pyに記載必要。)

# Automatically created by: shub deploy

from setuptools import setup, find_packages

setup(
    name         = 'project',
    version      = '2.x',
    packages     = find_packages(),
    package_data={'directoryname0': ['directoryname1/*.html']},
    scripts=['script_directoryname/scriptname.py'],
    entry_points = {'scrapy': ['settings = directoryname0.settings']},
      )

spidername.pyでwebページをクローリング、データ抽出し、pipeline.pyで(scrapyによりsetting.pyで設定してれば自動で行われる。)DBに保存。

scriptname.pyでDBを参照し、webページの更新などの条件で以下のようにメール送信。

import boto3
from jinja2 import Environment, PackageLoader
from directoryname0 import settings

jinja_env = Environment(loader=PackageLoader('directoryname0', 'directoryname1'))

def send_email_alert(items):
    html_body = jinja_env.get_template('email.html').render(items=items)

    client = boto3.client("ses",
                        aws_access_key_id = settings.AWS_ACCESS_KEY,
                        aws_secret_access_key = settings.AWS_SECRET_KEY,
                        region_name = settings.SES_REGION)
    client.send_email(
            Destination={'ToAddresses': [settings.EMAIL_ALERT_TO],},
            Message={
                'Body': {'Html': {'Charset': 'UTF-8',
                        'Data':html_body},},
                'Subject': {'Charset': 'UTF-8',
                    'Data': 'Email title',},
                    },
            Source= settings.EMAIL_ALERT_FROM,
                     )

Reference

HOW TO BUILD YOUR OWN PRICE MONITORING TOOL
ScrapyCloud + DynamoDBでサーバーレス・スクレイピング