前回ではAWS LambdaでScrapyを動かす設定を行いました。
★関連記事
・AWSのLambdaでScrapyを動かす その1
前回の記事の設定の中ではトリガーなどと実際のクローリングに関連性はありませんでした。
今回は「S3にアップロードしたファイルにクローリングのURLを含める」という動作を行います。
クローリング処理
基本的な設定は前回のままです。
今回、S3にアップロードするファイルは以下のようになります。
1 2 3 4 |
https://developer-collaboration.com/page/2/ https://developer-collaboration.com/page/6/ |
Lambdaにアップロードするデプロイパッケージの「lambda_function.py」は以下のようにします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
import boto3 import urllib.parse import codecs import csv import scrapy from scrapy.crawler import CrawlerProcess class TestSpider(scrapy.Spider): name = 'testspider' def parse(self, response): for quote in response.css('article.post-list'): title = quote.css('h1.entry-title::text').extract_first() url = quote.css('a::attr(href)').extract_first() yield { 'title': title, 'url': url } def lambda_handler(event, context): s3 = boto3.client('s3') input_bucket = event['Records'][0]['s3']['bucket']['name'] input_key = urllib.parse.unquote_plus(event['Records'][0]['s3']['object']['key'], encoding='utf-8') response = s3.get_object(Bucket=input_bucket, Key=input_key) lines = response[u'Body'].read().decode('utf-8').split() start_urls = [] for row in csv.reader(lines): if (row[0]): start_urls.append(row[0]) process = CrawlerProcess({ 'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)', 'FEED_FORMAT': 'json', 'FEED_URI': '/tmp/result.json' }) process.crawl(TestSpider, start_urls=start_urls) process.start() |
S3のファイルをCSVで読み込み「start_urls」という配列にURLを入れています。
ポイントはプロセスで起動しているScrapyに対して「start_urls=start_urls」という引数で値を渡していることです。
Class内の「start_urls = []」は値が初期化されてしまうので外しておきます。
こちらでトリガーを起動させます。
1 2 3 4 |
$ aws s3 sync ../input/ s3://lambda-test01.colabmix.co.jp/input/ --profile=lambda-test upload: ../input/sample.csv to s3://lambda-test01.colabmix.co.jp/input/sample.csv |
こちらでLambdaが起動されるとCloudWatchでログが確認できます。
Webサーバ側のログは以下のように出ていました。
1 2 3 4 |
54.92.122.233 - - [19/Feb/2020:09:10:58 +0900] "GET /page/6/ HTTP/1.1" 200 9068 "-" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)" 54.92.122.233 - - [19/Feb/2020:09:10:58 +0900] "GET /page/2/ HTTP/1.1" 200 9142 "-" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)" |
一度の起動ですので接続元のIPは同じになるようです。
こちらでかなり幅を持たせたLambdaでのクローラーを作ることができるようになりました。
★関連記事
・AWSのLambdaでScrapyを動かす その1
・AWSのLambdaでScrapyを動かす その3 - dynamodbからの取得・保存 -
このブログは株式会社CoLabMixによる技術ブログです。
GCP、AWSなどでのインフラ構築・運用や、クローリング・分析・検索などを主体とした開発を行なっています。
Ruby on RailsやDjango、Pythonなどの開発依頼などお気軽にお声がけください。
開発パートナーを増やしたいという企業と積極的に繋がっていきたいです。