AWSのLambdaでScrapyを動かす その1 - 株式会社CoLabMix

AWSのLambdaでScrapyを動かす その1

AWSのLambdaでScrapyを動かす設定です。

クローリングの大規模化などを行うのにこちらができると非常に柔軟な設計ができるため実施を行います。

★Scrapy関連記事
CentOS環境の python3.6(pyenv環境)で Scrapy を利用してみる(Scrapy その1)
Scrapyでデータ取得でクローリングで取得したURLから検索する(Scrapy その2)
CentOS7でscrapy-splashを使ってJavaScriptの解析(Scrapy その3)
Scrapyでデータの保存をmongodbにして見る(Scrapy その4)
CentOS7でscrapy-splashを使ってJavaScriptの解析 その2(Scrapy その5)

今回はAWSのLambdaをpython3.8のランタイムで動かします。(現在の推奨設定)

python3.8での環境構築はこちらをご確認ください。

Dockerでpython3.8環境の構築

 

Lambdaの設定

まずAWSのコンソールからLambdaで「関数の作成」を行います。

 

続いて関数名を「lambdaTest」、ランタイムを「Python3.8」、アクセス権限を「既存のロール」の「lambda_basic_execution」で「関数の作成」を行います。

 

初期では以下の画面になります。

 

次に「トリガーを追加」を行います。

トリガーを「S3」、バケットを特定のバケットを選択します。

イベントタイプを「すべてのオブジェクト作成イベント」を選択します。

 

こちらを設定すると以下の状態になります。

 

真ん中の「lambdaTest」をクリックするとLambdaの関数が確認できます。

 

Lambda側からこちらで一旦離れます。

「送信先を追加」は成功や失敗のメッセージを送ることができますが今回は結果はCloudWatchで確認するため今回は必要ありません。

 

Pythonの関数の作成

「コードをインラインで編集」を行うと外部のモジュールのインポートができません。

外部モジュールのインポートを行うにはそのモジュールを含むzipファイルをアップする必要があります。

ここで、一番上にリンクのあったPython3.8のDocker環境にログインします。

アプリのディレクトリに移動して「Scrapy」のライブラリーをインストールします。

pipでのインストール時に「-t」オプションをつけるとライブラリの場所を指定することができ、今回はカレントディレクトリにインストールしています。

また、ローカルのフォルダのサイズを確認しています。

これは圧縮前のフォルダが250MB以下、圧縮後のファイルが50MB以下にする必要があるためです。

・AWS Lambda の制限
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/limits.html

その後に上記フォルダに以下のファイルを作成します。

ポイントはScrapyをプロセスで動かしているところです。

・Scrapy latest - Common Practices - Run Scrapy from a script
https://docs.scrapy.org/en/latest/topics/practices.html

非常に簡単なScrapyの設定を行います。

Labmdaでの起動のため「lambda_handler」からの呼び出しを行なっています。

process.startの時に「stop_after_crawl=False」のオプションをつけているのは同じプロセスで複数のspiderを動かすためです。

https://doc.scrapy.org/en/latest/topics/practices.html#running-multiple-spiders-in-the-same-process

こちらのファイルを圧縮しサイズの確認を行います。

こちらでLambdaのデプロイパッケージをアップする準備は整いました。

 

Lambdaでデプロイパッケージのアップロードと実行

それではデプロイパッケージのアップロードを行います。

コードエントリタイプからzipファイルのアップロードができます。

 

先ほどの「lambda_function.zip」を選択し画面右上の「保存」を押してアップロードします。

 

この状態で準備は整いました。

S3のアップロードがトリガーになるので以下でファイルのアップを行います。

 

こちらで成功していると結果が確認できるはずです。

 

結果の確認

起動の状況は「CloudWatch」から確認できます。

該当のトリガーでのログを確認します。

 

成功しているためかなり長めのログが確認できました。

ログのさらに下の方では「title」と「url」のScrapyのクロールが成功している結果がわかります。

 

状況としてLambdaを使ったクローリングが成功しているようです。

またサーバー側では以下のログが出ていました。

 

ブラウザなどは指定のものです。

上記の2つのログが短期間に再度トリガーを発火したログです。

この際、接続元のIPは変わりません。

しばらくして(20分ほど)起動した際にはIPが変わっていることを確認できます。

 

トリガーファイルの中身のURLでクローリングを行ったり、クローリング結果の保存先など課題はまだありますが基本的なところができましたのでこちらまでで。

★関連記事
AWSのLambdaでScrapyを動かす その2 - S3からの値の取得 -
AWSのLambdaでScrapyを動かす その3 - dynamodbからの取得・保存 -

 

このブログは株式会社CoLabMixによる技術ブログです。

GCP、AWSなどでのインフラ構築・運用や、クローリング・分析・検索などを主体とした開発を行なっています。

Ruby on RailsやDjango、Pythonなどの開発依頼などお気軽にお声がけください。

開発パートナーを増やしたいという企業と積極的に繋がっていきたいです。

お問い合わせやご依頼・ご相談など

    関連記事

    1. Django でWebアプリケーションを作成してみる その1(ubun…

    2. 外部のライブラリを利用してのAWS Lambdaの設定

    3. Scrapyでデータの保存をmongodbにしてみる(Scrapy そ…

    4. CentOS7でscrapy-splashを使ってJavaScript…

    5. terraformでVPC+EC2+RDS(aurora-mysql)…

    6. CentOS7にZABBIXサーバのインストール