scrapy抓取项目,因为是一个循环抓取的过程,期间会处理不同的url地址。那么,就如500状态码会阻止代码运行一样,重复的url也会阻止代码的继续执行,这简直不要太不合情理。

苏南大叔:scrapy抓取项目,如何处理duplicate request的问题? - scrapy重复的请求
scrapy抓取项目,如何处理duplicate request的问题?(图2-1)

大家好,这里苏南大叔的“程序如此灵动”博客。本文讲述scrapy由于访问地址重复导致的异常问题的处理方案。本文测试环境:win10python@3.6.8scrapy@2.5.1

症状描述

其实说苏南大叔的代码里面,写的逻辑有问题,导致地址重复,这个确实是有些冤枉。不过,确实发生了Filtered duplicate request的错误提示。报错如下:

[scrapy.dupefilters] DEBUG: Filtered duplicate request: <GET https://> - no more duplicates will be shown (see DUPEFILTER_DEBUG to show all duplicates)

其实,事情是这样的。在重复访问页面地址的时候,一些地址发生了301跳转,并且跳转到的地址都是同一个。就这样,本来不同的链接地址,变成了同样的重复地址,继而引发了Filtered duplicate request的错误提示。

解决方案

解决方案就是对于处理下一条页面(next_page)请求的时候,主动传入新参数dont_filter=True。代码范例如下:
spiders/example.py:

def parse(self, response):
  #...
  if (found):
    yield {"result":"ok"}
  #...
  yield response.follow('http://target/'+ str(self.i) +'.html', self.parse, dont_filter=True)

苏南大叔:scrapy抓取项目,如何处理duplicate request的问题? - dont-filter
scrapy抓取项目,如何处理duplicate request的问题?(图2-2)

就是说:下一条页面的匹配逻辑,一般存在于蜘蛛逻辑页面的parse()函数的最后一句。这里,对于这个最后一句的yield中,传入新的参数dont_filter,值是True

这样处理之后,再次运行example蜘蛛的时候,就不会因为页面逻辑重复的问题进行处理了。

相关链接

总结

本文中,解决了scrapy报错重复的请求的问题,解决方案就是在parse()函数中的最后一个yield,也就是新的请求开始时,增加一个dont_filter=True参数,即可。

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。