2014-01-09 28 views
1

我正在尝试使用urllib下载文件。我使用的是直接链接到这个RAR(如果我用Chrome打开此链接,它会立即开始下载RAR文件),但是当我运行下面的代码:使用urllib2下载zipfile失败

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

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

(免责声明:这是一个免费下载,对所看到的乐队的website

+0

你试过看zip文件还是调用'file'? – raser

+1

查看您正在使用的URL以排除故障将有所帮助。 –

+0

从URL获得文件名,'urlparse','posixpath'模块可能会有所帮助。参见['url2filename()'函数](http://stackoverflow.com/a/20478401/4279)。 – jfs

回答

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;' 

不过,我注意到,并非所有的这是必要的(只是曲奇所有你需要的),但它诀窍 - 我能够下载整个文件。如果使用urllib2,我相信做同样的事情(用适当的头文件内容发送请求)可以做到这一点。谢谢大家的好建议,并指引我朝着正确的方向发展。我使用Fiddlr来查看我的Requests GET头与chrome的GET头相比缺少了什么。如果你有类似的问题,我建议你检查一下。

0

我用下面的代码替换试图与Python的urliburllib2

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文件,用wget在该URL上尝试使用该文件会得到相同的文件;但是我可以通过在Chrome导航栏中粘贴URL来开始下载完整文件(大约35MB)(也许他们正在提供不同的文件根据您在请求中发送的标题? ser-Agent 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这可能也有帮助。

+0

感谢Chris,我意识到我正在被重定向到这个[link](http://www29.zippyshare.com/v/12069311/file.html)。我将我的chrome User-Agent信息复制并粘贴到我的请求标题中,但不断收到重定向。我会继续尝试。谢谢你到目前为止。 – b0ris

+0

没问题,对不起... –