首页 文章

python 3.5 asyncio和aiohttp Errno 101网络无法访问

提问于
浏览
8

我在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.orghttp://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)

这项工作,我能够达到谷歌 . 卷曲和wget也达到谷歌 .

做一些研究,我遇到了一个不同的问题 . 这个问题与我自己的问题类似 . 我发现它here . 我尝试了这里提供的解决方案,但它仍然无效 .

并非所有网站都会出现此问题 . 我遇到了http和https网站,这些网站有效且无效 .

有关为什么会发生这种情况的任何建议以及如何解决此问题

谢谢!

笔记:

我试过的其他事情 .

  • 添加我自己的DNS解析器,也使用aiohttp .

  • 使用网站的https版本,获得相同的错误 .

  • 转到略有不同的网址,例如 https://www.google.com/?#q=python

1 回答

  • 9

    使用AsyncResolver作为连接的解析器时,我遇到了类似的问题 . 它曾经是默认的解析器,所以它可能是你的情况 . 该问题与ipv6的域有关,其中AsyncResolver存在问题所以解决方案是简单地将族指定为ipv4地址

    conn = aiohttp.TCPConnector(
            family=socket.AF_INET,
            verify_ssl=False,
        )
    

相关问题