urllib.urlopen 无法使用,有解决办法吗?

2 投票
5 回答
10618 浏览
提问于 2025-04-15 12:39

我遇到了一个“getaddress”错误,经过一番调查,发现可能是我的公司内部网络不允许连接(我猜是出于安全原因,虽然奇怪的是IE浏览器可以用,但Python却无法打开网址)。有没有什么安全的方法可以绕过这个问题呢?

这是具体的错误信息:

Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    b = urllib.urlopen('http://www.google.com')
  File "C:\Python26\lib\urllib.py", line 87, in urlopen
    return opener.open(url)
  File "C:\Python26\lib\urllib.py", line 203, in open
    return getattr(self, name)(url)
  File "C:\Python26\lib\urllib.py", line 342, in open_http
    h.endheaders()
  File "C:\Python26\lib\httplib.py", line 868, in endheaders
    self._send_output()
  File "C:\Python26\lib\httplib.py", line 740, in _send_output
    self.send(msg)
  File "C:\Python26\lib\httplib.py", line 699, in send
    self.connect()
  File "C:\Python26\lib\httplib.py", line 683, in connect
    self.timeout)
  File "C:\Python26\lib\socket.py", line 498, in create_connection
    for res in getaddrinfo(host, port, 0, SOCK_STREAM):
IOError: [Errno socket error] [Errno 11001] getaddrinfo failed

更多信息:我在使用urllib2.urlopen时也遇到了这个错误。

5 个回答

2

看起来像是DNS的问题。

因为你在用Windows系统,你可以试着运行这个命令:

nslookup www.google.com

来检查一下这个网址能不能成功解析。

如果不能,那就是网络设置的问题。

如果可以,那我们就得看看其他可能的原因了。

4

检查一下你是否在使用正确的代理。
你可以通过使用 urllib.getproxies 来获取代理信息(注意:getproxies 不适用于动态代理配置,比如使用 PAC 的情况)。

更新 关于空代理列表的信息,我建议使用一个 urlopener,并提供代理名称和信息。
这里有一些关于如何使用代理和 urlopeners 的好资料:

  1. Urllib 手册
  2. Michael Foord 的 urllib 介绍
7

你可能需要填写代理信息。

import urllib2
proxy_handler = urllib2.ProxyHandler({'http': 'http://yourcorporateproxy:12345/'})
proxy_auth_handler = urllib2.HTTPBasicAuthHandler()
proxy_auth_handler.add_password('realm', 'host', 'username', 'password')

opener = urllib2.build_opener(proxy_handler, proxy_auth_handler)
opener.open('http://www.stackoverflow.com')

撰写回答