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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 20:15:44