urllib2.urlopen无法使用我的正常DNS服务器查找主机名;dig等可以

1 投票
1 回答
2957 浏览
提问于 2025-04-17 02:33

我正在尝试解决一个关于urllib2.urlopen的问题。它似乎无法使用我常用的DNS服务器。下面是我尝试打开不同网址的结果,第一次是用谷歌的公共DNS(8.8.8.8),第二次是用我的路由器。gridley这个名字在我的/etc/hosts文件中有定义。

Python 2.7.2 (default, Jun 29 2011, 11:17:09) 
[GCC 4.6.1] on linux2
>>> import urllib2
>>> urllib2.urlopen("http://gridley")
<addinfourl at 158490988 whose fp = <socket._fileobject object at 0xb745f7ec>>
>>> urllib2.urlopen("http://google.com")
<addinfourl at 158492204 whose fp = <socket._fileobject object at 0x971842c>>

Python 2.7.2 (default, Jun 29 2011, 11:17:09) 
[GCC 4.6.1] on linux2
>>> import urllib2
>>> urllib2.urlopen("http://gridley")
<addinfourl at 154808684 whose fp = <socket._fileobject object at 0xb73997ec>>
>>> urllib2.urlopen("http://google.com")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/urllib2.py", line 126, in urlopen
    return _opener.open(url, data, timeout)
  File "/usr/lib/python2.7/urllib2.py", line 394, in open
    response = self._open(req, data)
  File "/usr/lib/python2.7/urllib2.py", line 412, in _open
    '_open', req)
  File "/usr/lib/python2.7/urllib2.py", line 372, in _call_chain
    result = func(*args)
  File "/usr/lib/python2.7/urllib2.py", line 1199, in http_open
    return self.do_open(httplib.HTTPConnection, req)
  File "/usr/lib/python2.7/urllib2.py", line 1174, in do_open
    raise URLError(err)
urllib2.URLError: <urlopen error [Errno -5] No address associated with hostname

不过,用dig查询google.com显示它应该是可以工作的:

; <<>> DiG 9.8.1 <<>> google.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 44377
;; flags: qr rd ra; QUERY: 1, ANSWER: 5, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;google.com.            IN  A

;; ANSWER SECTION:
google.com.     190 IN  A   74.125.225.83
google.com.     190 IN  A   74.125.225.81
google.com.     190 IN  A   74.125.225.82
google.com.     190 IN  A   74.125.225.80
google.com.     190 IN  A   74.125.225.84

;; Query time: 23 msec
;; SERVER: 192.168.7.254#53(192.168.7.254)
;; WHEN: Sun Sep 18 19:46:12 2011
;; MSG SIZE  rcvd: 108

IPv6导致了一些其他问题,但现在已经完全关闭了,所以这不是原因。到底发生了什么事呢?

1 个回答

1

这不是一个完整的答案……但要注意,使用 dig 查询主机名的方式和使用 urlopen 是不一样的。dig 主要是一个 DNS 查询工具,而你的系统可能会从多个来源查找主机信息(比如本地的 hosts 文件、NIS、LDAP 等等)。

当你输入:

urllib2.urlopen("http://google.com")

你的操作系统可能会检查多个来源。在 Linux 系统中,具体检查哪些内容是由 /etc/nsswitch.conf 文件中的 hosts 条目来控制的。你可以使用 getent 工具来检查主机名的查找方式,这和 urlopen 的方式类似:

getent hosts google.com

你的问题没有提到你使用的操作系统,也没有明确说明第一个和第二个例子之间具体发生了什么变化(你是编辑了某个文件?还是在设置对话框中更改了某个选项?)。

如果你在使用 Linux,提供你在做任何更改前后的 resolv.conf 文件和 nsswitch.conf 文件可能会帮助诊断问题。如果你不是在使用 Linux,说明你的操作系统可能会得到更有用的答案。

撰写回答