我正在爬行一个网站,当响应状态为50x时,我想重试请求,但是我得到了
忽略非200响应
我怎样才能摆脱它,重试请求几次(例如,默认情况下3次),或者重试直到获得200响应状态。
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>更新:
我的自定义重试中间件是:
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状态代码。我在以下设置中启用了自定义中间件:
DOWNLOADER_MIDDLEWARES = {
'scrapy.downloadermiddlewares.retry.RetryMiddleware': None,
'projectname.middlewares.CustomRetryMiddleware': 543,
}发布于 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设置具有更高的优先级。
现在没有尝试它,但是当您创建并生成原始请求时,应该是这样的:
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次,这将是非常有用的。
class MySpider(CrawlSpider):
handle_httpstatus_list = [404]在这种特殊情况下,由于您正经历一个502错误,所以您需要使用handle_httpstatus_list = [502] (只有当您真正想要处理它时,但我想要的是调整RetryMiddleware中的重试计数?)。
在返回成功代码之前,我在文档中看不到运行请求的可能性。这是有意义的,因为它会在刮取过程中引入无限循环。如果要重试直到返回成功代码,只需将重试次数设置为非常高的数目,例如max_retry_times = 100。如果在100次之后没有成功,它很可能不会很快改变。
https://stackoverflow.com/questions/64623755
复制相似问题