#想定例
ScrapyのCrawlSpiderを使用して、
アイテム一覧ページ->個々のアイテムの概要ページ->個々のアイテムの詳細ページ、とリンクを辿っていけるサイトをクローリングし、
詳細ページの情報をスクレイピングして保存する場合を想定。
ページとURLの対応関係は下のような感じで。
ページ | URL |
---|---|
アイテム一覧 | example.com/list |
アイテムの概要 | example.com/item/(ID)/ |
アイテムの詳細 | example.com/item/(ID)/details |
こういった構造のサイトの場合、一覧ページから抜き出した、概要ページへのリンクの末尾に、/detailsをつけ加えて、それを使って直接詳細ページにリクエストすることができれば、相手先のサイトへのリクエスト数が半減し、こちらのプログラムの実行にかかる時間も減らせて一石二鳥!
というわけで下記が実装例。
#実装
LinkExtractorの引数process_valueに、URLを加工する処理をラムダ式で記述する。
example.py
class ExampleSpider(CrawlSpider):
name = 'example'
allowed_domains = ['example.com']
start_urls = ['http://example.com/list'] #アイテムの一覧ページ
rules = [
Rule(LinkExtractor(
#/item/を含むURLを抜き出す
allow=r'.*/item/.*',
#抜き出したURLに'details/'を付け加える
process_value= lambda x:x + 'details/'
),callback='parse_details'),
]
#
def parse_details(self, response):
#(省略)
以上!