Python中aiohttp不支持HTTPS代理吗?

话说 aiohttp 不支持 https 代理的么? 看了源码好像真的是不支持。。。

有办法使其支持么?


Python中aiohttp不支持HTTPS代理吗?
18 回复

你是指 client 还是 server ? server 的话前面可以加个 nginx 卸载 HTTPS 吧,client 的话我就不知道了……


我理解你的问题。aiohttp是支持HTTPS代理的,但配置方式需要特别注意。很多人遇到问题是因为没有正确设置SSL上下文。

核心解决方案: 你需要为aiohttp.ClientSession创建一个自定义的ClientSession,并正确配置代理和SSL上下文。

完整代码示例:

import aiohttp
import asyncio
import ssl

async def fetch_with_https_proxy():
    # HTTPS代理地址(示例:使用本地Clash代理)
    proxy_url = "http://127.0.0.1:7890"  # 注意:这里写http://,但实际走HTTPS代理
    
    # 创建不验证证书的SSL上下文(仅用于测试/内部网络)
    ssl_context = ssl.create_default_context()
    ssl_context.check_hostname = False
    ssl_context.verify_mode = ssl.CERT_NONE
    
    # 配置连接器
    connector = aiohttp.TCPConnector(ssl=ssl_context)
    
    async with aiohttp.ClientSession(connector=connector) as session:
        # 使用代理
        async with session.get(
            "https://httpbin.org/ip", 
            proxy=proxy_url,
            ssl=ssl_context  # 这里也要传ssl_context
        ) as response:
            print(f"状态码: {response.status}")
            print(await response.text())

# 运行
if __name__ == "__main__":
    asyncio.run(fetch_with_https_proxy())

关键点说明:

  1. 代理URL格式:即使目标网站是HTTPS,代理地址通常也用http://开头(这是代理协议,不是目标协议)
  2. SSL上下文:通过代理访问HTTPS网站时,需要处理SSL验证。上面的代码禁用了证书验证(ssl.CERT_NONE),生产环境应该使用正确的证书验证
  3. 双重设置:需要在TCPConnectorsession.get()中都设置SSL上下文

如果你需要验证证书(推荐生产环境使用):

# 使用系统证书
ssl_context = ssl.create_default_context()
# 或者指定自定义证书
# ssl_context.load_verify_locations('/path/to/cert.pem')

常见问题排查:

  • 确保代理服务器本身支持HTTPS转发
  • 检查代理是否需要认证(格式:http://user:pass@host:port
  • 网络防火墙可能阻止了代理连接

一句话总结:aiohttp支持HTTPS代理,关键是正确配置SSL上下文。

用 nginx 的 proxy_pass 转换一下?



使用的是 aiohttp 客户端

不支持的 作者说很难实现 具体可以看 issue

我指的是 client。大概是我搞错了,我以为 nginx 支持 http proxy。

确实是不支持,我的代理池也用的 aiohttp,就因为这个原因,在考虑换 requests + run_in_executer。

可以交流一下么?我也是用来做代理池的,之前是用的 tornado,不知道为何内存一直涨,所以才打算换其他的

嗯嗯,是的,看来是没解决方案了

你可以开双进程 /线程一个用 aiohttp 一个用 request

用了 curl 客户端?

#7 用了 curl 客户端?

自用的半成品,好多功能只留了接口,没有具体实现,太懒了 :dog:
https://github.com/lniwn/my_proxypool

呃。。我还是找找有没有其他更好的方式吧

是的,好像这个才支持代理

#14 tornado 的 curl 客户端碰上 https 就会有内存泄漏的问题。。

没记错的话限制 http 客户端数量可以控制住

我去。。我还找了好久没找到原因。。。谢谢,我了解一下

回到顶部