自定义中间件导致重复的过滤器过滤掉所有请求

时间:2020-09-07 08:20:02

标签: scrapy

我已经制作了一个像这样的简单中间件(我删除了所有实际的逻辑以掩盖可能的错误)

class ApiMiddleware:

    def process_request(self, request, *args, **kwargs):
        return request

我已经在这样的设置中注册,我尝试将整数更改为各种数字,以查看它是否以与另一个中间件相冲突的有序触发,但是我得到了相同的结果:

DOWNLOADER_MIDDLEWARES = {
    'py_scrape.middleware.ApiMiddleware': 543,
}

已成功检测到中间件,但由于某种原因DUP_FILTER认为所有请求都是重复的,即使第一个请求也是重复的,这应该是不可能的。

日志:

2020-09-07 10:15:04 [scrapy.core.engine] INFO: Spider opened
2020-09-07 10:15:04 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2020-09-07 10:15:04 [scrapy.extensions.telnet] INFO: Telnet console listening on 127.0.0.1:6023
2020-09-07 10:15:04 [scrapy.dupefilters] DEBUG: Filtered duplicate request: <GET [url is here]> (referer: None)
2020-09-07 10:15:04 [scrapy.core.engine] INFO: Closing spider (finished)
2020-09-07 10:15:04 [scrapy.statscollectors] INFO: Dumping Scrapy stats:

编辑

我已经阅读了更多文档,我认为这是正在发生的事情:

  1. 我的中间件已运行。返回带有新网址的请求。
  2. Dup_filter将此请求添加到可见的网址中。
  3. 自从中间件中返回请求以来,我的中间件再次运行。
  4. 再次检查Dup_filter,由于该URL位于可见URL中,因此它返回True。

虽然找不到解决办法。

1 个答案:

答案 0 :(得分:0)

解决了它,也许不是最好的解决方案,但是它可以工作。代码,如果其他人遇到相同的问题:

class ApiMiddleware:
    def process_request(self, request, spider):
        if request.meta.get('applied'):
            return None
        new_meta = request.meta
        new_meta['applied'] = True
        request = request.replace(
            url='<new formated url here>',
           meta=new_meta)
        return request
相关问题