2014-01-09 27 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

沒問題,對不起... –