Lambda×Scrapy(構築手順)
Lambda 関数を採用するケース(軽量・リアルタイム)
- データサイズ:XXMB程度
- 実行:軽量な処理
- トリガー:イベント駆動処理(API Gateway や S3 など)
- ランタイム:最大15分以内
- ライブラリ:Lamdaレイヤーを作成する(Docker)
○事例(Lambda×Scrapy)
- 定期実行(毎日, 毎週)
- 毎日相当分だけのスクレイピングを実行する
×事例(Lambda×Scrapy)
- スクレイピングが1回で済む
- スクレイピング実行ごとに膨大な処理時間を費やす
- ブラウザ処理のためにメモリ使用量が大きい場合
Lambda レイヤー作成関数(Docker-compose.yml)
AWS Lambda では、scrapy ライブラリはデフォルトで提供されていないため、これらのライブラリを利用する場合には、Lambda レイヤーを各自で作成し、関数に追加する必要がある。本記事では、ローカルPC環境を壊さないDockerコンテナを利用して Lambdaレイヤーを作成する。docker-compose.yml にまとめてコーディングしたメモです。
#ディレクトリ構造#
amazonlinux
- Mount_Directory # マウント先ディレクトリ(任意名)
- docker-compose.yml # コード実行($'docker-compopse up --build')
#Lamda レイヤー(#Scrapy)
# 採用バージョン(#2025年6月):Python(3.11), Scrapy(2.12.0)
services:
build-layer:
image: public.ecr.aws/lambda/python:3.11 # AWS公式イメージを利用すること
container_name: lambda-layer-builder
volumes:
- ./Mount_Directory:/lambda-layer
working_dir: /lambda-layer
entrypoint: ["/bin/sh", "-c"]
command: |
"yum install -y gcc make autoconf libtool python3-devel zip && \
pip3 install --upgrade pip && \
pip3 install Scrapy==2.12.0 --no-cache-dir -t /lambda-layer/python && \
cd /lambda-layer && \
zip -r9 py3.11_scrapy.zip python"
tty: true
「docker-compose up --build」コマンドを実行すると、マウント先ディレクトリに「py3.11_scrapy.zip python」ZIPファイルが作成される。このZIPファイルを利用することで Lambda×Scrapy実行環境を準備することができる。
#Lamdaレイヤー基本手順
- Scrapyを含むZIPファイルが50MBを超える場合、AWS S3 にアップロードする
- AWS画面:[Lambda]→[その他のリソース/レイヤー]→「レイヤーを作成」
- 作成済みZIPファイルをレイヤー設定に適用する。
- Pythonスクリプトを実行する場合、アーキテクチャ(x86_64)&ランタイム(Python3.XX)
#Scrapyスクリプト作成手順
# このようなScrapyスクリプトを作成済みと仮定する
myspider/
├── myspider/
├── __init__.py
├── items.py
├── middlewares.py
├── pipelines.py
├── settings.py
└── spiders/ # ディレクトリ(スパイダー)
├── __init__.py
└── developed_scraper.py # ファイル(スパイダー)
├── scrapy.cfg
├── lambda_function.py # Lambda専用関数
- Scrapy作成済みディレクトリに移動する (cd myspider)
- Lambda専用関数を別途作成する (
lambda_function.py
) - ScrapyスクリプトをZIPファイル化する ( zip -r myspider.zip . )
- 作成済みZIPファイルをlambda関数にアップロードする ※「アップロード」→「zipファイル」
lambda_function.py(起動コーディング例)
import logging
from xxxxx.spiders.xxxxx import xxxxxSpider # 各自Scrapyスクリプトに合わせる
from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings
def lambda_handler(event, context):
logging.basicConfig(level=logging.INFO)
logging.info('OpenloadSpiderのクロールを開始します')
# Scrapy:出力ファイル設定内容
settings = get_project_settings()
settings.set('FEEDS', {
local_path: {
'format': 'json',
'encoding': 'utf8',
'overwrite': True,
'ensure_ascii': False,
}
})
process = CrawlerProcess(settings)
process.crawl(xxxxxSpider)
process.start()
logging.info('//クロールが終了しました//')
この関数内容を修正して、スクレイピング結果をS3に保存することもできる。
コメント(一覧)