通过 Python 中的下载按钮执行下载

Posted

技术标签:

【中文标题】通过 Python 中的下载按钮执行下载【英文标题】:Perform Download via download button in Python 【发布时间】:2017-06-26 01:35:17 【问题描述】:

我在从网站获取数据方面有点陌生。

我有,例如一个网站http://www.ariva.de/adidas-aktie/historische_kurse,并隐藏了一个下载按钮,如下图红色所示:

主要问题是如何在 python 中下载它?我尝试了一些在网上找到的东西(例如美丽的汤、scraperwiki 等),但不知何故失败了。 数据下载链接结构如下:

> Kurse als CSV-Datei       </h3> <div class="clearfloat"></div> </div>
> <form action="/quote/historic/historic.csv" method="get"
> name="histcsv"> <input type="hidden" name="secu" value="291" /> <input
> type="hidden" name="boerse_id" value="6" /> <input type="hidden"
> name="clean_split"  value="1" /> <input type="hidden"
> name="clean_payout" value="1" /> <input type="hidden"
> name="clean_bezug"  value="1" /> <input type="hidden" name="currency" 
> value="EUR" /> <ul style="margin:5px;"> <li> <label
> for="minTime">von:</label> <input id="minTime" name="min_time"
> value="8.2.2016" style="width:71px" /> </li> <li> <label
> for="maxTime">bis:</label> <input id="maxTime" name="max_time"
> value="8.2.2017" style="width:71px" /> </li> <li> <label
> for="trenner">Trennzeichen:</label> <input id="trenner" name="trenner"
> value=";" style="width:25px" /> </li> <li> <input class="submitButton"
> name="go" value="Download" type="submit" /> </li> </ul> </form> </div>
> </div> <div class="clearfloat"></div> </div> </div> </div> <div
> id="foot" class="noprint"> <div class="adControllerAd evtAdShow 
> noprint abstand adHide" id="iqadtile16"> </div> <div id="footer"> <div
> class="footer abstand"> <a
> href="/adidas-aktie/historische_kurse?boerse_id=6&currency=EUR&clean_split=1&clean_payout=1&clean_bezug=1&min_time=2014-09-01&max_time=2017-02-07/wkn_A1EWWW_historic.csv"
> class="anker"> <img src="/forum/i/up.gif"  
> >Zum Seitenanfang</a> <a
> href="/fehlermeldung/index.m?ag=291&amp;referrer=&amp;ssl=0&amp;url=%2Fadidas-aktie%2Fhistorische_kurse%3Fboerse_id%3D6%26currency%3DEUR%26clean_split%3D1%26clean_payout%3D1%26clean_bezug%3D1%26min_time%3D2014-09-01%26max_time%3D2017-02-07%2Fwkn_A1EWWW_historic.csv"

【问题讨论】:

【参考方案1】:
import requests

url = 'http://www.ariva.de/quote/historic/historic.csv?secu=291&boerse_id=6&clean_split=1&clean_payout=0&clean_bezug=1&min_time=8.2.2016&max_time=8.2.2017&trenner=%3B&go=Download'
r = requests.get(url)
with open('a.csv', 'wb') as f:
    f.write(r.content)

您可以使用chrome dev tools监控网络,当您点击下载时,浏览器使用GET方法向服务器发送消息,您可以模仿它使用requests

如何在url中找到参数:

您可以解析页面并获取您需要的参数,然后构建下载url并将其传递给pandas。

使用从链接读取的 pandas:

import pandas as pd
pd.read_csv('http://www.ariva.de/quote/historic/historic.csv?secu=291&boerse_id=6&clean_split=1&clean_payout=0&clean_bezug=1&min_time=8.2.2016&max_time=8.2.2017&trenner=%3B&go=Download')

如何获取参数:

import requests, bs4

url = 'http://www.ariva.de/adidas-aktie/historische_kurse'
r = requests.get(url)
soup = bs4.BeautifulSoup(r.text, 'lxml')
payload = field['name']:field['value'] for field in soup.select('form[name="histcsv"] input')
csv = requests.post('http://www.ariva.de/quote/historic/historic.csv', data=payload)

【讨论】:

非常感谢。是否可以自动读取内容,例如 secu=291&boerse_id=6 而不是手动读取?此外,我可以将 csv 文件直接写入 pandas 数据帧吗?不知何故,chrome 开发者工具中的 get API 也向我吐出了不同的链接。 感谢您的回答。我还在苦苦挣扎如何构建和简单的爬虫自动读取安全ID 非常感谢!这就是我一直在寻找的。非常感谢您的帮助。【参考方案2】:

好吧,我建议您使用Selenium,您可以在其中执行 javascript 而无需任何额外的努力。您也可以将Phantom 用于无头浏览器。

【讨论】:

【参考方案3】:

您可以通过此 GET API 获取下载响应,

http://www.ariva.de/quote/historic/historic.csv?secu=291&boerse_id=6&clean_split=1&clean_payout=0&clean_bezug=1&min_time=8.2.2016&max_time=8.2.2017&trenner=%3B&go=Download

这里min_timemax_time 是您需要提供的两个日期戳,trenner 是分隔符,您可以收到响应然后将其写入文件。

import requests
response = requests.get('http://www.ariva.de/quote/historic/historic.csv?secu=291&boerse_id=6&clean_split=1&clean_payout=0&clean_bezug=1&min_time=8.2.2016&max_time=8.2.2017&trenner=%3B&go=Download')

file = open('download.csv','w+')
file.write(response.text)

【讨论】:

非常感谢。我正在使用与上面相同的评论:是否可以自动读取内容,例如 secu=291&boerse_id=6 而不是手动执行?此外,我可以将 csv 文件直接写入熊猫数据框吗?不知何故,来自 chrome 的开发者工具中的 get API 也向我吐出了不同的链接。

以上是关于通过 Python 中的下载按钮执行下载的主要内容,如果未能解决你的问题,请参考以下文章

网页中点击下载按钮实现图片下载功能

如何设置python 中函数 urlretrieve 下载文档,5秒没有下载完成就跳出执行下一次的下载?

使用Python通过javascript onclick下载文件?

selenium+python自动化79-文件下载(SendKeys)

selenium+python自动化79-文件下载(SendKeys)转载

我想通过点击下载按钮直接下载cv