Python机械化下载文件与原始文件名

时间:2015-07-01 07:05:40

标签: python beautifulsoup mechanize

使用python脚本从网站上抓取多个文件。

下载表格html是这样的:

txtIDFav.setGravity(Gravity.CENTER | Gravity.RIGHT);

我想到的是:

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

但是,对于检索,我必须说明输出文件名。我想获取原始文件名,而不是将其设置为随机名称。有没有办法做到这一点? 此外,由于我想添加此脚本以便在crontab中频繁运行,有没有办法让我们检查一下scraping.log并跳过之前已经下载的那些?

1 个答案:

答案 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)
相关问题