使用asyncio+aiohttp爬取JSON时遭遇ClientConnectorError信号量超时求助
解决aiohttp连接超时(信号量超时)的建议
核心原因
这个错误是客户端在指定时间内无法与目标服务器完成TCP连接建立,常见诱因:
- 短时间并发请求量过高,服务器触发限流/拒绝新连接
- 本地TCP连接池耗尽,触发系统级连接限制
- 服务器端响应延迟,导致连接建立超时
具体修复方案
1. 配置超时与重试机制
给aiohttp.ClientSession设置明确的连接超时,同时用重试逻辑处理偶发的连接失败:
from tenacity import retry, stop_after_attempt, wait_exponential import aiohttp @retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=2, max=10)) async def fetch_data(session, url): try: # 设置总超时10秒,连接超时5秒 async with session.get(url, timeout=aiohttp.ClientTimeout(total=10, connect=5)) as response: return await response.json() except aiohttp.ClientConnectorError: raise # 交给重试机制处理
2. 限制并发连接数
手动设置TCP连接器的并发上限,避免瞬间打满服务器连接:
connector = aiohttp.TCPConnector(limit=10) # 限制同时建立10个连接 async with aiohttp.ClientSession(connector=connector) as session: # 你的请求逻辑代码
3. 调整本地网络与系统设置
- 临时关闭本地防火墙/代理,排查是否是网络拦截导致
- Windows系统可修改注册表调整TCP重传参数:找到
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters,将TcpMaxDataRetransmissions从默认5改为3 - 执行
netsh int ip reset(Windows)重置TCP连接状态
4. 添加浏览器请求头
服务器可能拒绝非浏览器标识的请求,补充完整请求头:
headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36', 'Accept': 'application/json', 'Connection': 'keep-alive' } async with session.get(url, headers=headers) as response: # 请求处理逻辑
5. 切换协议端口
错误中使用的是80端口(非SSL),尝试切换到443端口(HTTPS):
将请求URL从http://xtreme-gacha.com/xxx改为https://xtreme-gacha.com/xxx,无需手动设置ssl:False(aiohttp默认对HTTPS启用SSL)
调试技巧
- 用抓包工具(如Wireshark)查看TCP三次握手过程,确认是客户端还是服务器端的问题
- 在请求前打印时间戳与目标URL,定位触发错误的具体请求
- 单独测试单个URL的连接耗时,排查是否是特定接口的问题
内容的提问来源于stack exchange,提问作者ChunMa716
相关产品推荐
相关产品推荐

