turntohotcool 2025-08-10 23:15 采纳率: 14.3%
浏览 8

python爬虫ClientConnectorSSLError如何解决?


url="https://price.mofcom.gov.cn/datamofcom/front/ExchFinancialDyna/searchlist/query"
result=None
async with aiohttp.ClientSession(connector=TCPConnector(ssl=False)) as session:    
    data={"currency_namc":"日元","pageNumber":"2","pageSize":"15"}
    async with session.post(url,data=data,headers=headers) as response:
        result= await response.json()
    #result= await fetch_url(session,"2")
print(result)





ClientConnectorSSLError                   Traceback (most recent call last)
Cell In[1], line 51
     49 async with aiohttp.ClientSession(connector=TCPConnector(ssl=False)) as session:    
     50     data={"currency_namc":"日元","pageNumber":"2","pageSize":"15"}
---> 51     async with session.post(url,data=data,headers=headers) as response:
     52         result= await response.json()
     53     #result= await fetch_url(session,"2")
ClientConnectorSSLError: Cannot connect to host price.mofcom.gov.cn:443 ssl:default [[SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] sslv3 alert handshake failure (_ssl.c:1006)]
  • 写回答

6条回答 默认 最新

  • 檀越@新空间 2025-08-10 23:16
    关注

    晚上好🌙🌙🌙
    本答案参考通义千问

    出现 ClientConnectorSSLError 错误,通常是由于 SSL/TLS 握手失败 导致的。这可能是因为目标网站(如 price.mofcom.gov.cn)使用了不兼容的 SSL 协议版本、证书问题或服务器配置限制。

    以下是你遇到的问题的详细分析和解决方案:


    ✅ 问题原因分析

    1. SSL 握手失败:错误信息中的 SSLV3_ALERT_HANDSHAKE_FAILURE 表明客户端与服务器之间的 SSL/TLS 握手失败。
    2. 服务器端 SSL 配置限制:该网站可能只支持某些特定的 SSL/TLS 版本或加密套件,而你的 Python 环境默认使用的配置不匹配。
    3. aiohttp 默认 SSL 配置:默认情况下,aiohttp 使用的是系统提供的 SSL 库,可能会与服务器要求的 SSL 版本不兼容。

    🔧 解决方案

    1. 升级 aiohttp 和相关依赖库

    确保你使用的是最新版本的 aiohttpcryptography,因为旧版本可能存在 SSL 兼容性问题。

    pip install --upgrade aiohttp cryptography
    

    2. 自定义 SSL 上下文,指定更兼容的 SSL 协议

    你可以创建一个自定义的 SSL 上下文,并禁用不兼容的协议(例如 SSLv3),同时启用 TLSv1.2 或更高版本。

    ✅ 修改后的代码如下:

    import aiohttp
    import asyncio
    from ssl import create_default_context, PROTOCOL_TLS_CLIENT
    
    # 自定义 SSL 上下文
    ssl_ctx = create_default_context()
    ssl_ctx.options |= (ssl.OP_NO_SSLv3 | ssl.OP_NO_SSLv2 | ssl.OP_NO_TLSv1 | ssl.OP_NO_TLSv1_1)
    ssl_ctx.set_ciphers('HIGH:!aNULL:!MD5')  # 设置加密套件
    
    async def fetch_data():
        url = "https://price.mofcom.gov.cn/datamofcom/front/ExchFinancialDyna/searchlist/query"
        headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
        }
        data = {"currency_namc": "日元", "pageNumber": "2", "pageSize": "15"}
    
        async with aiohttp.ClientSession(connector=aiohttp.TCPConnector(ssl=ssl_ctx)) as session:
            try:
                async with session.post(url, data=data, headers=headers) as response:
                    result = await response.json()
                    print(result)
            except Exception as e:
                print(f"Error: {e}")
    
    # 运行异步任务
    asyncio.run(fetch_data())
    

    3. 禁用 SSL 验证(仅用于测试)

    如果你只是在测试阶段,可以暂时禁用 SSL 验证,但这不推荐用于生产环境。

    ⚠️ 注意:禁用 SSL 验证会带来安全风险,仅限测试使用。

    import aiohttp
    import asyncio
    
    async def fetch_data():
        url = "https://price.mofcom.gov.cn/datamofcom/front/ExchFinancialDyna/searchlist/query"
        headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
        }
        data = {"currency_namc": "日元", "pageNumber": "2", "pageSize": "15"}
    
        async with aiohttp.ClientSession(connector=aiohttp.TCPConnector(ssl=False)) as session:
            try:
                async with session.post(url, data=data, headers=headers) as response:
                    result = await response.json()
                    print(result)
            except Exception as e:
                print(f"Error: {e}")
    
    asyncio.run(fetch_data())
    

    4. 检查目标网站是否支持 HTTPS

    有些网站虽然使用 HTTPS,但可能对客户端有额外的限制(如浏览器指纹、Referer 头等)。你可以尝试在浏览器中访问该 URL,观察是否能正常加载页面,如果不能,可能是网站本身的问题。


    🛠️ 重点总结

    • SSL 握手失败 是导致 ClientConnectorSSLError 的主要原因。
    • 自定义 SSL 上下文 可以解决 SSL 协议不兼容问题。
    • 禁用 SSL 验证 只适用于测试环境。
    • 升级 aiohttp 和 cryptography 可以提升兼容性。

    🧪 测试建议

    • 如果你无法连接到该网站,可以尝试更换其他 HTTPS 网站进行测试,确认是否是目标网站的问题。
    • 使用工具如 curlPostman 测试该 URL,查看是否能成功获取响应。

    如有更多问题,欢迎继续提问!

    评论

报告相同问题?

问题事件

  • 创建了问题 8月10日