1. Qiita
  2. 投稿
  3. Python

Scrapy Cloudでスクレイピングした成果物をS3にアップロードする

  • 5
    いいね
  • 0
    コメント

はじめに

以前、勉強目的で、AWS lambda + API Gateway で郵便番号検索APIを作ってみたのですが、その郵便番号データはScrapyでスクレイピングし、S3にアップロードして利用していました。
今回は、そのプロジェクトをScrapy Cloudにデプロイして定期スケジュール実行するまでにハマったポイントについて書きます。

Scrapy Cloudについては、下記のURLを参考にしました。

全体のワークフロー

全体のワークフローを図にすると下記のようになります。

jp-zip_scrapy構成図.png

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.ymlrequirements_fileを指定すれば、必要なライブラリをインストールできるので、boto3を利用することができます。

デプロイ時にrequirements_fileが正常に処理されれば、Code & Deploysrequirementsにて、追加インストールされたライブラリを確認することができます。

requirements.png

AWSの認証情報をどうするか

AWS認証情報は、Spider Settings -> Spider settigns にて、下記のように設定値を登録します。

scrapy_settings.png

コードからは下記のようにアクセスします。

from scrapy.conf import settings

s3 = boto.connect_s3(settings['AWS_ACCESS_KEY_ID'], settings['AWS_SECRET_ACCESS_KEY'])

ローカルで確認する場合は、settings.pyに、設定値を記述します。
ただし、~/.aws/credentialsに認証情報が存在する場合は、設定値の記述は不要です。

settings.py
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を使って何かボットを作って記事にしようと思います。

ではでは。

この投稿は クローラー/Webスクレイピング Advent Calendar 201617日目の記事です。
Comments Loading...