urllib.urlopen无法正常工作。有解决方法吗?

时间:2009-07-02 22:25:44

标签: python url

我收到一个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 个答案:

答案 0 :(得分: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')

答案 1 :(得分:4)

检查您使用的是正确的代理。
您可以使用urllib.getproxies获取代理信息(注意:getproxies 使用动态代理配置,就像使用PAC时一样)。

更新根据有关空代理列表的信息,我建议使用urlopener,其中包含代理名称和信息。
关于如何使用代理urlopeners的一些很好的信息:

  1. Urllib manual
  2. Michael Foord's introduction to urllib

答案 2 :(得分:2)

这可能是DNS问题,请尝试使用您正在访问的Web服务器的IP地址,即

import urllib
URL="http://66.102.11.99"   # www.google.com
f = urllib.urlopen(URL)
f.read()

如果成功,那么它可能是DNS问题而不是代理问题(但您还应检查代理设置)。

答案 3 :(得分:2)

看起来像DNS问题。

由于您使用的是Windows,因此可以尝试运行此命令

nslookup www.google.com

检查网址是否可以成功解析。

如果没有,则是网络设置问题

如果没问题,那么我们必须考虑可能的替代原因

答案 4 :(得分:2)

我遇到了同样的问题。 在我的系统中,代理配置是通过.PAC文件。 所以我打开了那个文件,拿出了默认的代理网址,对我来说是http://168.219.61.250:8080/

以下测试代码对我有用:

import urllib2

proxy_support = urllib2.ProxyHandler({'http': 'http://168.219.61.250:8080/'})
opener = urllib2.build_opener(proxy_support)
urllib2.install_opener(opener)
response = urllib2.urlopen('http://python.org/')
html = response.read()
print html

如果您的代理需要身份验证,则可能需要添加更多代码

希望这会有所帮助!!