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

Scrapy循环内Request响应仅返回单个值问题求助

解决Scrapy循环请求仅返回单个值的问题

看起来你遇到了Scrapy里对象引用共享导致的经典问题——所有请求都在复用同一个item实例,最终只有最后一次请求的数据被保留下来。下面是具体的问题分析和修复方案:

问题根源

你的代码中,循环里每次传递给meta的都是同一个item对象(传递的是引用而非副本)。当后续的seller_information回调修改item['seller_name']时,会直接覆盖之前请求对该字段的赋值,所以最后你只能看到最后一次请求的结果。

修复方案

我们需要在循环中为每个请求创建独立的item副本,确保每个请求的回调操作的是不同的实例。可以用Python的copy.deepcopy()来实现深拷贝:

步骤1:导入copy模块

在你的爬虫文件顶部添加:

import copy

步骤2:修改循环逻辑,传递item副本

把循环部分的代码修改为:

for sel in name:
    self.counter += 1
    # 为当前请求创建item的深拷贝,避免引用共享
    item_copy = copy.deepcopy(item)
    sel_url = "https://www.amazon.co.uk" + sel
    request = scrapy.Request(
        sel_url, 
        callback=self.seller_information, 
        meta={'item': item_copy}, 
        dont_filter=True
    )
    yield request

步骤3:优化回调中的数据提取(可选但推荐)

你的extract()方法返回的是列表,如果只需要单个卖家名称,建议用extract_first()并设置默认值,避免返回空列表影响后续数据处理:

def seller_information(self, response):
    item = response.request.meta['item']
    # 提取单个文本值,默认空字符串处理无结果的情况
    item['seller_name'] = response.xpath('//h1[contains(@id , "sellerName")]/text()').extract_first(default='')
    yield item

额外检查点

  • 确认name列表确实包含多个有效的URL路径(可以打印len(name)验证)
  • 如果你的请求URL都是唯一的,可以去掉dont_filter=True,避免不必要的重复请求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:19:00