Scrapy - 过滤重复请求

use*_*629 3 python scrapy

我正在和scrapy一起工作.我想遍历db表并获取每个scrape(random_form_page)的起始页面,然后为每个起始页面生成一个请求.请注意,我正在使用api来获取初始请求的代理.我想设置每个请求以拥有自己的代理,所以使用我有的回调模型:

def start_requests(self):
    for x in xrange(8): 
        random_form_page = session.query(....

        PR = Request(
            'htp://my-api',
            headers=self.headers,
            meta={'newrequest': Request(random_form_page,  headers=self.headers)},
            callback=self.parse_PR
        )
        yield PR
Run Code Online (Sandbox Code Playgroud)

我注意到:

[scrapy] DEBUG: Filtered duplicate request: <GET 'htp://my-api'> - no more duplicates will be shown (see DUPEFILTER_DEBUG to show all duplicates)
Run Code Online (Sandbox Code Playgroud)

在我的代码中,我可以看到虽然它循环了8次,但它只产生对第一页的请求.我假设的其他人被过滤掉了.我查看了http://doc.scrapy.org/en/latest/topics/settings.html#dupefilter-class,但仍然不确定如何关闭此过滤操作.如何关闭过滤功能?

MrP*_*dav 13

使用

请求对象中的dont_filter = True

def start_requests(self):
    for x in xrange(8): 
        random_form_page = session.query(....

        PR = Request(
            'htp://my-api',
            headers=self.headers,
            meta={'newrequest': Request(random_form_page,  headers=self.headers)},
            callback=self.parse_PR,
            dont_filter = True
        )
        yield PR
Run Code Online (Sandbox Code Playgroud)


Don*_*ons 5

当您访问API时,您最有可能想要完全禁用重复过滤器:

# settings.py
DUPEFILTER_CLASS = 'scrapy.dupefilters.BaseDupeFilter'
Run Code Online (Sandbox Code Playgroud)

这样您就不必混淆所有的Request创建代码dont_filter=True.

  • 谢谢!这有效。虽然“dont_filter=True”可能是一个更好的主意。根据https://docs.scrapy.org/en/latest/topics/settings.html#dupefilter-class (2认同)