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