为什么我在Windows上无法使用Python的urlopen()方法?

6 投票
5 回答
32141 浏览
提问于 2025-04-15 23:15

为什么这段简单的Python代码不工作呢?

import urllib
file = urllib.urlopen('http://www.google.com')
print file.read()

我遇到的错误是:

Traceback (most recent call last):
  File "C:\workspace\GarchUpdate\src\Practice.py", line 26, in <module>
    file = 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 206, in open
    return getattr(self, name)(url)
  File "C:\Python26\lib\urllib.py", line 345, in open_http
    h.endheaders()
  File "C:\Python26\lib\httplib.py", line 892, in endheaders
    self._send_output()
  File "C:\Python26\lib\httplib.py", line 764, in _send_output
    self.send(msg)
  File "C:\Python26\lib\httplib.py", line 723, in send
    self.connect()
  File "C:\Python26\lib\httplib.py", line 704, in connect
    self.timeout)
  File "C:\Python26\lib\socket.py", line 514, in create_connection
    raise error, msg
IOError: [Errno socket error] [Errno 10060] A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond

我尝试过不同的网页,但我总是无法正确执行urlopen这个方法。

5 个回答

1

如果你有Wireshark这个工具,可以看看发送了什么数据,以及是否有任何回应。这样你就能更好地排查问题,特别是能看到发送的GET请求。

我记得我之前也遇到过类似的问题,我做的就是清空我的DNS缓存。

你可以在命令行输入(ipconfig /flushdns)然后重启一下。这样解决了我的问题。试试看也没坏处。

3

如果你能改动一些代码,可以试试用urllib2这个库。记得设置超时时间,单位是秒。

比如:

urllib2.urlopen(http://www.abc.com/api, timeout=20)

这样连接的时间会更长一些。所以如果你在读取一个特别大的XML文件,这样可以避免读取不完整的情况。

不过,如果网络连接很慢或者突然断开,上面的代码就不会起作用了。

5

你的代码并不是问题所在。

你在IE浏览器里有没有设置代理?

这是Python文档中关于urllib.urlopen的说明:

在Windows环境下,如果没有设置代理的环境变量,
那么代理设置会从注册表的互联网设置部分获取。

撰写回答