FEEDS 必须为字典类型,因其设计要求每个键为导出路径、值为配置参数,Scrapy 初始化时直接遍历键以创建独立导出任务;若误用列表或字符串,系统跳过配置且不报错,导致无任何导出。

Scrapy 2.6+ 版本起,FEEDS 是唯一推荐的多格式导出配置方式;旧版 FEED_URI/FEED_FORMAT 已弃用,混用会导致部分格式不生效或静默失败。
为什么 FEEDS 字典必须用字典,不能用列表或字符串
Scrapy 的 Feed 导出系统在初始化时会直接遍历 FEEDS 的 key(即文件路径),每个 key 对应一个独立导出任务。如果误写成列表:FEEDS = ['a.json', 'b.csv'],Scrapy 会跳过整个配置,不报错但也不导出任何内容。字符串同理——它只接受 dict 类型。
- 正确写法:
FEEDS = {'data/a.json': {'format': 'json'}, 'data/b.csv': {'format': 'csv'}} - 路径支持变量:
'data/%(name)s_%(time)s.json'中的%(name)s会被替换为爬虫名,%(time)s是 ISO 格式时间戳(如2026-10-14T23:49:05) - 注意:路径中不能含空格或非法字符,否则导出时会抛出
ValueError: invalid URI
FEEDS 中不同格式对 fields 参数的敏感度差异
CSV 必须显式指定 fields(或设为 None),否则导出的 CSV 文件头缺失、字段顺序随机,Excel 打开后列错位;JSON/XML 则无此限制,fields=None 表示导出所有字段(包括 Item 中未赋值的 key,值为 None)。
- 安全写法(推荐):
'fields': ['title', 'url', 'publish_time']—— 明确字段名和顺序 - 偷懒但有风险:
'fields': None—— 若 Item 类字段动态增减,CSV 会报KeyError,JSON 则正常 - XML 导出时若字段含特殊字符(如
&、),XmlItemExporter会自动转义,无需额外处理
中文导出乱码或 Unicode 转义的根因与修复
常见现象是 JSON 文件里中文变成 \u4f60\u597d,或 CSV 在 Windows 上用 Excel 打开显示方块。这不是编码设置错了,而是导出器默认行为:JSON 默认启用 ensure_ascii=True,CSV 默认用 utf-8 编码但 Excel for Windows 默认读 gbk。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
- JSON 去 Unicode:
'item_export_kwargs': {'ensure_ascii': False}(必须嵌套在格式配置内) - CSV 兼容 Excel:
'encoding': 'gbk'(仅限 Windows 环境;Linux/macOS 请坚持utf-8+ 用 LibreOffice 打开) - 全局编码设置
FEED_EXPORT_ENCODING只影响文件写入字节流,不改变 JSON 的ensure_ascii行为
大体积数据导出时 JSON 和 JSON Lines 的取舍
当单次爬取超 5 万条 Item 时,用 format: 'json' 容易触发内存溢出(OOM),因为 Scrapy 会先把全部 Item 缓存在内存里,最后一次性序列化成一个大数组;而 jsonlines 是流式逐行写入,内存占用恒定。
- 改用 JSON Lines:
'format': 'jsonlines',输出每行一个 JSON 对象,无括号和逗号分隔 - 注意:JSON Lines 不支持
indent参数,设了也无效 - 后续处理建议:用
jq或 Python 的jsonlines库读取,不要用json.load()直接读整个文件
真正容易被忽略的是时间戳变量 %(time)s 的精度——它只精确到秒,同一秒内多次运行爬虫会导致文件覆盖。如果需要毫秒级隔离,得自己在 FEEDS 路径中拼接 %(time)s_%(job)s 或改用信号钩子动态生成路径。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










