我想用urllib获取一个IPv6页面。 可以使用square-brack-IPv6表示法,但我不知道如何(轻松)说服python在我给它FQDN时执行IPv6请求 就像下面的ip是:https://www.dslreports.com/whatismyip
from sys import version_info
PY3K = version_info >= (3, 0)
if PY3K:
import urllib.request as urllib
else:
import urllib2 as urllib
url = None
opener = urllib.build_opener()
opener.addheaders = [('User-agent',
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36")]
url = opener.open("http://[2607:fad0:3706:1::1000]/whatismyip", timeout=3)
content = url.read()
[更新:这一行关于python2/python3不再有效,因为问题已经更新]
首先,您似乎使用了python2。这一点很重要,因为urllib模块在python3中被拆分为多个部分并重命名。在
其次,您的代码片段似乎不正确:build\u opener不是urllib可用的函数。它可用于urllib2。在
因此,我假设您的代码实际上是以下代码:
如果您的DNS解析程序正确地处理IPv6资源记录,并且您的操作系统是使用双堆栈IPv4/IPv6或单IPv6纯堆栈构建的,并且您的IPv6网络路径正确到dslreports.com网站,此Python程序将使用IPv6连接到www.dslreports.com。因此,不需要说服python执行IPv6请求。在
我终于解决了我的问题。不是用最优雅的方式,但对我有用。在
阅读后:
Force requests to use IPv4 / IPv6 和 Python urllib2 force IPv4
我决定做一个DNS查找,只发送一个带有FQDN的主机头来获取内容。(VHOST需要主机头)
下面是一段丑陋的片段:
这远不是理想的,它可以更干净,但它对我有效。在
它在这里实现:https://github.com/SteveClement/ipgetter/tree/IPv6 这只需浏览一个服务器列表,这些服务器会返回您的边界网关ip,现在也在IPv6中。在
相关问题 更多 >
编程相关推荐