尝试使用Python中的urllib2访问Internet

时间:2012-01-06 17:07:29

标签: python urllib2

我正在尝试编写一个程序,该程序将(从其他方面)从预定的网站获取文本或源代码。我正在学习Python来做这件事,大多数消息来源告诉我使用urllib2。就像测试一样,我尝试了这段代码:

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

而不是以任何预期的方式行动,shell只是坐在那里,就像它正在等待一些输入。甚至没有“>>>"或”...“。退出此状态的唯一方法是使用[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的工具,或者您可以提供有关如何解决此问题的建议。我在工作中使用的是网络计算机,而且我不完全确定shell的配置方式或可能会对其产生什么影响。

4 个答案:

答案 0 :(得分:4)

概率为99.999%,这是代理问题。 Python在检测正确的http代理时使用非常糟糕,当它找不到合适的代理时,它就会挂起并最终超时。

首先,您必须找出应使用的代理,检查浏览器的选项(工具 - &gt; Internet选项 - &gt;连接 - &gt; LAN设置...在IE中等)。如果它使用脚本进行自动配置,则必须获取脚本(应该是某种类型的javascript)并找出您的请求应该去的位置。如果没有指定脚本并且勾选了“自动确定”选项,那么您也可以问一下贵公司的IT人员。

我假设您使用的是Python 2.x.来自urllib上的Python文档:

# 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,就像this page中的例子一样。可能需要也可能不需要身份验证(通常不是)。

答案 1 :(得分:2)

对于“如何使用urllib2执行此操作”,这不是一个好的答案,但是让我建议python-requests。它存在的全部原因是因为作者发现urllib2是一个笨重的混乱。他可能是对的。

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

我几乎立即得到404错误(没有挂起):

>>> import urllib2
>>> response = urllib2.urlopen('http://www.python.org/fish.html')
Traceback (most recent call last):
  ...
urllib2.HTTPError: HTTP Error 404: Not Found

如果我尝试联系一个没有运行HTTP服务器的地址,它会挂起很长一段时间,直到超时发生。您可以通过将timeout参数传递给urlopen来缩短它:

>>> response = urllib2.urlopen('http://cs.princeton.edu/fish.html', timeout=5)
Traceback (most recent call last):
  ...
urllib2.URLError: <urlopen error timed out>