scrapy中推荐用cb_kwargs传参(1.7+),键名须与回调函数形参严格一致;兼容旧版可用meta字典透传item或变量;lambda包装虽灵活但易因闭包导致参数绑定错误。

在Scrapy中,当需要把parse函数里提取的字段(比如章节序号、页面标题、来源URL)完整带到后续解析函数中,又不希望数据丢失或错乱,就必须用可靠方式把参数传进回调函数。
用 cb_kwargs 直接传入命名参数(推荐,Scrapy 1.7+)
这是目前最清晰、最安全的方式,参数名和回调函数形参严格对应,无需手动解包,也不会污染 meta。
第一步:在 yield scrapy.Request 时,用 cb_kwargs 参数传入一个字典。
第二步:回调函数定义时,在 response 后面直接列出字典里的 key 作为形参,Scrapy 自动注入值。
第三步:调用 yield 返回 item 或新请求,参数已就位,可直接使用。
这一步必须确保 cb_kwargs 中的键名与回调函数的参数名完全一致,否则会报 TypeError: parse_detail() missing 1 required positional argument。
用 meta 字典携带数据(兼容旧版本,仍广泛使用)
meta 是 Scrapy Request 的内置属性,本质是 dict,用于在请求-响应链中透传任意数据,尤其适合传递 item 实例或上下文信息。
方法一:传整个 item 对象
在 parse 中创建 item → 填充部分字段 → 将 item 封装进 meta={'item': item} → 发起请求。
在回调函数中,通过 response.meta['item'] 取出该 item 实例,继续填充其他字段后 yield。
【注意:meta 只接受字典类型,不能直接写 meta=item】
方法二:传原始变量(如日期、ID、分类名)
yield scrapy.Request(url, callback=self.parse_detail, meta={'date': '2026-08-18', 'category': 'news'})
def parse_detail(self, response): date = response.meta['date']; category = response.meta['category']
用 lambda 匿名函数包装回调(灵活但易出错)
这种方法绕过 Scrapy 默认的回调签名约束,把 response 和自定义参数一起塞给目标函数,适合临时调试或特殊逻辑。
yield scrapy.Request(url, callback=lambda r, it=item: self.parse_item(r, it))
这行代码里,lambda 接收两个参数:r(自动填入的 response)和 it(当前循环中的 item 实例),然后转发给 parse_item。
【关键陷阱:it=item 必须在 lambda 定义时就绑定值,否则 for 循环结束后 it 总是指向最后一个 item】
def parse_item(self, response, item): item['title'] = response.css('h1::text').get(); yield item











