如何在aiohttp中使用HTTPS代理获取HTTPS URL数据?
解决aiohttp使用HTTPS代理的可行方案
嘿,我明白你遇到的困扰了——aiohttp对HTTPS代理的支持确实有点容易踩坑,我来给你几个亲测有效的解决思路:
方案一:用HTTP代理处理HTTPS目标(最简便的尝试)
很多时候,所谓的「HTTPS代理」其实本质是支持CONNECT方法的HTTP代理,完全可以用来访问HTTPS目标。你可以试试把请求里的代理换成HTTP版本的,不管目标URL是http还是https:
async def fetch(url, session): # 统一使用HTTP代理处理所有请求 async with session.get(url, proxy=proxies['http']) as response: res_dic = await response.json() status = response.status print(f"请求状态: {status}") return res_dic loop = asyncio.get_event_loop() with ClientSession(headers=headers) as session: # 注意这里要使用asyncio.gather来批量执行任务 tasks = [asyncio.ensure_future(fetch(url, session)) for url in urls] loop.run_until_complete(asyncio.gather(*tasks)) loop.close()
方案二:使用aiohttp-socks库兼容HTTPS代理
如果方案一无效,推荐用专门的代理扩展库aiohttp-socks,它对各种代理类型(包括HTTPS)的兼容性更好:
- 先安装依赖:
pip install aiohttp-socks
- 修改代码配置代理:
from aiohttp_socks import ProxyConnector async def fetch(url, session): async with session.get(url) as response: res_dic = await response.json() status = response.status print(f"请求状态: {status}") return res_dic loop = asyncio.get_event_loop() # 直接用代理URL初始化Connector connector = ProxyConnector.from_url(proxies['https']) with ClientSession(headers=headers, connector=connector) as session: tasks = [asyncio.ensure_future(fetch(url, session)) for url in urls] loop.run_until_complete(asyncio.gather(*tasks)) loop.close()
方案三:通过环境变量配置全局代理
如果需要批量使用代理,也可以通过设置环境变量让aiohttp自动读取代理配置:
import os import asyncio from aiohttp import ClientSession # 设置全局代理环境变量 os.environ['HTTP_PROXY'] = proxies['http'] os.environ['HTTPS_PROXY'] = proxies['https'] async def fetch(url, session): async with session.get(url) as response: res_dic = await response.json() status = response.status print(f"请求状态: {status}") return res_dic loop = asyncio.get_event_loop() # 创建session时开启trust_env,自动读取环境变量代理 with ClientSession(headers=headers, trust_env=True) as session: tasks = [asyncio.ensure_future(fetch(url, session)) for url in urls] loop.run_until_complete(asyncio.gather(*tasks)) loop.close()
另外注意你原来代码里的一个小问题:loop.run_until_complete(*[...])的写法是错误的,应该用asyncio.gather(*tasks)把所有任务打包后再传给run_until_complete,否则会报错。
内容的提问来源于stack exchange,提问作者aksh02
相关产品推荐
相关产品推荐

