我正在用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
型
所以从理论上讲,这是不应该发生的。我能做些什么来避免它呢?
1条答案
按热度按时间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
设置自定义哪些错误代码被认为符合重试条件。