scrapy 500 Internal Server Error内部服务器错误

svgewumm  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(199)

我正在用scrappy抓取网页,收到错误:

Gave up retrying <GET https://www.something.net> (failed 3 times): 500 Internal Server Error

字符串
即使在parse方法中,我已经将此参数添加到调用parse函数的scrapy.Request的Meta中:

"handle_httpstatus_all": True,


然后在parse函数中我这样做:

item = response.meta['item']
if response.status == 200:
    #Keeps building the item
yield item


所以从理论上讲,这是不应该发生的。我能做些什么来避免它呢?

ldxq2e6h

ldxq2e6h1#

你的理论缺少一些重要信息。
Scrapy有两套不同的中间件,每个请求都必须通过。你所指的是HttpErrorMiddleware,它属于Spider-Middleware组。如果启用了这个中间件,并且你将请求Meta键handle_httpstatus_all设置为True,那么它实际上允许解析所有失败的请求。
然而,还有另一组称为Downloader-Middleware的中间件,它们在请求/响应到达Spider-Middleware之前首先通过。其中RetryMiddleware识别具有某些错误代码的响应,这些错误代码被确定为可能是临时的,并在响应被正式认为失败之前自动重新发送这些请求一定次数。
所以你的理论仍然是准确的,在这个意义上,所有失败的响应都被允许通过,但对于一些错误代码,他们首先要经过几次重试尝试,然后才能得到处理。
您可以通过将max_retry_times Meta键的重试次数设置为自定义值来自定义中间件的行为,或者将dont_retry元键设置为True,或者您可以在RETRY_ENABLED = False的设置中完全禁用重试中间件。
您还可以使用RETRY_HTTP_CODES设置自定义哪些错误代码被认为符合重试条件。

相关问题