Scrapy 407 代理认证错误解决方案
问题描述
在 Scrapy 的默认设置中,当开启 重试中间件时,部分 HTTP 错误码(如 500、502、503 等)会自动重试,但对于 407 代理认证错误,却表现出不一致的行为:
- 重试中间件开启:Scrapy 遇到 407 错误时总是尝试重试,但问题依旧未解决。
- 重试中间件关闭:爬虫直接终止,并报出 407 代理认证错误。
一些用户还报告,即使代理服务器正常工作,Scrapy 也会间歇性地返回 407 错误。这种不一致性让开发者难以诊断和解决问题。
1. 增加遇到 407 重试
即便在 Scrapy 设置中明确配置了 RETRY_HTTP_CODES 为 [407]:
1GLOBAL_SPIDER_SETTINGS = {2"RETRY_ENABLED": True,3"RETRY_TIMES": 3,4"RETRY_HTTP_CODES": [500, 502, 503, 504, 407, 408],5}
这样会大大降低 407 导致的错误。
2. 自定义重试逻辑
如果 Scrapy 的默认重试逻辑无法处理 407 错误,可以通过自定义中间件实现重试。例如:
1from scrapy.downloadermiddlewares.retry import RetryMiddleware2from scrapy.utils.response import response_status_message34class CustomRetryMiddleware(RetryMiddleware):5def _retry(self, request, reason, spider):6if request.meta.get('retry_times', 0) < self.max_retry_times:7spider.logger.info(f"Retrying {request.url} due to {reason}")8return super()._retry(request, reason, spider)