用urllib2下载zip文件失败

时间:2014-01-09 20:49:04

标签: python python-2.7 urllib zipfile

我正在尝试使用urllib下载文件。我正在使用这个rar的直接链接(如果我在此链接上使用chrome,它将立即开始下载rar文件),但是当我运行以下代码时:

file_name = url.split('/')[-1]
u = urllib.urlretrieve(url, file_name)

...我回来的是一个22kb的rar文件,这显然是错误的。这里发生了什么?我在OSX Mavericks w / python 2.7.5上,而here是网址。

(免责声明:这是一个免费下载,如乐队的website

2 个答案:

答案 0 :(得分:1)

知道了。标题缺少很多信息。我使用Requests,并且对于每个GET请求,我会将以下内容添加到标题中:

'Connection': 'keep-alive'
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML,     like Gecko) Chrome/31.0.1650.63 Safari/537.36'
'Cookie': 'JSESSIONID=36DAD704C8E6A4EF4B13BCAA56217961; ziplocale=en; zippop=2;'

然而,我注意到并非所有这一切都是必要的(只需要Cookie就可以了),但它确实有效 - 我能够下载整个文件。如果使用urllib2我肯定做同样的事情(发送具有适当标头内容的请求)就可以了。谢谢大家的好建议,并指出我正确的方向。我使用Fiddlr来查看与chrome的GET标头相比,我的请求GET标头丢失了什么。如果您遇到类似我的问题,我建议您查看。

答案 1 :(得分:0)

我使用以下代码用Python替换urlib并使用urllib2尝试使用Python:

url = "http://www29.zippyshare.com/d/12069311/2695/Del%20Paxton-Worst.%20Summer.%20Ever%20EP%20%282013%29.rar"

import urllib2

file_name = url.split('/')[-1]
response = urllib2.urlopen(url)
data = response.read()
with open(file_name, 'wb') as bin_writer:
    bin_writer.write(data)

我得到了相同的22k文件。在该URL上使用wget尝试生成相同的文件;但是我可以通过粘贴Chrome导航栏中的URL来开始下载完整文件(我记得约35MB)。也许他们根据您在请求中发送的标头提供不同的文件?用户代理GET请求标头与Python / wget的服务器(即不像浏览器)看起来不同,而不是单击按钮时从浏览器看到的。

我没有打开.rar档案来检查这两个文件。

This thread discusses setting headers with urllib2this is the Python documentation on how to read the response status codes from your urllib2 request也可能会有所帮助。