scrapy.core.scraper 错误:下载时出错 -- OSError: Errno 24 打开文件太多

问题描述 投票:0回答:1

我继承了一个 scrapy 应用程序,它可以爬行一个域上的 1000 个页面,并将最终结果写入一个 json 文件。作者一直在 Mac 上运行此程序,并遇到了操作系统的限制,它抱怨已达到打开文件的限制。他通过覆盖操作系统级别的上限来解决这个问题:

$ ulimit -n 2048

我在Windows上运行这个,显然没有上限,但我仍然遇到同样的问题。 scrapy运行一段时间后,会抛出一堆这样的错误,然后放弃:

2023-11-17 14:30:14 [scrapy.core.scraper] ERROR: Error downloading <GET https://some_page>
Traceback (most recent call last):
File ".venv\lib\site-packages\twisted\internet\defer.py", line 1445, in _inlineCallbacks
    result = current_context.run(g.send, result)
  File ".venv\lib\site-packages\scrapy\core\downloader\middleware.py", line 43, in process_request
  File ".venv\lib\site-packages\scrapy\downloadermiddlewares\httpcache.py", line 77, in process_request
  File ".venv\lib\site-packages\scrapy\extensions\httpcache.py", line 302, in retrieve_response
  File ".venv\lib\site-packages\scrapy\extensions\httpcache.py", line 354, in _read_meta
OSError: [Errno 24] Too many open files: 'path to file\\pickled_meta'

我读到这是一个 python 问题,并尝试应用此修复程序,但没有帮助:

import win32file
win32file._setmaxstdio(2048)

目前,缓存显示已创建 63,744 个文件。所以,我不知道这是否是操作系统问题、Python 问题、scrapy 中的某些错误或某些误用。我可以在这里发布一些代码,但我不知道什么是相关的 - 蜘蛛、项目管道、解析方法或设置文件。任何尝试解决此问题的想法将不胜感激。请让我知道我可以提供哪些其他详细信息。

python windows scrapy
1个回答
0
投票

您的应用程序似乎使用 httpcache 来存储收到的响应。
默认情况下,如果启用 httpcache,则应用

scrapy.extensions.httpcache.FilesystemCacheStorage

目前,缓存显示已创建 63,744 个文件。所以,我不知道这是否是操作系统问题、Python 问题、scrapy 中的某些错误或某些误用。我可以在这里发布一些代码,但我不知道相关的是什么 - 蜘蛛、项目管道、解析方法或设置文件。

对于每个存储的响应

FilesystemCacheStorage
创建 6 个文件和 1 个文件夹。 来源

我建议您通过应用来应用基于 dbm 的缓存存储

HTTPCACHE_STORAGE = "scrapy.extensions.httpcache.DbmCacheStorage"

到项目设置(它只创建几个文件 - 它的源位于同一链接上)

但是,在我的实践中,对于如此数量的文件,我没有遇到

FilesystemCacheStorage
的问题。

© www.soinside.com 2019 - 2024. All rights reserved.