Windows下Scrapy爬虫遇OSError: Too many open files问题求助
解决Windows下Scrapy爬虫"Too many open files"错误的思路
核心问题定位
你的场景是Scrapy爬取数千页面时触发OSError: [Errno 24] Too many open files,Mac端通过调整ulimit解决,但Windows端用win32file._setmaxstdio(2048)无效,且已生成63744个缓存文件——根源大概率是文件句柄未被正确释放,或者短时间内打开的文件数量超出进程/系统限制。
具体解决方向
1. 修复JsonWriterPipeline的文件操作逻辑
这是最可能的问题点:
- 检查你的Pipeline代码,如果是每个Item对应打开一个新文件、且未及时关闭,会瞬间占用大量句柄。必须确保每次文件操作完成后关闭句柄,或者用上下文管理器自动管理:
# 正确示例:用上下文管理器自动关闭文件 def process_item(self, item, spider): with open(f"{item['id']}.json", "w", encoding="utf-8") as f: json.dump(item, f) return item - 如果是批量写入场景,复用单个文件句柄,不要频繁打开关闭;如果是多文件输出,写完一个就立即关闭,避免句柄堆积。
2. 降低Scrapy并发压力
通过调整settings.py参数,减少同时处理的请求和Item数量,从源头减少文件句柄占用:
- 减小
CONCURRENT_REQUESTS(默认16):比如设为CONCURRENT_REQUESTS = 8 - 限制Item处理并发:设置
CONCURRENT_ITEMS = 50(默认100) - 适当增大
DOWNLOAD_DELAY,降低请求频率,避免短时间内生成大量文件。
3. 优化缓存/输出策略
6万+缓存文件显然不合理,优化文件生成逻辑:
- 合并输出:不要为每个页面生成单独JSON文件,改成按批次(比如每100个Item写入一个文件)或分类写入少量文件。
- 内存缓存:先将Item缓存到内存列表,攒够一定数量再批量写入文件,写完清空缓存并关闭文件句柄。
- 清理临时缓存:如果缓存文件是中间产物,处理完成后立即删除,避免句柄残留。
4. 调整Windows系统文件句柄限制
Windows的进程文件句柄上限默认较低,可通过注册表修改:
- 打开注册表编辑器(运行
regedit) - 定位到
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters - 右键新建DWORD(32位)值,命名为
MaxOpenFiles,设置值为10000(十进制) - 重启电脑生效
5. 定位句柄泄漏进程
用Process Explorer工具(微软官方工具)查看你的Scrapy进程打开的所有文件句柄,确认哪些文件被持续占用:
- 打开Process Explorer,找到你的Python/Scrapy进程
- 右键选择Properties -> Open Handles,查看所有打开的文件路径,定位是否有异常堆积的文件句柄。
内容的提问来源于stack exchange,提问作者Mark Wojciechowicz
相关产品推荐
相关产品推荐

