Urllib2 HTTPS截断响应

时间:2012-11-04 20:08:05

标签: python https urllib2 urlopen

我正在尝试使用urllib2.urlopen获取页面(实际上,我正在使用mechanize,但这是mechanize调用的方法)当我获取页面时,我正在获取反应不完整;页面被截断。但是,如果我访问该页面的非HTTPS版本,我将获得完整的页面。

我在Arch Linux(3.5.4-1-ARCH x86_64)上。我正在运行openssl 1.0.1c。在我拥有的另一台Arch Linux机器上会出现此问题,但在使用Python 3(3.3.0)时则不会出现此问题。

此问题似乎与urllib2 not retrieving entire HTTP response有关。

我在唯一允许我使用urllib2(Py I/O)的在线Python解释器上进行测试,并且它按预期工作。这是代码:

import urllib2

u = urllib2.urlopen('https://wa151.avayalive.com/WAAdminPanel/login.aspx?ReturnUrl=%2fWAAdminPanel%2fprivate%2fHome.aspx')

print u.read()[-100:]

最后一行应包含通常的</body></html>

当我在我的机器上尝试urllib.urlretrieve时,我得到:

ContentTooShortError: retrieval incomplete: got only 11365 out of 13805 bytes

我无法在在线解释器上测试urlretrieve,因为它不会让用户写入临时文件。晚上晚些时候,我会尝试从我的机​​器上获取URL,但是从其他位置获取。

1 个答案:

答案 0 :(得分:5)

我在不同的Linux系统上使用Python 2.7得到了同样的错误:

>>> urllib.urlretrieve('https://wa151.avayalive.com/WAAdminPanel/login.aspx?ReturnUrl=%2fWAAdminPanel%2fprivate%2fHome.aspx')
---------------------------------------------------------------------------
ContentTooShortError                      Traceback (most recent call last)
...
ContentTooShortError: retrieval incomplete: got only 11365 out of 13805 bytes

但是,使用requests

可以完成相同的操作(实际上对我有效)
>>> import requests
>>> r = requests.get('https://wa151.avayalive.com/WAAdminPanel/login.aspx?ReturnUrl=%2fWAAdminPanel%2fprivate%2fHome.aspx')
>>> with open(somefilepath, 'w') as f:
...     f.write(r.text)

这对你有用吗?