访问二次Web请求返回数据时遇TypeError: 'Request' object is not subscriptable问题咨询
解决Scrapy中TypeError: 'Request' object is not subscriptable的问题
这个问题我之前帮不少开发者解决过,核心原因其实是你搞混了Scrapy里Request和Response对象的角色——咱们一步步拆解:
错误根源
Request对象是用来发送请求的载体,它本身不包含服务器返回的响应数据,自然不能通过下标(比如request['xxx'])来访问数据。你能在MyItem里看到数据,是因为当你yield请求后,Scrapy会执行请求的回调函数,在回调里你处理了服务器返回的Response对象,并把数据存入了item。
正确的处理流程
下面用代码示例展示二次请求的正确写法,对比错误操作:
错误示例(触发你的报错)
def parse(self, response): # 创建二次请求 second_req = scrapy.Request(url="https://example.com/second", callback=self.parse_second) # 错误:试图从Request对象中取数据,Request不可下标访问 item = MyItem() item['data'] = second_req['target_data'] yield item
正确示例(获取二次请求的响应数据)
import scrapy from your_project.items import MyItem class MySpider(scrapy.Spider): name = "my_spider" start_urls = ["https://example.com/first"] def parse(self, response): # 初始化item,如果需要传递到回调函数,用meta参数 item = MyItem() # 发送二次请求,把item存入meta中传递 yield scrapy.Request( url="https://example.com/second", callback=self.parse_second, meta={"current_item": item} ) def parse_second(self, response): # 从response.meta中取出之前传递的item item = response.meta["current_item"] # 处理二次请求的响应数据: # 如果是JSON响应,先转成字典 response_data = response.json() # 从响应数据中提取字段存入item item['target_field'] = response_data['desired_key'] # 最后yield item,就能在管道或输出中看到数据了 yield item
关键注意点
- 永远在回调函数中处理
Response对象,响应数据只存在于Response里(比如response.text、response.json()) - 如果需要在请求间传递数据(比如item),用
Request的meta参数,在回调里通过response.meta取出 - 不要试图直接操作
Request对象来获取响应数据,它只是请求的“快递单”,不是“快递包裹”
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

