Windows7下Anaconda Python3.6.3异步请求遇ClientConnectorError求助
解决Windows 7下Anaconda Python 3.6.3异步请求的ClientConnectorError问题
我在Windows 7 64位系统的Anaconda Python 3.6.3环境中,尝试用以下代码发起异步请求获取URL(代码来自某文章):
import asyncio from aiohttp import ClientSession async def hello(url): async with ClientSession() as session: async with session.get(url) as response: response = await response.read() print(response) loop = asyncio.get_event_loop() loop.run_until_complete(hello("http://httpbin.org/headers"))
但运行后遇到了这个错误:
ClientConnectorError: Cannot connect to host httpbin.org:80 ssl:False [getaddrinfo failed] Traceback (most recent call last): File "<ipython-...
排查与解决方法
我之前也踩过类似的坑,给你几个实用的解决方向:
先确认网络基础连通性:
getaddrinfo failed本质是DNS解析失败,先打开浏览器访问http://httpbin.org/headers,如果浏览器也打不开,那问题出在网络本身——可能是防火墙拦截了请求、网络需要代理,或者DNS服务器挂了。先把基础网络问题搞定。配置代理(如果你的网络需要):aiohttp默认不会自动读取系统代理设置,如果你的网络必须走代理,得手动给
ClientSession加代理参数:import asyncio from aiohttp import ClientSession, TCPConnector async def hello(url): # 替换成你的代理地址和端口 connector = TCPConnector(proxy="http://your-proxy-address:port") async with ClientSession(connector=connector) as session: async with session.get(url) as response: response = await response.read() print(response) loop = asyncio.get_event_loop() loop.run_until_complete(hello("http://httpbin.org/headers"))升级aiohttp版本:Python 3.6.3属于比较老的版本,对应的aiohttp初始版本可能存在Windows 7下的DNS解析bug。试试用conda升级到兼容py3.6的稳定版本:
conda install aiohttp==3.8.6这个版本对Python 3.6的兼容性很好,能解决不少老版本的兼容性问题。
手动指定DNS服务器:如果是DNS解析的问题,可以强制aiohttp用指定的DNS服务器(比如国内的114.114.114.114):
import asyncio from aiohttp import ClientSession, TCPConnector, AsyncResolver async def hello(url): resolver = AsyncResolver(nameservers=["114.114.114.114"]) connector = TCPConnector(resolver=resolver) async with ClientSession(connector=connector) as session: async with session.get(url) as response: response = await response.read() print(response) loop = asyncio.get_event_loop() loop.run_until_complete(hello("http://httpbin.org/headers"))禁用IPv6:Windows 7的IPv6配置有时候会出问题,导致解析优先尝试IPv6失败。可以强制aiohttp只用IPv4:
import asyncio import socket from aiohttp import ClientSession, TCPConnector async def hello(url): connector = TCPConnector(family=socket.AF_INET) async with ClientSession(connector=connector) as session: async with session.get(url) as response: response = await response.read() print(response) loop = asyncio.get_event_loop() loop.run_until_complete(hello("http://httpbin.org/headers"))
内容的提问来源于stack exchange,提问作者BioGeek
相关产品推荐
相关产品推荐

