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

Scrapy多页面数据合并异常:无法获取usage值,请求对象错误赋值

Scrapy多页面数据抓取问题:usage字段显示Request对象&多页面数据合并方案

问题原因

你在代码里犯了两个关键错误:

  • 首先你已经通过response.xpath("sompath").get().strip()正确获取了usage值,但紧接着又把scrapy.Request对象赋值给了item['usage'],直接覆盖了之前的正确结果,所以控制台输出的是Request对象的字符串形式<GET ...>。
  • 其次parse_storage函数直接返回字符串,但Scrapy无法自动将这个字符串关联到之前的Item上,而且你也没有把已填充部分字段的Item传递到这个回调函数中。

解决方法

要实现多页面数据合并到同一个Item,核心逻辑是把已填充部分字段的Item通过Request的meta参数传递给下一个回调函数,在后续回调里继续填充剩余字段,最后统一输出完整的Item。

修改后的代码示例:

def parse_item(self, response):
    links = response.xpath('somepath')
    for link in links:
        name = link.xpath('text()').get()
        href = 'mydomain' + link.xpath('@href').get()
        # 把title传递给下一个回调
        yield scrapy.Request(href, callback=self.parse_info, meta={"title": name})

def parse_info(self, response):
    item = MyItem()
    item["title"] = response.request.meta['title']
    # 正确获取usage,不再被覆盖
    item['usage'] = response.xpath("sompath").get().strip()
    
    storagelink = response.xpath("somepath/@href").get()
    # 把已填充部分字段的item放到meta里,传递给parse_storage
    yield scrapy.Request(storagelink, callback=self.parse_storage, meta={"item": item})

def parse_storage(self, response):
    # 从meta里取出之前的item
    item = response.request.meta['item']
    # 填充storage字段
    item['storage'] = response.xpath("somepath/text()").get().strip()
    # 返回完整的item
    yield item

关键改动说明

  1. 取消了对item['usage']的重复赋值,确保该字段存储的是页面抓取到的文本值。
  2. 在parse_info中不再直接返回Item,而是将已填充部分字段的Item存入meta,通过yield scrapy.Request传递给parse_storage。
  3. 在parse_storage中取出传递过来的Item,填充storage字段后,再输出完整的Item。

内容的提问来源于stack exchange,提问作者user2155362

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 05:35:28