所以我爬行时的状态为503。重试,但随后被忽略。我希望将其标记为错误,而不是被忽略。该怎么做?
我希望将其设置在settings.py
中,这样它将适用于我所有的蜘蛛。 handle_httpstatus_list
似乎只会影响一只蜘蛛。
答案 0 :(得分:1)
您应该查看以下两项设置:
RETRY_HTTP_CODES
:
默认值:[500、502、503、504、408]
要重试的HTTP响应代码。总是会重试其他错误(DNS查找问题,连接断开等)。
https://doc.scrapy.org/en/latest/topics/downloader-middleware.html#retry-http-codes
还有HTTPERROR_ALLOWED_CODES
:
默认值:[]
传递此列表中包含非200状态代码的所有响应。
https://doc.scrapy.org/en/latest/topics/spider-middleware.html#std:setting-HTTPERROR_ALLOWED_CODES
答案 1 :(得分:1)
最后,我只做了一个小小的改动就覆盖了重试中间件。我设置为每次刮板放弃重试某些内容时,无论状态码是什么,都会将其标记为错误。
似乎Scrapy不以某种方式与放弃重试无关。对我来说很奇怪。
如果有人要使用它,它就是中间件。不要忘记在settings.py
from scrapy.downloadermiddlewares.retry import *
class Retry500Middleware(RetryMiddleware):
def _retry(self, request, reason, spider):
retries = request.meta.get('retry_times', 0) + 1
if retries <= self.max_retry_times:
logger.debug("Retrying %(request)s (failed %(retries)d times): %(reason)s",
{'request': request, 'retries': retries, 'reason': reason},
extra={'spider': spider})
retryreq = request.copy()
retryreq.meta['retry_times'] = retries
retryreq.dont_filter = True
retryreq.priority = request.priority + self.priority_adjust
return retryreq
else:
# This is the point where I update it. It used to be `logger.debug` instead of `logger.error`
logger.error("Gave up retrying %(request)s (failed %(retries)d times): %(reason)s",
{'request': request, 'retries': retries, 'reason': reason},
extra={'spider': spider})