Pythonでスクレイピング するLambda関数を作る〜Lambda編〜

前回のPython編で作成したscraping-sample.zipをLambdaにデプロイし、Lambda関数として実行できるようにします。
Lambda関数の作成
マネジメントコンソールでLambda関数を作成します。
※本当はこれもCLIでやりたかったけど既存のIAM RoleをARNで指定する必要があって面倒なのでやめました。
関数名をscraping-sample、ランタイムをPython 3.7として、関数を作成します。
デプロイパッケージのアップロード
AWS CLIでscraping-sample.zipをLambdaにアップロードします。
※AWS CLIがインストールされていること、およびaws configreでAccess Key ID,Secret Access Key,region nameが設定されていることが前提となります。まだ、AWS CLIに入門していない方はLambdaの画面からもアップロードできるのでそっちでも良いかと。
–function-name 上で作成したLambda関数の名前を指定
–zip-file fileb://[アップロードするzipファイルの相対パス]を指定
aws lambda update-function-code --function-name scraping-sample --zip-file fileb://scraping-sample.zip
{
"TracingConfig": {
"Mode": "PassThrough"
},
"CodeSha256": "Y1oVBgl3iXBRGKgn4skzRj2eC1vApFsaWMtmy8J3J/g=",
"FunctionName": "scraping-sample",
"CodeSize": 1154367,
"RevisionId": "701c4838-8113-4a03-888e-54eea654d86d",
"MemorySize": 128,
"FunctionArn": "arn:aws:lambda:ap-northeast-1:XXXXXXXXXXXX:function:scraping-sample",
"Version": "$LATEST",
"Role": "arn:aws:iam::xxxxxxxxxxxx:role/service-role/scraping-sample-role-givvyn8l",
"Timeout": 3,
"LastModified": "2019-10-19T14:43:23.250+0000",
"Handler": "lambda_function.lambda_handler",
"Runtime": "python3.7",
"Description": ""
}
zipがLambda関数に展開できたことを確認する
Lambdaで動作するように修正
引数の受け渡しをLambdaのイベントハンドラ経由で行うようにし、また戻り値をjson型にします。
せっかくjsonで返すので、titleタグとpタグは別々の変数に入れて返すようにします。
import requests
from bs4 import BeautifulSoup
import json
def lambda_handler(event, context):
url = event["url"]
html = requests.get(url)
soup = BeautifulSoup(html.text,'html.parser')
title = soup.title.string
text_body = []
for i in soup.find_all('p'):
text_body.append(i.get_text(strip=True))
page = {
"title": title,
"text_body": text_body
}
return page
ちゃんと動くか確認
URLを渡すテストイベントを作成します。
テストを実行してログを確認してみましょう
うまくできました。
ただ、所要時間は1207.06 msということで思ってたより重い処理でした。
改善の余地があるかもしれません。
おしまい。