【发布时间】: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.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 网站。
关于为什么会发生这种情况以及如何解决这个问题的任何建议?
谢谢!
注意事项:
我尝试过的其他事情。
- 添加我自己的 DNS 解析器,同样使用 aiohttp。
- 使用 https 版本的网站,遇到同样的错误。
- 转到一个稍微不同的网址,例如
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