2013-05-03 46 views
2

我正在python中構建爬蟲,我從頁面獲取了href的列表。我如何使用請求庫下載python中的所有類型的文件

現在我有文件擴展名列表,下載喜歡

list = ['zip','rar','pdf','mp3']

我怎樣才能將文件從該網址到本地目錄使用python

編輯保存:

​​
+0

這將真正幫助,如果你向我們展示你所代碼已經建成,得到的初始頁面,並拉出'href's ... – abarnert 2013-05-03 22:33:20

+0

此外,這是一個好主意名單列表'列表'。這就是'list'類型和構造函數的名稱,如果給變量賦予相同的名稱,則不能再使用它。 – abarnert 2013-05-03 22:35:18

+0

我更新了代碼 – user196264097 2013-05-03 22:42:22

回答

4

以您發佈的示例爲例:

import urllib2 
from bs4 import BeautifulSoup 

url = "http://www.example.com/downlaod" 

site = urllib2.urlopen(url) 
html = site.read() 
soup = BeautifulSoup(html) 

list_urls = soup.find_all('a') 

print list_urls[6] 

所以,你想要下一次獲取的URL大概是list_urls[6]['href']

第一個訣竅是這可能是一個相對的URL而不是絕對的。所以:

newurl = list_urls[6]['href'] 
absurl = urlparse.urljoin(site.url, newurl) 

此外,您只想獲取文件,如果有正確的擴展,所以:

if not absurl.endswith(extensions): 
    return # or break or whatever 

但是,一旦你決定要下載什麼網址,這是沒有困難比你的初始抓取:

page = urllib2.urlopen(absurl) 
html = page.read() 
path = urlparse.urlparse(absurl).path 
name = os.path.basename(path) 
with open(name, 'wb') as f: 
    f.write(html) 

這就是它的主要原因。

有幾件事情你可能想要添加,但如果是這樣,你必須手動添加它們。例如:

  • 查找帶有建議文件名的Content-disposition標頭以代替URL的基名稱。
  • copyfilepagef而不是read整個事情進入記憶,然後write出來。
  • 處理具有相同名稱的現有文件。
  • ...

但這就是基礎知識。

+1

感謝哥們,我會從那裏出發。當你從「r」到「f」說這是什麼意思。所以基本上所有文件都是我們可以編寫的內容。不要緊,如果它的MP3或PDF或ZIP。我以爲只有文本文件可以被讀寫 – user196264097 2013-05-03 23:03:27

+0

對不起,我使用'f'作爲'urlopen'的'open'和'r'打開的本地文件(因爲這是文檔在使用時的用途不使用'f')...但我應該已經意識到,我自己的代碼稱之爲「page」而不是「r」。我會編輯它,並感謝您指出它。 – abarnert 2013-05-03 23:08:53

+0

無論如何,是的,二進制文件仍然只是文件。 (除了在Windows上,你可能必須小心使用''wb''而不是''w'',所以Python不會試圖在文本中修改文本換行符,如果你切換到Python 3.x,二進制和文本之間的差異更有意義,但只要你使用2.x,我不想把它和你混淆)。而urllib2的全部內容是它可以讓你像處理文件一樣對待網頁。所以,真的,這只是從一個文件複製到另一個文件。 – abarnert 2013-05-03 23:10:46

3

您可以使用Python請求庫爲你問的問題:http://www.python-requests.org

您可以從網址保存文件是這樣的:

import requests 

url='http://i.stack.imgur.com/0LJdh.jpg' 

data=requests.get(url).content 

filename="image.jpg" 

with open(filename, 'wb') as f: 
     f.write(data) 
相關問題