首页 > 解决方案 > 使用 Scrapy 解析本地 XML 文件:DOWNLOAD_TIMEOUT & DOWNLOAD_MAXSIZE 不起作用

问题描述

我正在使用 Scrapy 解析本地 XML 文件,并且代码似乎挂在一个特定的 XML 文件上。

文件可能太大(219M)或格式错误?无论哪种方式,蜘蛛都不会崩溃,它只会冻结。冻得太厉害了,我什至不能ctrl + c出来......

我已经尝试调整DOWNLOAD_TIMEOUTDOWNLOAD_MAXSIZE设置来让scrapy跳过这个文件,以及它遇到的任何其他类似的有问题的文件,但它似乎不起作用。至少如果我file:///Users/.../myfile.xml用作 URL,我是根据这篇文章做的。

如果我改为python -m http.server 8002使用该 URL ( ) 启动服务器并访问文件,http://localhost:8002/.../myfile.xml那么 Scrapy 会跳过带有 cancelledError 的文件,就像我想要的那样:expected response size larger than download max size.

所以我猜如果您使用文件协议,则不使用下载器设置,因为您实际上并没有下载任何东西?类似的东西?有没有办法告诉scrapy超时/跳过本地文件?

似乎启动一个 http 服务器是一种解决方案,但它增加了运行蜘蛛的复杂性(并且可能会减慢速度?)所以我宁愿找到一个不同的解决方案。

标签: pythonscrapy

解决方案


我相当肯定这一点,DOWNLOAD_TIMEOUT并且DOWNLOAD_MAXSIZE仅在通过 HTTP 或其他网络协议进行调用时才起作用。相反,您可以覆盖start_requests可以更好地控制读取文件方式的方法:

def start_requests(self, **kwargs):
  for uri in self.uris:
    ...

例如,您可以使用os.readwith 提供_length参数,该参数将告诉 Python 读取文件,直到读取了_length字节数,然后返回。这可能与您使用DOWNLOAD_MAXSIZE.


推荐阅读