AWS-Lambda + Python + CronでWEBスクレイピングを定期的に実行する
はじめに
Mac環境の記事ですが、Windows環境も同じ手順になります。環境依存の部分は読み替えてお試しください。
目的
この記事を最後まで読むと、次のことができるようになります。
| No. | 概要 | キーワード |
|---|---|---|
| 1 | コーディング | Python |
| 2 | WEBスクレイピング | Selenium,chromedriver,headless-chromium |
| 3 | Lambda設定 | Lambda |
実行環境
| 環境 | Ver. |
|---|---|
| macOS Catalina | 10.15.3 |
| Python | 3.7.3 |
| selenium | 3.141.0 |
ソースコード
実際に実装内容やソースコードを追いながら読むとより理解が深まるかと思います。是非ご活用ください。
関連する記事
AWS-Lambdaの特徴
本サービスは従量課金制となります。ご留意ください。
全体の流れ
- Pythonコードを書く
- Lambdaへアップロードするためのzipを作成する
- Lambda関数を作成する
- Lambda関数へzipをアップロードする
- (補足)Layersを使ってアップロードする
- Lambda関数の環境変数を設定する
- (補足)Layersを使った場合の環境変数を設定する
- 定期的に実行するためCronを設定する
1. Pythonコードを書く
コーディング
app/lambda_function.py
"""app/lambda_function.py
"""
import os
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
def lambda_handler(event, context):
"""lambda_handler
"""
print('event: {}'.format(event))
print('context: {}'.format(context))
headless_chromium = os.getenv('HEADLESS_CHROMIUM', '')
chromedriver = os.getenv('CHROMEDRIVER', '')
options = Options()
options.binary_location = headless_chromium
options.add_argument('--headless')
options.add_argument('--no-sandbox')
options.add_argument('--single-process')
options.add_argument('--disable-dev-shm-usage')
driver = webdriver.Chrome(executable_path=chromedriver, options=options)
driver.get('https://info.finance.yahoo.co.jp/fx/')
usd_jpy = driver.find_element(By.ID, 'USDJPY_top_bid').text
driver.close()
driver.quit()
return {
'status_code': 200,
'usd_jpy': usd_jpy
}
if __name__ == '__main__':
print(lambda_handler(event=None, context=None))
Lambdaで動作させる場合は、Options()の設定が必要となります。
2. Lambdaへアップロードするためのzipを作成する
スクリプト作成
- 環境に合わせて
chromedriverとheadless-chromiumのバージョン/パスを変更する必要があります。 - 2020/5時点で動作確認済み。
make_upload.sh
rm upload.zip
rm -r upload/
rm -r download/
mkdir -p download/bin
curl -L https://chromedriver.storage.googleapis.com/2.41/chromedriver_linux64.zip -o download/chromedriver.zip
curl -L https://github.com/adieuadieu/serverless-chrome/releases/download/v1.0.0-55/stable-headless-chromium-amazonlinux-2017-03.zip -o download/headless-chromium.zip
unzip download/chromedriver.zip -d download/bin
unzip download/headless-chromium.zip -d download/bin
mkdir upload
cp -r download/bin upload/bin
cp app/lambda_function.py upload/
pip install -r app/requirements.txt -t upload/
cd upload/
zip -r ../upload.zip --exclude=__pycache__/* .
cd ../
rm -r upload/
rm -r download/
upload.zip作成
command_line.sh
sh make_upload.sh
3. Lambda関数を作成する
前提条件
- AWSアカウント作成済み
- Lambda関数のロール作成済み
Lambda関数作成
- AWSにログインする
- サービスからLambdaを開く
- サブメニューの
関数を選択して関数の作成をクリックする -
一から作成を選択して、関数名、ランタイム、実行ロールを入力して関数の作成をクリックする
4. Lambda関数へzipをアップロードする
10MBを超えたためS3経由でアップロードしました。
アップロード
- Lambda関数の
関数コードセクションを表示する -
.zipファイルをアップロードを選択する -
アップロードからupload.zipを選択して保存をクリックする
zipサイズが10MBを超える場合のアップロード
- S3に
upload.zipをアップロードする - Lambda関数の
関数コードセクションを表示する -
Amazon S3からファイルをアップロードを選択する -
Amazon S3のリンクURLを入力して保存をクリックする
5. (補足)Layersを使ってアップロードする
アップロードの流れ
-
upload.zipからbinを切り離してbin単体でzipを作成する -
Layersにbinを登録する - Lambda関数に
Layersを追加する -
.zipファイルをアップロードを選択してupload.zipをアップロードする
5-1. upload.zipからbinを切り離してbin単体でzipを作成する
bin.sh
bin.zip
├── chromedriver
└── headless-chromium
5-2. Layersにbinを登録する
- サブメニューの
レイヤーを選択してレイヤーの作成をクリックする - 任意の
名前を入力する -
アップロードをクリックして、bin.zipを選択する -
互換性のあるランタイム - オプションを選択して作成をクリックする
5-3. Lambda関数にLayersを追加する
- Lambda関数の
Designerセクションの中心に表示されるLayersを選択する - 下段に表示されるレイヤーの
レイヤーの追加をクリックする - Layersに登録した
bin.zipの名前を選択して追加をクリックする
5-4. .zipファイルをアップロードを選択してupload.zipをアップロードする
6. Lambda関数の環境変数を設定する
環境変数設定
- Lambda関数の
環境変数セクションを表示する
| キー | 値 |
|---|---|
| CHROMEDRIVER | /var/task/bin/chromedriver |
| HEADLESS_CHROMIUM | /var/task/bin/headless-chromium |
7. (補足)Layersを使った場合の環境変数を設定する
Layers環境変数設定
- Lambda関数の
環境変数セクションを表示する
| キー | 値 |
|---|---|
| CHROMEDRIVER | /opt/bin/chromedriver |
| HEADLESS_CHROMIUM | /opt/bin/headless-chromium |
8. 定期的に実行するためCronを設定する
Cron作成
- Lambda関数の
Designerセクションを表示してトリガーを追加をクリックする - トリガーの設定で、
CloudWatch Events/EventBridgeを選択する - ルールで、
新規ルールの作成を選択する - ルール名で、任意の
ルール名を入力する - ルールタイプで、
スケジュール式を選択する - スケジュール式で、
cron(0 17 ? * MON-FRI *)を入力して追加をクリックする
Cron式の例
| 頻度 | 式 |
|---|---|
| 毎日午前 10:15 (UTC) | cron(15 10 * * ? *) |
| 毎週月曜日から金曜日まで午後 6:00 | cron(0 18 ? * MON-FRI *) |
| 毎月 1 日の午前 8:00 | cron(0 8 1 * ? *) |
| 平日の 10 分ごと | cron(0/10 * ? * MON-FRI *) |
| 月曜日から金曜日まで午前 8:00 から午後 5:55 まで 5 分ごと | cron(0/5 8-17 ? * MON-FRI *) |
| 毎月最初の月曜日の午前 9 時 | cron(0 9 ? * 2#1 *) |