如何自定义Scrapy的JsonLines导出器排除Null/默认空值字段
Scrapy自定义JsonLines导出器过滤空字段实现步骤
不需要修改现有Pydantic模型,仅通过自定义Feed Exporter即可实现导出时自动剔除null和空字符串字段,具体步骤如下:
1. 编写自定义导出类
在Scrapy项目目录下新建exporters.py文件(如果已存在则直接追加内容),写入以下代码:
from scrapy.exporters import JsonLinesItemExporter class CleanedJsonLinesItemExporter(JsonLinesItemExporter): def export_item(self, item): # 调用内置方法获取序列化后的字段键值对,兼容Scrapy Item、字典、Pydantic模型等所有item类型 serialized_fields = self._get_serialized_fields(item) # 过滤值为None或空字符串的字段 cleaned_data = { field_name: field_value for field_name, field_value in serialized_fields if field_value is not None and field_value != "" } # 调用父类原生方法写入清洗后的单行JSON super().export_item(cleaned_data)
2. 注册自定义导出器到项目配置
打开项目的settings.py文件,添加/修改FEED_EXPORTERS配置项,将默认的jsonlines导出器替换为自定义实现:
# 替换myproject为你实际的Scrapy项目包名 FEED_EXPORTERS = { "jsonlines": "myproject.exporters.CleanedJsonLinesItemExporter", }
3. 正常运行爬虫即可
不需要修改爬虫逻辑、Pydantic模型定义,也不需要调整原有输出命令/配置,运行爬虫后生成的jsonlines文件就会自动剔除值为null和空字符串的字段,和预期输出效果一致。
方案说明
- 过滤逻辑仅在导出环节生效,爬虫运行过程中item依然保留完整字段和默认值,不会影响管道、中间件中依赖这些字段的其他逻辑
- 统一保留原有Pydantic模型即可适配所有站点、所有产品页的字段差异,不需要为不同页面维护多套模型,维护成本极低
- 如果后续需要调整过滤规则(比如新增过滤空列表、0值等场景),仅需修改
cleaned_data生成处的判断条件即可,无其他侵入性改动
内容的提问来源于stack exchange,提问作者Nathan Seals
相关产品推荐
相关产品推荐

