我正在浏览电子零售店的类别。通常,我会按照类别链接访问该类别中的产品列表。但是有些类别有其他子类别,所以我有一个额外的解析方法来检查是否是这种情况。
要表示问题,解析会产生一个请求,该请求由parse_second回调检查。如果对parse_second的响应是一个类别页面,它会在产生解析第三个请求之前做一些额外的处理,否则它只是将响应转发给parse_third。
def parse(self, response):
...
yield Request(some_url, callback=self.parse_second)
def parse_second(self, response):
...
#check if category page or listing page
if is_category_page:
#do some processing to get new_url
yield Request(new_url, callback=self.parse_third)
else:
#just forward the previous request to a new callback
yield Request(response.url, callback=self.parse_third)
def parse_third(self, response):
...
因此,许多请求未在parse_third
中处理,因为它们是重复的,即它们已被parse_second
回调抓取。
我相信我可以在Request对象中设置param dont_filter=True
,但听起来更像是一个补丁。是否有一个好的或可接受的方法来避免这个问题?我认为它必须是一种常见的模式。
答案 0 :(得分:1)
您可以直接拨打parse_xxx()
而不是yield Request()
:
def parse(self, response):
...
for i in self.parse_second(response):
yield i
答案 1 :(得分:1)
dont_filter = True
是正确的。
甚至查看http://doc.scrapy.org/en/latest/topics/settings.html#dupefilter-class并更改指纹的设置方式,表示是/否这是重复的,这不会解决您的问题。
可能有一个ALLOW_DUPLICATES =允许重复的数量