Scrapy - 如何避免分页黑洞?
Scrapy - How to avoid Pagination Blackhole?
我最近在研究一个网站蜘蛛,发现它请求的页面数量是无限的,因为一个网站没有将它们的分页代码编码为永远停止。
所以虽然他们只有几页内容,但它仍然会生成下一个 link 和一个 url ...?page=400, ...?page=401,等等
内容没有改变,只是URL。当内容停止变化时,有没有办法让 Scrapy 停止跟随分页?或者我可以编写自定义代码的东西。
如果内容没有变化,您可以将当前页面的内容与上一页的内容进行比较,如果相同,则停止抓取。
例如:
def parse(self, response):
product_urls = response.xpath("//a/@href").extract()
# check last page
if response.meta.get('prev_urls') == product_urls:
logging.info('reached the last page at: {}'.format(response.url))
return # reached the last page
# crawl products
for url in product_urls:
yield Request(url, self.parse_product)
# create next page url
next_page = response.meta.get('page', 0) + 1
next_url = re.sub('page=\d+', 'page={}'.format(next_page), response.url)
# now for the next page carry some data in meta
yield Request(next_url,
meta={'prev_urls': product_urls,
'page': next_page}
我最近在研究一个网站蜘蛛,发现它请求的页面数量是无限的,因为一个网站没有将它们的分页代码编码为永远停止。
所以虽然他们只有几页内容,但它仍然会生成下一个 link 和一个 url ...?page=400, ...?page=401,等等
内容没有改变,只是URL。当内容停止变化时,有没有办法让 Scrapy 停止跟随分页?或者我可以编写自定义代码的东西。
如果内容没有变化,您可以将当前页面的内容与上一页的内容进行比较,如果相同,则停止抓取。
例如:
def parse(self, response):
product_urls = response.xpath("//a/@href").extract()
# check last page
if response.meta.get('prev_urls') == product_urls:
logging.info('reached the last page at: {}'.format(response.url))
return # reached the last page
# crawl products
for url in product_urls:
yield Request(url, self.parse_product)
# create next page url
next_page = response.meta.get('page', 0) + 1
next_url = re.sub('page=\d+', 'page={}'.format(next_page), response.url)
# now for the next page carry some data in meta
yield Request(next_url,
meta={'prev_urls': product_urls,
'page': next_page}