多级解析模式以避免重复

时间:2014-12-07 10:41:47

标签: python scrapy

我正在浏览电子零售店的类别。通常,我会按照类别链接访问该类别中的产品列表。但是有些类别有其他子类别,所以我有一个额外的解析方法来检查是否是这种情况。

要表示问题,解析会产生一个请求,该请求由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,但听起来更像是一个补丁。是否有一个好的或可接受的方法来避免这个问题?我认为它必须是一种常见的模式。

2 个答案:

答案 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 =允许重复的数量