You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的进程文件句柄上限默认较低,可通过注册表修改:

  1. 打开注册表编辑器(运行regedit)
  2. 定位到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters
  3. 右键新建DWORD(32位)值,命名为MaxOpenFiles,设置值为10000(十进制)
  4. 重启电脑生效

5. 定位句柄泄漏进程

用Process Explorer工具(微软官方工具)查看你的Scrapy进程打开的所有文件句柄,确认哪些文件被持续占用:

  • 打开Process Explorer,找到你的Python/Scrapy进程
  • 右键选择Properties -> Open Handles,查看所有打开的文件路径,定位是否有异常堆积的文件句柄。

内容的提问来源于stack exchange,提问作者Mark Wojciechowicz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 04:16:16