2012-01-06 40 views
1

我试图编写一个程序,该程序将(从其他地方)从预定网站获取文本或源代码。我正在学习Python来做到这一点,并且大多数消息来源告诉我使用urllib2。正如一个考验,我想这样的代码:试图在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) 

我会很感激任何反馈意见,有没有其他的工具可以使用,或者你可以给出解决这个问题的建议,我在我的工作中使用网络计算机,我不完全确定shell是如何工作的配置或如何可能有什么影响。

+0

您正在获取堆栈跟踪,这意味着引发了异常。发布整个堆栈跟踪将使诊断更容易。 – mipadi 2012-01-06 17:09:24

回答

3

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

所以首先你必须找出应该使用哪个代理,检查浏览器的选项(工具 - > Internet选项 - >连接 - >在IE中的LAN设置...等)。如果它使用脚本进行自动配置,则必须获取脚本(应该是某种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中的例子。身份验证可能需要也可能不需要(通常不需要)。

+0

谢谢。事实证明,这确实是一个代理问题。我解决它使用 'proxypassmgr = urllib2.HTTPPasswordMgrWithDefaultRealm() proxypassmgr.add_password(无, 'HTTP:// proxyaddress:端口号',用户名,密码) AUTHINFO = urllib2.ProxyBasicAuthHandler(proxypassmgr) proxy_support = urllib2.ProxyHandler( {“http”:“http://cache1.lexmark.com:80”}) opener = urllib2.build_opener(proxy_support,authinfo) urllib2.install_opener(opener) req = urllib2.Request(theurl)' – 2012-02-27 20:59:26

0

这是非常奇怪的,你尝试过不同的URL?
否则有HTTPLib,但它是更复杂d。下面是使用你的榜样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() 
+0

这是对第三行做同样的没有回应的事情。以下是它给出的错误: 回溯(最近一次通话的最后一次): 文件“”,第1行,在? 文件“/usr/lib/python2.4/httplib.py”,第626行,连接 self.sock.connect(sa) 文件“”,第1行,连接 – 2012-01-06 18:39:03

+0

Python 2.4?你的设置多大? – 2012-01-06 22:45:29

+0

就像我说的,你有没有尝试过与另一个网站?因为只要在Chrome中输入“http:// python.org/fish.html”就会产生404错误,这可能是错误的原因 – ProfSmiles 2012-01-07 09:27:35

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服务器运行的地址,它挂起持续了很长一段时间,直到超时发生。您可以通过超时参数传递给urlopen缩短:

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

是的,请删除“鱼”部分。该页面不存在,我不知道我在哪里。我现在只用www.python.org来尝试它,但它仍然不起作用。 – 2012-01-06 18:40:54

2

这不是一个很好的回答“如何使用的urllib2做到这一点”,但让我建议python-requests。它存在的全部原因是因为作者发现urllib2是一个笨拙的混乱。他可能是对的。