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

时间:2017-08-27 15:38:09

标签: python scrapy recaptcha

根据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"

启动后立即打印"没有元"

1 个答案:

答案 0 :(得分:2)

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

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

对不起,死灵了,但是我有同样的问题并找到了答案。