scrapy抓取项目,如何处理duplicate request的问题?
发布于 作者:苏南大叔 来源:程序如此灵动~ 我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...
scrapy
抓取项目,因为是一个循环抓取的过程,期间会处理不同的url
地址。那么,就如500
状态码会阻止代码运行一样,重复的url
也会阻止代码的继续执行,这简直不要太不合情理。
大家好,这里苏南大叔的“程序如此灵动”博客。本文讲述scrapy
由于访问地址重复导致的异常问题的处理方案。本文测试环境:win10
,python@3.6.8
,scrapy@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)
就是说:下一条页面的匹配逻辑,一般存在于蜘蛛逻辑页面的parse()
函数的最后一句。这里,对于这个最后一句的yield
中,传入新的参数dont_filter
,值是True
。
这样处理之后,再次运行example
蜘蛛的时候,就不会因为页面逻辑重复的问题进行处理了。
相关链接
总结
本文中,解决了scrapy
报错重复的请求的问题,解决方案就是在parse()
函数中的最后一个yield
,也就是新的请求开始时,增加一个dont_filter=True
参数,即可。
如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。