我每天都需要对公共Tableau仪表板上的可用数据进行更新。在定义了感兴趣的参数(时间序列频率,时间序列间隔等)之后,仪表板允许您下载序列。
如果可以使用Python或R自动将这些系列下载到数据库中,我的生活会相对容易一些。我已经尝试分析页面上的请求,但无法获得更多帮助。有什么办法可以自动化这个过程?
仪表板:https : //tableau.ons.org.br/t/ONS_Publico/views/DemandaMxima/HistricoDemandaMxima? : embed= y&: showAppBanner= false&: showShareOptions= true&: display_count= no&: showVizHome=no
这个答案与此类似,但是初始URL页和tableau基本URL不同。流程/算法本质上保持不变,但我将详细说明以下步骤:
图形是根据API的结果在JS中生成的:
POST https://tableau.ons.org.br/ROOT_PATH/bootstrapSession/sessions/SESSION_ID
SESSION_ID参数(除其他外)位于tsConfigContainer用于构建iframe的URL的textarea中。
tsConfigContainer
从https://tableau.ons.org.br/t/ONS_Publico/views/DemandaMxima/HistricoDemandaMxima?:embed=y&:showAppBanner=false&:showShareOptions=true&:display_count=no&:showVizHome=no开始:
session_id
vizql_root
https://tableau.ons.org.br/ROOT_PATH/bootstrapSession/sessions/SESSION_ID
sheetId
代码:
import requests from bs4 import BeautifulSoup import json import re url = "https://tableau.ons.org.br/t/ONS_Publico/views/DemandaMxima/HistricoDemandaMxima" r = requests.get( url, params= { ":embed":"y", ":showAppBanner":"false", ":showShareOptions":"true", ":display_count":"no", "showVizHome": "no" } ) soup = BeautifulSoup(r.text, "html.parser") tableauData = json.loads(soup.find("textarea",{"id": "tsConfigContainer"}).text) dataUrl = f'https://tableau.ons.org.br{tableauData["vizql_root"]}/bootstrapSession/sessions/{tableauData["sessionid"]}' r = requests.post(dataUrl, data= { "sheet_id": tableauData["sheetId"], }) dataReg = re.search('\d+;({.*})\d+;({.*})', r.text, re.MULTILINE) info = json.loads(dataReg.group(1)) data = json.loads(dataReg.group(2)) print(data["secondaryInfo"]["presModelMap"]["dataDictionary"]["presModelHolder"]["genDataDictionaryPresModel"]["dataSegments"]["0"]["dataColumns"])