Python urllib爬虫触发Connection reset by peer错误求助
Python urllib请求报Connection reset by peer错误解决方案
问题现象
使用Python urllib库抓取目标网页HTML数据时持续触发Connection reset by peer错误,已尝试配置请求头规避代理相关问题但未生效。
问题复现代码:
import urllib.request url = "https://wolt.com/az/aze/baku/restaurant/qutabxana" hdr = { 'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36' } req = urllib.request.Request(url, headers=hdr) response = urllib.request.urlopen(req) response.read()
错误返回信息:
--------------------------------------------------------------------------- File /opt/conda/envs/bifrost/lib/python3.8/ssl.py:1309, in SSLSocket.do_handshake(self, block) 1308 self.settimeout(None) -> 1309 self._sslobj.do_handshake() 1310 finally: ConnectionResetError: [Errno 104] Connection reset by peer
错误原因
- 错误触发在SSL握手阶段,并非普通代理配置或单一User-Agent缺失导致
- 仅配置User-Agent的请求和真实浏览器特征差距过大,目标站点WAF(Web应用防火墙)会直接重置连接
- urllib默认的TLS协议版本、加密套件配置、握手指纹和真实浏览器存在明显差异,是被拦截的核心原因
- 部分环境下系统代理冲突、出口IP被封禁也会触发同类错误
可行解决方案
方案1:补全请求头+调整SSL配置
补全真浏览器携带的完整请求头,同时调整SSL上下文适配站点的TLS要求,代码如下:
import urllib.request import ssl url = "https://wolt.com/az/aze/baku/restaurant/qutabxana" hdr = { 'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8', 'Accept-Language': 'en-US,en;q=0.9', 'Accept-Encoding': 'gzip, deflate, br', 'Connection': 'keep-alive', 'Upgrade-Insecure-Requests': '1', 'Sec-Fetch-Dest': 'document', 'Sec-Fetch-Mode': 'navigate', 'Sec-Fetch-Site': 'none', 'Sec-Fetch-User': '?1' } # 调整SSL加密套件配置,兼容站点TLS规则 ctx = ssl.create_default_context() ctx.set_ciphers('DEFAULT@SECLEVEL=1') req = urllib.request.Request(url, headers=hdr) # 显式关闭代理可添加参数 proxies={} response = urllib.request.urlopen(req, context=ctx, timeout=15) content = response.read()
注意:原代码使用的Chrome 102版本User-Agent属于过旧版本,真实环境占比极低,更容易被反爬系统标记。
方案2:替换支持TLS指纹伪装的请求库
如果方案1执行后仍报错,说明urllib的TLS握手特征已经被站点标记拦截,urllib本身不支持TLS指纹修改,直接替换为支持浏览器指纹模拟的请求库即可,不需要额外复杂配置:
# 先安装依赖:pip install curl_cffi from curl_cffi import requests url = "https://wolt.com/az/aze/baku/restaurant/qutabxana" hdr = { 'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36' } # impersonate参数指定模拟Chrome 120版本的完整握手、请求特征,和真实浏览器行为完全一致 response = requests.get(url, headers=hdr, impersonate="chrome120", timeout=15) content = response.text
方案3:排查网络层拦截
如果以上方案都无法解决,逐一排查网络层问题:
- 切换网络环境(如手机热点)测试,确认当前出口IP没有被目标站点封禁
- 关闭本地运行的代理、VPN工具,部分透明代理会篡改SSL握手包导致连接被重置
- 云服务器、IDC机房IP段被反爬系统拦截概率远高于家庭宽带IP,可更换为家庭宽带出口测试
内容的提问来源于stack exchange,提问作者Masail Guliyev
相关产品推荐
相关产品推荐

