【问题标题】:python 3.5 asyncio and aiohttp Errno 101 Network is unreachablepython 3.5 asyncio 和 aiohttp Errno 101 网络无法访问
【发布时间】:2016-10-31 17:52:58
【问题描述】:

我在 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)

这行得通,我可以访问谷歌。 curl 和 wget 都可以访问 google。

做一些研究,我遇到了一个不同的问题。这个问题和我自己的差不多。我找到了here。我尝试了此处提供的解决方案,但仍然无法正常工作。

并非所有网站都会出现此问题。我遇到了有效和无效的 http 和 https 网站。

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

谢谢!

注意事项:

我尝试过的其他事情。

  1. 添加我自己的 DNS 解析器,同样使用 aiohttp。
  2. 使用 https 版本的网站,遇到同样的错误。
  3. 转到一个稍微不同的网址,例如https://www.google.com/?#q=python

【问题讨论】:

  • 您好!你解决了这个问题吗?我得到了同样的错误,只有对我有用的解决方法(除了我不能做的指定 family=socket.AF_INET) - 为每个请求创建会话,但这不是一个好的解决方案。
  • 嘿。是的,但我忘了怎么做,因为那是很久以前的事了。让我检查一下,如果我找到答案,我会回复你。
  • 尝试将 'family=socket.AF_INET' 添加到连接器或将 'allow_redirects=True'(可能不是这个)添加到会话中。
  • 不幸的是,我无法做到这一点,我的应用程序在此设置下完全停止工作,我想也许你以不同的方式解决了这个问题,无论如何感谢您的回复。
  • 对不起,是的,我看到你写了那个,我没有很好地阅读这个问题。由于家族标志将您限制为 IPv4 IP,也许您可​​以在代码中设置一个开关,其中可以使用 IPv4 地址访问的域使用异步代码,而严格的 IPv6 使用其他代码。

标签: python python-3.x python-asyncio aiohttp


【解决方案1】:

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

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

【讨论】:

  • 回顾代码,或许就是答案。与问题中的代码不同,现在我有像你一样的家庭标志。
  • 非常感谢你真的救了我
猜你喜欢
  • 2021-04-11
  • 1970-01-01
  • 2016-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-19
  • 2013-02-03
相关资源
最近更新 更多