如何在Scrapy中将503标记为刮擦失败作为错误?

时间:2018-07-09 20:14:18

标签: web-scraping scrapy scrapy-spider http-status-codes scrapy-settings

所以我爬行时的状态为503。重试,但随后被忽略。我希望将其标记为错误,而不是被忽略。该怎么做?

我希望将其设置在settings.py中,这样它将适用于我所有的蜘蛛。 handle_httpstatus_list似乎只会影响一只蜘蛛。

2 个答案:

答案 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})