2015-07-01 54 views
0

使用python腳本從網站上抓取多個文件。使用原始文件名的Python機械化下載文件

下載HTML表單是這樣的:

<span> 
    <a class="tooltip" href="download.php?action=download&amp;id=xxx&amp;authkey=yyy&amp;pass=zzz" title="Download">DL</a> 
</span> 

我在想什麼的是:

f1 = open('scraping.log', 'a') 
page = br.open(url) 
html = page.read() 
soup = BeautifulSoup(html) 

for a in soup.select('a[href^="download.php?action=download"]'): 
     link = a.attrs.get('href') 
     print >>f1, link 
     br.retrieve(url+link, destination) 

但是,對於檢索我必須說明了輸出文件名。我想獲取原始文件名,而不是將其設置爲隨機名稱。有沒有辦法做到這一點? 此外,由於我想添加此腳本在crontab中頻繁運行,是否有一種方法可以讓我們設置檢查scraping.log並跳過之前已下載的腳本?

+0

哪個網站是你刮?你可以從中得到文件名。 –

+0

對不起,這是一個私人網站。對於文件名,有沒有辦法從上面的下載鏈接獲取文件名? –

+0

讓我知道我的答案是否適合你,如果確實如此,請不要忘記接受它。謝謝! –

回答

0

如果你不喜歡 「的download.php」,查了Content-Disposition header,如:

Content-Disposition: attachment; filename="fname.ext" 

,並確保文件名complies with your intent

重要的是,接收不MUA一味使用 建議的文件名。建議的文件名應該被檢查(並且 可能被改變)以看到它符合本地文件系統 約定,不會覆蓋現有文件,並且不會造成 存在安全問題(請參閱下面的安全注意事項)。

的Python 2:

import re 
import mechanize # pip install mechanize 

br = mechanize.Browser() 
r = br.open('http://yoursite.com') 
#print r.info()['Content-Disposition'] 
unsafe_filename = r.info().getparam('filename') # Could be "/etc/evil". 
filename = re.findall("([a-zA-Z0-9 _,()'-]+[.][a-z0-9]+)$", unsafe_filename)[0] # "-]" to match "-". 

至於跳過你之前已經處理環節,

f1 = open('scraping.log', 'a') 
processed_links = f1.readlines() 
page = br.open(url) 
html = page.read() 
soup = BeautifulSoup(html) 

for a in soup.select('a[href^="download.php?action=download"]'): 
    link = a.attrs.get('href') 
    if not link in processed_links: 
     print >>f1, link 
     processed_links += [link] 
     br.retrieve(url+link, destination)