在下载器中间件中使用元属性
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.meta
或 response.request.meta
,这会通过下载两端的所有中间件传播到蜘蛛。
抱歉死灵,但我有同样的问题并找到了答案。
根据 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.meta
或 response.request.meta
,这会通过下载两端的所有中间件传播到蜘蛛。
抱歉死灵,但我有同样的问题并找到了答案。