Scrapy 407 代理认证错误解决方案

阅读模式

问题描述

在 Scrapy 的默认设置中,当开启 重试中间件时,部分 HTTP 错误码(如 500、502、503 等)会自动重试,但对于 407 代理认证错误,却表现出不一致的行为:

  • 重试中间件开启:Scrapy 遇到 407 错误时总是尝试重试,但问题依旧未解决。
  • 重试中间件关闭:爬虫直接终止,并报出 407 代理认证错误

一些用户还报告,即使代理服务器正常工作,Scrapy 也会间歇性地返回 407 错误。这种不一致性让开发者难以诊断和解决问题。


1. 增加遇到 407 重试

参考:Scrapy RetryMiddleware 文档

即便在 Scrapy 设置中明确配置了 RETRY_HTTP_CODES[407]

1
GLOBAL_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 错误,可以通过自定义中间件实现重试。例如:

1
from scrapy.downloadermiddlewares.retry import RetryMiddleware
2
from scrapy.utils.response import response_status_message
3
4
class CustomRetryMiddleware(RetryMiddleware):
5
def _retry(self, request, reason, spider):
6
if request.meta.get('retry_times', 0) < self.max_retry_times:
7
spider.logger.info(f"Retrying {request.url} due to {reason}")
8
return super()._retry(request, reason, spider)