在Python中使用urllib2访问互联网

2 投票
4 回答
6047 浏览
提问于 2025-04-17 09:41

我正在尝试写一个程序,主要是从一个预定的网站获取文本或源代码。为此,我在学习Python,大多数资料都建议我使用 urllib2。作为测试,我试了以下代码:

import urllib2
response = urllib2.urlopen('http://www.python.org')
html = response.read()

但是,运行后并没有像我预期的那样工作,命令行就在那里静静地等着,好像在等我输入什么。连">>>"或"..."这样的提示都没有。要退出这种状态,我只能按 [ctrl]+c。按下后,我收到了很多错误信息,比如:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/m/mls/pkg/ix86-Linux-RHEL5/lib/python2.5/urllib2.py", line 124, in urlopen
    return _opener.open(url, data)
  File "/m/mls/pkg/ix86-Linux-RHEL5/lib/python2.5/urllib2.py", line 381, in open
    response = self._open(req, data)

我希望能得到一些反馈。有没有比 urllib2 更好的工具可以使用,或者能给我一些建议,帮我解决这个问题吗?我在公司使用的是网络电脑,不太确定命令行的配置情况,这可能会影响到什么。

4 个回答

0

这真是太奇怪了,你试过换一个网址吗?
如果没有的话,可以试试HTTPLib,不过这个用起来会复杂一些。下面是你用HTTPLib的例子:

import httplib as h
domain = h.HTTPConnection('www.python.org')
domain.connect()
domain.request('GET', '/fish.html')
response = domain.getresponse()
if response.status == h.OK:
    html = response.read()
3

这不是一个关于“如何用urllib2来做这个”的好答案,但我想推荐一下python-requests。这个库的出现就是因为作者觉得urllib2太复杂、太麻烦了。而他可能说得没错。

4

有99.999%的可能性,这是一个代理的问题。Python在找合适的http代理方面非常糟糕,当它找不到合适的代理时,就会卡住,最后超时。

所以,首先你得弄清楚应该用哪个代理,可以查看你浏览器的设置选项(在IE中是工具 -> Internet选项 -> 连接 -> 局域网设置...)。如果是用脚本自动配置的,你需要获取这个脚本(应该是某种javascript),然后找出你的请求应该发送到哪里。如果没有指定脚本,并且“自动检测”选项被勾选,那你不如直接问问公司里的IT人员。

我假设你在用Python 2.x。从Python文档中的urllib来看:

# Use http://www.someproxy.com:3128 for http proxying
proxies = {'http': 'http://www.someproxy.com:3128'}
filehandle = urllib.urlopen(some_url, proxies=proxies)

注意,ProxyHandler在确定默认值时的情况,实际上在你使用urlopen时就已经发生了,所以这可能不会有效。

如果你真的想用urllib2,你需要指定一个ProxyHandler,就像在这个页面中的例子那样。是否需要身份验证可能是有的也可能没有(通常是不需要的)。

撰写回答