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

Scrapy中如何向parse_item方法传递自定义变量?

解决方案

报错原因

TypeError: init() got an unexpected keyword argument 'sku'

该报错是因为scrapy.Request的构造方法没有内置sku参数,不支持直接传入自定义业务参数,所有需要传递给回调函数的额外变量必须通过Scrapy提供的专用参数携带。

推荐解决方法(Scrapy 1.7及以上版本)

使用官方提供的cb_kwargs参数传递自定义参数,它会将字典内的键值对自动作为形参传递给回调函数:

修改后的start_requests代码

def start_requests(self):
    for sku in self.SKUs:
        url = 'https://www.test' + sku
        if validators.url(url):
            yield scrapy.Request(
                url=url,
                cb_kwargs={'sku': sku},
                callback=self.parse_item,
            )
        else:
            print("Invalid URL ", format(url))

修改后的parse_item代码

def parse_item(self, response, sku):
    # sku参数会直接从cb_kwargs中注入到方法形参
    shop['sku'] = sku

兼容旧版本的解决方法

如果使用的Scrapy版本低于1.7,可以用meta参数传递:

修改后的start_requests代码

def start_requests(self):
    for sku in self.SKUs:
        url = 'https://www.test' + sku
        if validators.url(url):
            yield scrapy.Request(
                url=url,
                meta={'sku': sku},
                callback=self.parse_item,
            )
        else:
            print("Invalid URL ", format(url))

修改后的parse_item代码

def parse_item(self, response):
    # 从response的meta属性中取出传递的sku
    shop['sku'] = response.meta['sku']

两种方法的区别:cb_kwargs是专门用于传递回调函数自定义参数的接口,代码可读性更高;meta除了传自定义参数外,还可以传递Scrapy内置的特殊控制参数(比如代理、下载延迟配置等),如果仅传递业务参数优先使用cb_kwargs。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 12:27:03