使用原始文件名的Python mechanize下载文件
使用python脚本从网站上抓取多个文件 下载表单html如下所示:使用原始文件名的Python mechanize下载文件,python,beautifulsoup,mechanize,Python,Beautifulsoup,Mechanize,使用python脚本从网站上抓取多个文件 下载表单html如下所示: <span> <a class="tooltip" href="download.php?action=download&id=xxx&authkey=yyy&pass=zzz" title="Download">DL</a> </span> 但是,对于检索,我必须声明输出文件名。我想获取原始文件名,而不是将其设置为随机名
<span>
<a class="tooltip" href="download.php?action=download&id=xxx&authkey=yyy&pass=zzz" title="Download">DL</a>
</span>
但是,对于检索,我必须声明输出文件名。我想获取原始文件名,而不是将其设置为随机名称。有办法吗?
此外,由于我想添加此脚本以在crontab中频繁运行,是否有办法让我们检查scraping.log并跳过以前下载的脚本?如果您不喜欢“download.php”,请检查一个,例如:
并确保文件名:
重要的是,接收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)
你在刮哪个网站?您可以从中获取文件名。抱歉,这是一个私人网站。对于文件名,是否可以从上面的下载链接获取文件名?请告诉我我的答案是否适用于您,如果适用,请不要忘记接受。谢谢
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)