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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 15:51:19