kimonoを使ってスクレイピングした情報をメールで送信する方法

kimonoを使ってスクレイピングした情報をメールで送信する方法

はじめに

今回は「kimono」というクールなWebスクレイピングサービスとSendGridをマッシュアップして、Webサイト上の更新情報を簡単にメールで通知する方法をご紹介します。この方法を利用すると、例えばECサイトで販売されている商品の価格をモニタリングして、価格情報の変更をメールで通知する、といったことができるようになります。

kimonoとは?

kimonoは簡単な設定だけで好きなWebサイトの情報をスクレイピングしてAPI化してくれるサービスです。Webページをスクレイピングするツールは他にもありますが、このサービスを使うとより簡単に実現することができます。

準備

kimonoのWebサイトでサインアップを行い、Chrome拡張機能をインストールしてください。これで任意のWebサイトをAPI化する準備が整いました。

APIの作成

次に、API化したいWebサイトをChromeブラウザで表示します。今回は、Amazonに掲載されている液晶テレビの価格一覧をAPI化してみます。ブラウザでページを開いたら、Chrome拡張機能の「kimono」ボタンを選択します。

kimono0-1

次にWebページ内の商品名や価格などの要素をクリックして、APIに含めるプロパティを作成していきます。

kimono1-1

APIで取得できるデータの形式を確認しながら、プロパティ名を編集することができます。

kimono3-1

プロパティの編集が完了したら、最後に画面上部の「Done」ボタンを選択します。

kimono1-2

APIの名前とクロール間隔を指定すると、APIの作成作業が完了します。

kimono4-1

マッシュアップ

kimonoにはデータの変更を通知するWebhook機能があります。この機能は、対象ページを一定間隔でクローリングし続け、データに変更があった場合に指定したURLに通知します。この通知を受け、SendGridでメールを送信するアプリケーションを作成してみます。これで、価格情報の更新をメールで通知することができるようになります。

前提条件

事前に以下がインストールされていることが前提となります。

今回は、POSTを受けるサンプルアプリケーションをFlaskを使って書いてみました。実際に動かすためには以下の箇所を編集する必要があります。

  • SendGridのユーザ名とパスワード
  • POST内のデータ参照部分
  • 送信元と宛先
# -*- coding: utf-8 -*-
from flask import Flask, request
import json
import sendgrid

app = Flask(__name__)
# SendGridのユーザ名とパスワードを設定
sg = sendgrid.SendGridClient('username', 'password')

@app.route('/',methods=['POST'])
def foo():
  data = json.loads(request.data)
  body = ""
  # POSTのデータ参照
  for x in data['results']['prices']:
    body = body + format(x['title'])
    body = body + '<br>'
    body = body + format(x['maker'])
    body = body + '<br>'
    body = body + format(x['size'])
    body = body + '<br><br><br>'

  for y in data['results']['lists']:
    body = body + format(y['price']) + '<br>'

  subject = "Amazon TV price list"
  sender = "sender@example.com" # 送信元を設定
  to = "to@example.com"         # 宛先を設定


  message = sendgrid.Mail()
  message.add_to(to)
  message.set_subject(subject)
  message.set_html(body)
  message.set_text(body)
  message.set_from(sender)
  status, msg = sg.send(message)

  return "OK"

if __name__ == '__main__':
  app.run()

編集したコードを保存します。ここではday2blog.pyというファイル名(ファイル名は任意)にします。アプリケーションを起動して、ngrokでインターネット上にトンネリングします。

$ python day2blog.py
$ ngrok http 5000
Tunnel Status                 online
Version                       2.0.17/2.0.17
Web Interface                 http://127.0.0.1:4040
Forwarding                    http://cf8ab791.ngrok.io -> localhost:5000
Forwarding                    https://cf8ab791.ngrok.io -> localhost:5000

最後に、kimonoにログインして、作成したAPIの「USE DATA」タブ内で「WEBHOOKS」を選択してPOST先URLを追加してください。「Test webhooks」ボタンを選択すると、POSTのテストを行うことができます。

kimono8-1

アプリケーションにWebhookで通知されると、以下のようなメールが送信されます。

kimono9

さいごに

現時点でkimonoはbeta提供のようですが、スクレイピングの実装の手間が大幅に省けることがわかるかと思います。メール送信するためにはSendGridのアカウントが必要になりますので、是非お試しください!

関連記事

Code Challenge: Creating a Black Friday Mashup with Kimono and SendGrid