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
相关产品推荐
相关产品推荐

