Python 3.x爬虫遇HTTPSConnectionPool错误,求处理方案
我之前在做爬虫开发和邮箱验证功能时,多次碰到过这个requests.exceptions.ConnectionError错误,尤其是带着WinError 10060的连接超时问题,简直头大!不过摸清楚背后的原因后,这些问题都能逐一解决,下面分享我的实战经验:
核心原因拆解
这个错误本质是TCP连接超时+重试次数耗尽:WinError 10060是系统层面提示你,无法在规定时间内和目标服务器建立起连接;而Max retries exceeded则说明requests默认的重试机制已经用完了所有尝试机会。不管是爬虫还是邮箱验证,本质都是客户端和服务器的连接出了问题,解决思路大同小异。
实战解决办法
1. 调整超时时间与重试策略
默认的requests超时设置偏短,加上重试次数有限,很容易触发这个错误。你可以自定义重试规则,同时给连接留足缓冲时间:
import requests from requests.adapters import HTTPAdapter from urllib3.util.retry import Retry # 创建会话对象,复用连接 session = requests.Session() # 配置重试策略 retry_strategy = Retry( total=5, # 最多重试5次 backoff_factor=1, # 重试间隔指数增长(1s→2s→4s...) status_forcelist=[429, 500, 502, 503, 504], # 遇到这些服务器错误时重试 allowed_methods=["HEAD", "GET", "OPTIONS"] # 只对安全的请求方法重试 ) # 给HTTP/HTTPS请求挂载重试适配器 adapter = HTTPAdapter(max_retries=retry_strategy) session.mount("https://", adapter) session.mount("http://", adapter) try: # 设置10秒超时(连接超时+读取超时) response = session.get("你的目标URL", timeout=10) response.raise_for_status() # 主动抛出HTTP错误 except requests.exceptions.ConnectionError as e: print(f"连接失败: {e}")
2. 检查网络与代理环境
- 如果你在公司/学校内网,大概率是防火墙或代理拦截了请求,试试切换到个人热点,或者关闭系统代理再测试;
- 如果目标网站有IP限流,就用代理IP绕过限制:
proxies = { "http": "http://你的代理IP:端口", "https": "https://你的代理IP:端口", } response = session.get("目标URL", proxies=proxies, timeout=10)
3. 伪装成真实浏览器请求
很多网站会拦截无浏览器标识的请求,你只需要添加几个关键请求头就行:
headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36", "Accept-Language": "zh-CN,zh;q=0.9", "Referer": "https://www.google.com/" # 可选,模拟从搜索引擎跳转 } response = session.get("目标URL", headers=headers, timeout=10)
4. 邮箱验证场景的特殊处理
邮箱验证时出现这个错误,大多是邮件服务商的反限流机制在起作用:
- 不要频繁发送验证请求,设置至少1分钟的间隔时间;
- 像Gmail、Outlook这类服务商,需要使用应用专用密码代替普通密码登录SMTP服务器,记得去账户安全中心开启;
- 更换SMTP端口试试,优先用加密端口:
import smtplib from email.mime.text import MIMEText msg = MIMEText("这是你的邮箱验证码:123456") msg["Subject"] = "账户验证邮件" msg["From"] = "你的邮箱@example.com" msg["To"] = "用户邮箱@example.com" try: # 使用TLS加密端口587 server = smtplib.SMTP("smtp.example.com", 587) server.starttls() # 启用加密连接 server.login("你的邮箱@example.com", "应用专用密码") server.send_message(msg) server.quit() except smtplib.SMTPConnectError as e: print(f"SMTP连接失败: {e}")
5. 先确认目标服务器状态
有时候不是你的问题,是目标网站/邮件服务器宕机了。先用curl命令测试一下:
curl -v https://你的目标URL
如果curl也访问失败,那就是服务器的问题,等一段时间再尝试即可。
内容的提问来源于stack exchange,提问作者Bese
相关产品推荐
相关产品推荐

