在下载器中间件中使用元属性

Using meta attribute inside a downloader middleware

根据 Scrapy 文档,不能在下载器中间件中使用 response.request,因为请求对象只有在通过所有其他下载器中间件后才会附加到响应。虽然我注意到在重定向(到验证码页面)的情况下,下载器中间件内的响应不仅有空 request 字段 - 而且还有空元(pycharm 调试器告诉我响应不相关有任何要求)。我如何强制 Scrapy 在下载器中间件中处理时保留元数据?我已将 meta=response.meta 放入每个请求,但仍然收到有关缺少元键的错误 - 以及缺少元属性。

    def start_requests(self):

        for value in values::
            yield Request(
                self.SEARCH_URL,
                                ),
                meta={'ssomekey': value},
            )

来自下载器中间件:

    def process_response(self, request, response, spider):

        if not hasattr(response, 'meta'):
            print "there is no meta"

启动后立即打印 "there is no meta"

请求对象可用作下载器中间件 process_response 方法的参数,而不仅仅是 process_request。就像 @paul-trmrth 建议的那样,使用 request.meta 而不是 response.metaresponse.request.meta,这会通过下载两端的所有中间件传播到蜘蛛。

https://docs.scrapy.org/en/latest/topics/downloader-middleware.html#scrapy.downloadermiddlewares.DownloaderMiddleware.process_response

抱歉死灵,但我有同样的问题并找到了答案。