はじめに
以前、勉強目的で、AWS lambda + API Gateway で郵便番号検索APIを作ってみたのですが、その郵便番号データはScrapy
でスクレイピングし、S3
にアップロードして利用していました。
今回は、そのプロジェクトをScrapy Cloud
にデプロイして定期スケジュール実行するまでにハマったポイントについて書きます。
Scrapy Cloud
については、下記のURLを参考にしました。
- Scrapy + Scrapy Cloudで快適Pythonクロール+スクレイピングライフを送る - Gunosyデータ分析ブログ
- Pythonでスクレイピング - Scrapy入門最初の2歩目 - Qiita
全体のワークフロー
全体のワークフローを図にすると下記のようになります。
scrapinghub
にデプロイするまで
scrapy
のプロジェクトを作成してから、scrapinghub
にデプロイするまでは、下記のような流れになります。
- scrapyプロジェクトを作成
$ scrapy startproject {your project}
- ローカルで実装
- ローカルでスクレイピングしてみる
$ scrapy runspider {spider_file.py}
-
scrapinghub
にデプロイ$ shub deploy
scrapinghub
でジョブを実行したときにハマったこと
scrapinghub
にデプロイするまでは、順調だったのですが、scrapinghub
でジョブを実行したときにいくつかハマったポイントがありました。
botoは2系をサポート
AWSの操作には、botoを使いますが、Scrapy Cloud
であらかじめインストールされているのはboto
(v2)なので、注意が必要です。
boto3を追加インストール(2016-12-19更新)
scrapinghub.yml
にrequirements_file
を指定すれば、必要なライブラリをインストールできるので、boto3を利用することができます。
デプロイ時にrequirements_file
が正常に処理されれば、Code & Deploys
のrequirements
にて、追加インストールされたライブラリを確認することができます。
AWSの認証情報をどうするか
AWS認証情報は、Spider Settings
-> Spider settigns
にて、下記のように設定値を登録します。
コードからは下記のようにアクセスします。
from scrapy.conf import settings
s3 = boto.connect_s3(settings['AWS_ACCESS_KEY_ID'], settings['AWS_SECRET_ACCESS_KEY'])
ローカルで確認する場合は、settings.py
に、設定値を記述します。
ただし、~/.aws/credentials
に認証情報が存在する場合は、設定値の記述は不要です。
AWS_ACCESS_KEY_ID = 'xxxxxx'
AWS_SECRET_ACCESS_KEY = 'xxxxxx'
課題
-
S3
へのファイルアップロードが極端に遅く、スクレイピングに約20分かかっている- 勉強目的なので、気にしなくてもいいのだが、何とか改善したい
- 郵便番号データは毎月1度は更新されている
- 郵便番号データが更新された場合に、
AWS Lambda
側のAPIも自動的に最新のデータを参照するようにしたい- 現状、郵便番号データの更新年月日をバージョン情報として、ステージ変数で管理している
-
S3
へのアップロードが完了した後で、ステージ変数を更新したい
おわりに
はじめは、APIだけでなく、ScrapyプロジェクトもAWS Lambda
で動かそうとしていました。
しかし、ソースコードをライブラリも込みでZIPファイルに圧縮してアップロードしなくてはならず、結果として、うまく動かせなかったので、素直にScrapy Cloud
にデプロイしてみました。
ボット・クローラー Advent Calendar 2016にも招待されましたので、そちらでも、Scrapy Cloud
を使って何かボットを作って記事にしようと思います。
ではでは。