ページネートのリソースを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"},
...
]

使ってはないが参考にしたページ


探索が二次元になるので、記載の仕組みを用いてより深層へスクレイピングする場合は計算量と相談。