【问题标题】:Scrapy - Stopping crawler when duplicate item encounteredScrapy - 遇到重复项目时停止爬虫
【发布时间】:2019-09-28 18:13:46
【问题描述】:

有很多网站我必须对页面进行硬编码(爬取项目后增加页码),其中一些网站在最后一页之后返回到第 1 页。例如,如果一个网站有 25 页的项目,则向第 26 页发送请求会产生第一页的响应。

此时 Scrapy 的重复过滤器工作正常并且不会抓取项目,但爬虫会继续运行。当像这样触发重复过滤器时,有什么方法可以停止抓取过程?

我不想像这样硬编码页码,因为它会随着时间而改变。

if self.page < 25:
    yield scrapy.Request(...)

【问题讨论】:

  • 只需设置一个全局变量并让您的回调提前返回
  • @pguardiario 但是设置一个全局变量来跟踪什么?
  • 跟踪什么时候应该停止。

标签: python web-scraping scrapy web-crawler


【解决方案1】:
  1. 配置您的请求不被重复过滤器过滤掉(在请求构造函数中添加dont_filter=True

  2. response.url意外成为首页的URL时,使用请求回调停止爬虫(raise scrapy.exceptions.CloseSpider

【讨论】:

  • 很好的解决方案,但在这种情况下不起作用,因为页面的 url 一直在增加,但响应属于第 1 页。
  • 通常您可以在request.meta 中发送预期的页面,从response 中提取当前页面,当它们不匹配时假设您在我的回答中的第2 步。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 2019-06-24
  • 1970-01-01
  • 1970-01-01
  • 2016-11-09
相关资源
最近更新 更多