背景
Lambdaを使って日付ごとにデータをスクレイピングすることがあった。
大量のデータであったが、繰り返し文で日付を変えながら行うプログラムとしていたため、非常に時間がかかった。
そこで、①実行指示Lambdaと②スクレイピングLambdaに分けてプログラムを作成し、①にて変数を入れ替えながら②に指示するような構成にすることで、Lambdaの同時実行が可能になったので、備忘録として記載する。
参考記事については複数層に分けて大量のLambda実行を可能としているが、今回はわかりやすさ優先で、(親)と(子)の2層構造でLambdaを同時実行してみる。
イメージ
親Lambda
parent
import json
import io
client = boto3.client('lambda')
date_list = ['2022/01','2022/02','2022/03','2022/04']
category_list = ['setosa','versicolor','virginica','other']
def lambda_handler(event, context):
# 子Lambda の呼び出し
for i in range(len(date_list)):
response = client.invoke(
FunctionName='children',#Lambdaで記載している関数名を記載
InvocationType='Event',
Payload=json.dumps({'DATE': date_list[i]
,'CATEGORY': category_list[i]
})
)
上記のように、親Lambda内で子Lambdaを呼び出している。for文でdate_listの数(4回)だけ呼び出しをするように指示している。
子Lambda
children
import json
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
def lambda_handler(event, context):
date = str(event.get('DATE'))
category = str(event.get('CATEGORY'))
driver = headless_chrome()
wait = WebDriverWait(driver, 30)
driver.get("http://〇〇…")
・・・
親Lambdaで呼び出された子Lambdaは、event.getで親Lambdaから渡された変数を読み込むことができる。
終わりに
上記は基本形の形であるが、参考記事のように複数層で呼び出しー呼び出され構成にすることで、並列処理チックな構成を組むことが可能。
大量データのスクレイピングだけではなく、大量データの集計・解析作業の高速化につながることを期待。
参考記事