You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复Python requests库Max retries exceeded with url错误

问题根因

[Errno 111] Connection refused 是TCP握手阶段被目标站点直接拒绝连接导致的,和你之前调整的allow_redirects、timeout、verify参数没有关系——这些参数都是TCP连接建立成功后才会生效的配置,完全碰不到这个错误的触发点。
你的爬虫稳定运行1年后突然出现这个问题,核心原因是目标站点更新了反爬/WAF规则,把AWS Lambda默认使用的区域共享公网IP池整体拉黑了。这类共享IP池常年被各种爬虫、扫描器调用,被反爬系统标记是常态。

现有方案的无效原因
  • 重试逻辑存在缺陷:首次请求未配置超时参数,裸捕获所有异常后重试仍然走默认出口IP,等于重复用被拉黑的IP发起请求,不可能成功。
  • 代理配置根本没有生效:你在构造代理列表时特意过滤掉了HTTPS协议代理,但目标站点是HTTPS服务,requests发HTTPS请求时只会读取代理配置中https键对应的地址,你传入的代理字典只有http/socks4/socks5键,属于无效配置,请求还是走Lambda默认公网出口。
  • 免费代理可用性极差:你用的公共代理池里的IP大部分本身已经被目标站点拉黑,或者已经失效,即使代理配置正确,随机选中可用IP的概率也极低。
修复方案

优先调整AWS Lambda配置(见效最快,稳定性最高)

  • 为Lambda配置固定公网出口IP:将Lambda部署到VPC私有子网,绑定公网NAT网关,给NAT网关分配固定弹性公网IP(EIP)。配置完成后先测试该EIP是否能正常访问目标站点,如果仍被拦截,直接更换新的EIP直到拿到未被标记的IP即可,后续爬虫固定走这个EIP出口,不会再碰到共享IP池被拉黑的问题。
  • 排查VPC网络规则:确认Lambda绑定的安全组、VPC网络ACL没有拦截443端口的出站流量,可以先在Lambda中发起对其他公共HTTPS站点的测试请求,确认基础出站连通性正常。

代码逻辑修复

  • 重构请求重试逻辑,所有请求统一配置超时,按异常类型区分处理,不要裸捕所有异常做无效重试:
import requests
import time
import random
def sending_request(input_url, max_retry=3, proxy=None):
    last_err = None
    for retry_cnt in range(max_retry):
        try:
            resp = requests.get(
                input_url,
                allow_redirects=True,
                headers=get_random_header(),
                timeout=(5, 15), # 连接超时5秒,读取超时15秒
                proxies=proxy,
                verify=False
            )
            resp.raise_for_status() # 自动触发4xx/5xx状态码异常
            print(f"Request success, status code: {resp.status_code}")
            return resp
        except requests.exceptions.ConnectionError as e:
            last_err = e
            print(f"Connection failed, retry {retry_cnt+1}/{max_retry}: {str(e)}")
            time.sleep(random.randint(1,3))
        except Exception as e:
            last_err = e
            print(f"Request failed, retry {retry_cnt+1}/{max_retry}: {str(e)}")
            time.sleep(random.randint(2,5))
    raise last_err
  • 如果选择走代理方案,修正代理筛选逻辑:优先筛选HTTPS协议代理,每个代理拿到后先发起测试请求验证能正常访问目标站点,验证通过的代理再加入可用列表,不要直接使用未经过校验的公共代理。公共代理存活率极低,长期运行建议使用付费高匿代理池。
  • 移除无意义的verify参数切换逻辑:SSL证书校验和连接拒绝错误完全无关,关闭校验既解决不了问题,还会带来证书伪造的安全风险。
验证顺序
  1. 先在Lambda控制台发起最简测试,直接执行requests.get("https://www.niederglatt-zh.ch", timeout=(5,15)),确认是否稳定复现连接拒绝错误。
  2. 配置VPC+NAT+固定EIP后再次执行测试,验证连通性。
  3. 若固定EIP仍被拦截,更换EIP或切换为可用高匿代理即可。

内容的提问来源于stack exchange,提问作者taga

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 13:24:21