ページネートのリソースを1ページずつ巡回し、ページにある各々のリンクへ 1 階層潜り込んでスクレイピングする
http://mat5ukawa.hateblo.jp/entry/2018/06/05/002826
より
- 各ページを巡回する
- 巡回ごとに各々のレコード詳細リンクへ 1 階層潜り込む
- 潜り込み先でスクレイピングする
クエリ抽出されたページのレコード探索に利用すれば良いと思う。
import scrapy class Spider(scrapy.Spider): start_urls = ['http://localhost:3000/seeds'] name = 'spider' def parse(self, response): # scrape resource's id id = response.xpath("//div[@id='page_num']/text()").extract_first() yield { 'id' : id } # scrape resource in each link for link in response.xpath("//table/tbody/tr/td[2]/a/@href").extract(): yield scrapy.Request(response.urljoin(link), callback = self._parse_link) # transit to next resource next_page = response.css('a[rel="next"]').xpath("@href").extract_first() if next_page is not None: next_page = response.urljoin(next_page) yield scrapy.Request(next_page, callback = self.parse) def _parse_link(self, response): detail = response.xpath("//p[@id='name']/text()").extract_first() yield { 'detail' : detail }
$ scrapy runspider crawler/main.py -o outfile.json
outfile.json
[ {"id": "page number is 1"}, {"detail": "e8b5202869b74aa1ffd0eadff7c3664f"}, {"detail": "8de50ac9ae0edd7b6d62a84af338186c"}, {"detail": "6f5a8295e6ccb687ceb9c4789f6e63f7"}, {"detail": "cb4e15e1100ae6aed7b2cfea3ce1842b"}, {"id": "page number is 2"}, {"detail": "0e89ba31a9592c3058fe87f5bef28e33"}, {"detail": "eed30fcd7d827f33127375ec44e7748f"}, {"detail": "18b84f501753059fab3cd3402703d2d9"}, {"detail": "dda2c6b55c0aedb84834f8a16aa9d024"}, ... ]
使ってはないが参考にしたページ
探索が二次元になるので、記載の仕組みを用いてより深層へスクレイピングする場合は計算量と相談。