我在Ubuntu 16上使用python 3.5。
我正在尝试使用aiohttp编写一个简单的客户端。
这是我的代码。我从here拿走了它。它是第一个代码示例,禁用了ssl检查:
import aiohttp
import asyncio
import async_timeout
async def fetch(session, url):
with async_timeout.timeout(10):
async with session.get(url) as response:
return await response.text()
async def main(loop):
conn = aiohttp.TCPConnector(verify_ssl=False)
async with aiohttp.ClientSession(loop=loop, connector=conn) as session:
html = await fetch(session, 'http://www.google.com')
print(html)
loop = asyncio.get_event_loop()
loop.run_until_complete(main(loop))
loop = asyncio.get_event_loop()
loop.run_until_complete(main(loop))
对于某些网站,此代码有效。对于其他人,包括http://python.org
或http://google.com
,它不起作用。相反,代码会生成此错误:
aiohttp.errors.ClientOSError: [Errno 101] Cannot connect to host google.com:80 ssl:False [Can not connect to google.com:80 [Network is unreachable]]
我尝试了一个简单的requests
脚本,如下所示:
import requests
rsp = requests.get('http://google.com')
print(rsp.text)
这项工作,我能够到达谷歌。 curl和wget都可以访问google。
做一些研究,我遇到了一个不同的问题。这个问题与我自己的问题类似。我发现它here。我尝试了这里提供的解决方案,但它仍然不起作用。
所有网站都不会出现此问题。我遇到了http和https网站,这些网站有效且无效。
有关为何会发生这种情况的任何建议以及如何解决此问题?
谢谢!
注意:
我试过的其他事情。
https://www.google.com/?#q=python
答案 0 :(得分:9)
使用AsyncResolver作为连接的解析器时,我遇到了类似的问题。它曾经是默认的解析器,所以它可能是你的情况。该问题与ipv6的域有关,其中AsyncResolver存在问题所以解决方案是简单地将族指定为ipv4地址
conn = aiohttp.TCPConnector(
family=socket.AF_INET,
verify_ssl=False,
)