关闭。这个问题需要更多 focused .它目前不接受答案。
想改进这个问题?更新问题,使其仅关注一个问题 editing this post .
1年前关闭。
Improve this question
每天我都需要下载公共(public) 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
最佳答案
编辑
我做了一个tableau scraper library从 Tableau 工作表中提取数据
您可以直接从 pandas 数据框中的工作表中获取数据。此外,还支持参数值。
以下示例从工作表 Simples Demanda Máxima Ano
中获取数据,然后切换到日常模式,显示工作表 Simples Demanda Máxima Semana Dia
数据,然后将开始日期设置为 01/01/2017
:
from tableauscraper import TableauScraper as TS
url = "https://tableau.ons.org.br/t/ONS_Publico/views/DemandaMxima/HistricoDemandaMxima"
ts = TS()
ts.loads(url)
wb = ts.getWorkbook()
# show dataframe with yearly data
ws = wb.getWorksheet("Simples Demanda Máxima Ano")
print(ws.data)
# switch to daily
wb = wb.setParameter("Escala de Tempo DM Simp 4", "Dia")
# show dataframe with daily data
ws = wb.getWorksheet("Simples Demanda Máxima Semana Dia")
print(ws.data)
# switch to daily
wb = wb.setParameter(
"Início Primeiro Período DM Simp 4", "01/01/2017")
# show dataframe with daily data from 01/01/2017
ws = wb.getWorksheet("Simples Demanda Máxima Semana Dia")
print(ws.data)
Try this on repl.it原帖
这个答案类似于 this one但初始 URL 页面和画面基本 URL 不同。过程/算法本质上保持不变,但我将详细说明步骤:
图形是在 JS 中从 API 的结果生成的:
POST https://tableau.ons.org.br/ROOT_PATH/bootstrapSession/sessions/SESSION_ID
SESSION_ID
参数位于(除其他外)tsConfigContainer
用于构建 iframe 的 URL 中的 textarea。从https://tableau.ons.org.br/t/ONS_Publico/views/DemandaMxima/HistricoDemandaMxima?:embed=y&:showAppBanner=false&:showShareOptions=true&:display_count=no&:showVizHome=no开始:
tsConfigContainer
的文本区域带有一堆 json 值 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"])
关于python - 如何抓取公共(public)画面仪表板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62095206/