当使用DownloaderMiddle软件处理第一个请求时,Scrapy似乎正在对其进行重复数据消除

2024-04-25 23:51:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个从SitemapSpider继承的蜘蛛。正如所料,启动时的第一个请求是sitemap.xml我的网站。但是,为了让它正常工作,我需要为所有请求添加一个头,包括获取站点地图的初始请求。我使用DownloaderMiddle软件这样做,如下所示:

def process_request(self, request: scrapy.http.Request, spider):
    if "Host" in request.headers:
        return None

    host = request.url.removeprefix("https://").removeprefix("http://").split("/")[0]
    request.headers["Host"] = host
    spider.logger.info(f"Got {request}")
    return request

但是,看起来Scrapy的请求重复数据消除程序正在阻止该请求通过。在我的日志中,我看到如下内容:

2021-10-16 21:21:08 [ficbook-spider] INFO: Got <GET https://mywebsite.com/sitemap.xml>
2021-10-16 21:21:08 [scrapy.dupefilters] DEBUG: Filtered duplicate request: <GET https://mywebsite.com/sitemap.xml> 

由于process_request中的spider.logger.info只触发一次,因此我假定这是第一个请求,并且在处理之后,它会被消除重复数据。我认为,可能是在下载ermiddle软件之前触发了重复数据消除(这可以解释请求是在日志中没有第二个“get…”的情况下进行重复数据消除的),但是,我认为这不是真的,原因有两个:

  • 我查看了SitemapSpider的代码,它似乎只获取了一次sitemap.xml
  • 事实上,如果它在之前抓取了它,我希望它能做些什么——相反,它只是停止爬行器,因为没有页面排队等待处理

为什么会发生这种情况?我在{中犯了什么错误吗


Tags: 数据httpshttphostreturn软件requestxml
1条回答
网友
1楼 · 发布于 2024-04-25 23:51:04

它不会处理第一个响应,也不会获取第二个响应,因为您正在从正在筛选的自定义DownloaderMiddleware process_request函数返回新请求。从文档中:

If it returns a Request object, Scrapy will stop calling process_request methods and reschedule the returned request. Once the newly returned request is performed, the appropriate middleware chain will be called on the downloaded response.

如果您明确地说不要过滤第二个请求,那么它可能会起作用

def process_request(self, request: scrapy.http.Request, spider):
    if "Host" in request.headers:
        return None

    host = request.url.removeprefix("https://").removeprefix("http://").split("/")[0]
    new_req = request.replace(dont_filter=True)
    new_req.headers["Host"] = host
    spider.logger.info(f"Got {new_req}")
    return new_req

相关问题 更多 >