Scrapy 的 `ItemLoaders` 是一个用于简化数据提取与清洗过程的工具,它提供了一种声明式、可复用的方式来加载和预处理爬取到的数据
Scrapy 的ItemLoaders是一个用于简化数据提取与清洗过程的工具它提供了一种声明式、可复用的方式来加载和预处理爬取到的数据即填充Item对象。相比直接手动赋值ItemLoader支持输入/输出处理器Input/Output Processors自动对原始字段值进行清洗如去空格、HTML 去标签、类型转换等字段级处理逻辑每个字段可独立配置处理器继承与复用可通过继承自定义通用 loader 类支持延迟加载与多值处理如add_xpath()、add_css()、add_value()等方法自动合并重复值默认使用TakeFirst()或Join()等输出处理器。典型用法示例fromscrapy.loaderimportItemLoaderfromscrapy.loader.processorsimportTakeFirst,MapCompose,Joinfrommyproject.itemsimportProductItemclassProductLoader(ItemLoader):default_input_processorMapCompose(str.strip)default_output_processorTakeFirst()description_inMapCompose(lambdax:x.replace(\n, ).strip())price_inMapCompose(lambdax:x.replace($,).replace(,,))price_outMapCompose(float)# 在 Spider 中使用loaderProductLoader(itemProductItem(),responseresponse)loader.add_css(name,h1::text)loader.add_xpath(price,//span[classprice]/text())loader.add_value(url,response.url)itemloader.load_item()注意ItemLoader本身不替代Item而是作为Item的“工厂”和“清洗流水线”最终仍需返回一个Item实例。在 Scrapy 的ItemLoader中input_processor和output_processor是两个关键概念它们作用于数据加载的不同阶段职责明确、执行时机不同✅input_processor输入处理器执行时机在调用add_xpath()/add_css()/add_value()等方法添加值时立即执行即“添加阶段”。作用对象对原始提取的每一个值可能为字符串、列表、None 等进行预处理清洗、标准化、转换等。输入形式接收一个单个值或值列表如[ $19.99 , \nIn stock\n]返回任意类型通常为清洗后的值或列表。典型用途去空格、HTML 去标签、编码修复、字符串转数字、过滤空值等。注意多个add_*调用会累积值每个值都独立经过input_processor处理后加入字段的“待处理队列”。✅output_processor输出处理器执行时机仅在调用load_item()方法时统一执行即“最终生成 Item 阶段”。作用对象接收该字段所有经 input_processor 处理后的值组成的列表如[19.99, 24.99]并将其聚合/规约成最终字段值通常为单个值但也可为列表。典型用途取第一个有效值TakeFirst、拼接为字符串Join( )、去重set()、类型强制转换如int、过滤 None 等。关键特性它决定字段最终存入 Item 的形态且只执行一次/每字段一次。 补充说明每个字段可单独设置input_processor/output_processor通过Field定义或 loader 字段声明若未指定则继承default_input_processor或default_output_processorinput_processor是“逐个值处理”output_processor是“整体归约处理”若某字段未添加任何值output_processor会收到空列表[]此时需确保处理器能安全处理如TakeFirst()返回NoneJoin()返回空字符串。# 示例理解执行流loaderItemLoader(itemMyItem())loader.add_value(price,[$10.50 , $12.00 ])# → input_processor(str.strip) → [10.50, 12.00]loader.load_item()# → output_processor(Join(, )) → 10.50, 12.00