通过HTTP代理发送一次aiohttp请求
用aiohttp通过免认证HTTP代理发出请求,检查响应状态,并在明确的异步生命周期内结束。
通过免认证HTTP代理发送一次异步请求时,直接在session.get()调用中指定代理。如有需要,先将aiohttp加入项目:
uv add aiohttp将下面的文档示例地址替换成你的HTTP监听端点,或HTTP代理列表中的候选。它必须允许对HTTPS目标建立CONNECT;仅支持SOCKS的端点需要合适的连接器,不能直接使用这里的proxy参数。
import asyncio
import aiohttp
async def main():
timeout = aiohttp.ClientTimeout(total=15, connect=5)
async with aiohttp.ClientSession(
timeout=timeout,
trust_env=False,
) as session:
async with session.get(
"https://example.com/",
proxy="http://203.0.113.10:8080",
) as response:
print(response.status)
print((await response.text())[:200])
asyncio.run(main())
请求会打印HTTP状态及响应文本的前200个字符。这里的403或429仍然是可以检查的响应;如果应用需要将失败状态转成异常,再调用response.raise_for_status()。异步上下文管理器会在代码块结束时关闭会话和响应,发生异常时也一样。
15秒的total预算涵盖请求操作。5秒的connect预算还包括等待连接池中的可用连接,因此连接池繁忙时,可能在新套接字打开前就耗尽预算。把这次单独调用改成并发检查时,这个区别很重要。
trust_env=False让示例路径保持明确。aiohttp默认不读取代理环境变量;在另一个终端导出变量,并不会配置这里的调用。只有当进程继承的环境就是预期路由策略时,才选择trust_env=True。