使用Python requests模块遇ConnectionError问题求助
解决requests模块持续出现ConnectionError的常见方案
以下是排查和解决这类问题的常见思路,按优先级排序:
1. 确认目标API的可达性
- 直接用浏览器访问
https://api.example.com/data,或在终端执行curl https://api.example.com/data,验证是否能正常返回响应。如果浏览器也无法访问,问题大概率在API服务端(如服务宕机、域名解析失败、IP被封禁)。 - 用
nslookup api.example.com检查域名解析是否正常,确认解析出的IP是预期的服务器地址。
2. 检查代理配置
如果你的网络需要通过代理访问外网,requests默认不会自动使用系统代理,需手动配置:
proxies = { 'http': 'http://your-proxy-address:port', 'https': 'https://your-proxy-address:port', } response = requests.get(url, proxies=proxies)
若想让requests自动读取系统代理,可开启环境变量支持:
session = requests.Session() session.trust_env = True # 启用系统代理读取 response = session.get(url)
3. 处理SSL证书问题
部分网站的SSL证书不被系统信任,会触发连接失败:
- 临时关闭证书验证(生产环境禁止使用):
response = requests.get(url, verify=False)
- 或指定本地信任的证书文件:
response = requests.get(url, verify='/path/to/your/cert.pem')
4. 添加超时设置
未设置超时可能导致连接无限等待,最终触发ConnectionError,建议明确超时时间:
response = requests.get(url, timeout=10) # 设置10秒超时(连接+读取)
5. 模拟浏览器User-Agent
部分API会拦截requests默认的UA标识,模拟浏览器UA可绕过限制:
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' } response = requests.get(url, headers=headers)
6. 启用重试机制
偶尔的连接波动可通过重试解决,用HTTPAdapter配置重试策略:
from requests.adapters import HTTPAdapter from urllib3.util.retry import Retry session = requests.Session() # 设置连接重试3次,每次重试间隔递增 retry_strategy = Retry( connect=3, backoff_factor=0.5 ) adapter = HTTPAdapter(max_retries=retry_strategy) session.mount('http://', adapter) session.mount('https://', adapter) response = session.get(url)
7. 排查本地安全软件
本地防火墙、杀毒软件可能拦截Python的出站请求,可暂时关闭测试,或把Python程序加入安全软件白名单。
8. 细化异常捕获定位问题
将通用的RequestException拆分为更具体的异常,便于精准定位错误类型:
import requests url = 'https://api.example.com/data' try: response = requests.get(url, timeout=10) response.raise_for_status() # 处理响应数据 except requests.exceptions.ConnectionError as e: print(f"连接错误:{e}") except requests.exceptions.SSLError as e: print(f"SSL证书错误:{e}") except requests.exceptions.ProxyError as e: print(f"代理错误:{e}") except requests.exceptions.RequestException as e: print(f"其他请求错误:{e}")
内容的提问来源于stack exchange,提问作者Sumit Kumar Mehta
相关产品推荐
相关产品推荐

