首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >防止忽略非200响应状态-刮伤

防止忽略非200响应状态-刮伤
EN

Stack Overflow用户
提问于 2020-10-31 16:08:03
回答 1查看 1.2K关注 0票数 0

我正在爬行一个网站,当响应状态为50x时,我想重试请求,但是我得到了

忽略非200响应

我怎样才能摆脱它,重试请求几次(例如,默认情况下3次),或者重试直到获得200响应状态。

代码语言:javascript
复制
DEBUG:scrapy.downloadermiddlewares.retry:Retrying <GET http://sample.com/> (failed 1 times): 502 Bad Gateway
DEBUG:scrapy.core.engine:Crawled (502) <GET http://sample.com/> (referer: None)
CRITICAL:security_daily_history:<twisted.python.failure.Failure scrapy.spidermiddlewares.httperror.HttpError: Ignoring non-200 response>

更新:

我的自定义重试中间件是:

代码语言:javascript
复制
class CustomRetryMiddleware(RetryMiddleware):

    def process_response(self, request, response, spider):
        super().process_response(request, response, spider)
        return response

它应该像内置在RetryMiddleware中那样工作,但它没有,我在设置中设置了RETRY_TIMES = 4,但是蜘蛛在失败1次之后忽略了502状态。为了再现这个问题,此链接总是返回502状态代码。我在以下设置中启用了自定义中间件:

代码语言:javascript
复制
DOWNLOADER_MIDDLEWARES = {
   'scrapy.downloadermiddlewares.retry.RetryMiddleware': None,
   'projectname.middlewares.CustomRetryMiddleware': 543,
}
EN

回答 1

Stack Overflow用户

发布于 2020-11-01 07:54:16

根据RetryMiddleware的说法,您的请求应该已经被医生们重试过两次了。在我看来,从日志中也可以看到这一点,因为您有两次Crawled (xxx) <GET http://sample.com/> (一次用502次,一次用200次)

可以通过请求中的属性调整重试次数:

还可以使用max_retry_times属性Request.meta的每个请求指定最大重试次数。初始化时,max_retry_times元键比RETRY_TIMES设置具有更高的优先级。

现在没有尝试它,但是当您创建并生成原始请求时,应该是这样的:

代码语言:javascript
复制
request_with_cookies = Request(
    url='http://www.example.com', meta={'max_retry_times': 10})

然后,对http://www.example.com的请求将被重试最多10次。

如果请求经常失败,scrapy.spidermiddlewares.httperror.HttpErrorMiddleware将忽略您的请求(参见您的日志消息)。

根据抓取文档,可以使用蜘蛛中的属性定义蜘蛛可以处理的错误代码列表。进行handle_httpstatus_list。如果您想在您的蜘蛛中处理请求,即使它失败了k次,这将是非常有用的。

代码语言:javascript
复制
class MySpider(CrawlSpider):
    handle_httpstatus_list = [404]

在这种特殊情况下,由于您正经历一个502错误,所以您需要使用handle_httpstatus_list = [502] (只有当您真正想要处理它时,但我想要的是调整RetryMiddleware中的重试计数?)。

在返回成功代码之前,我在文档中看不到运行请求的可能性。这是有意义的,因为它会在刮取过程中引入无限循环。如果要重试直到返回成功代码,只需将重试次数设置为非常高的数目,例如max_retry_times = 100。如果在100次之后没有成功,它很可能不会很快改变。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64623755

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档