scrapy跨页面传递数据必须通过meta参数传递item字典,需注意meta只接受字典类型;多请求并发时须用deepcopy防覆盖;可混合传递原始值、item和状态标记;三级页面链路需逐层透传,缺一不可。

在Scrapy中跨页面传递标题、价格、链接等结构化数据时,必须用meta参数把上一响应中提取的item安全带到下一响应里,否则parse2函数根本拿不到列表页已解析出的字段。
基础写法:单个item字典传递
第一步:在parse中构造item并赋值,例如title和url;
第二步:调用scrapy.Request时,将item塞进meta字典,键名自定义(如'item');
第三步:在回调函数(如parse_detail)中,通过response.meta['item']取出该字典。
这一步操作起来很简单,直接把item作为value放进meta就行,但注意【meta只接受字典类型,传list或str会报错】。
防覆盖写法:用deepcopy避免异步污染
方法一:当循环yield多个Request且都携带同一个item变量时,必须对item做深度拷贝;
方法二:导入copy模块,在yield前写item_copy = deepcopy(item),再把item_copy传入meta;
方法三:不deepcopy会导致所有回调函数共用同一内存地址的item,最终所有条目内容完全一致。
这是Scrapy异步机制带来的典型陷阱——parse函数可能还没执行完,多个Request已并发发出,它们共享原始item对象。不加deepcopy,后发出的请求会覆盖先发出的字段值。
多字段混合传递:传原始值+传item+传状态标记
在meta中可以同时塞入多种类型的数据,只要它们是可序列化的:比如response.meta.get('page_num', 1)取当前页码,默认为1;response.meta['title']直接取标题字符串;response.meta['item']取完整item对象。
注意:如果某个key不确定是否存在,务必用get()带默认值,否则response.meta['missing_key']会直接抛KeyError中断整个爬虫。
实战翻页链路:列表页→详情页→图片页三级传递
① 列表页parse中提取title、urlA → yield scrapy.Request(urlA, meta={'title': title, 'stage': 'detail'});
② 详情页parse_detail中提取content、urlB → yield scrapy.Request(urlB, meta={'title': response.meta['title'], 'content': content, 'stage': 'image'});
③ 图片页parse_image中提取img_url → 构造最终item,把title、content、img_url全填进去并yield。
这种三级嵌套必须靠meta逐层透传,缺一层就会断链。中间任意一级漏传title,最终item里就永远缺失这个字段。











