You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

访问二次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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:40:31