python - 如何抓取公共(public)画面仪表板?

标签 python web-scraping tableau-api

关闭。这个问题需要更多 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开始:
  • 有一个 ID 为 tsConfigContainer 的文本区域带有一堆 json 值
  • 提取session_id和根路径 ( vizql_root )
  • https://tableau.ons.org.br/ROOT_PATH/bootstrapSession/sessions/SESSION_ID 上发帖与 sheetId作为表单数据
  • 从结果中提取json(结果不是json)

  • 代码 :
    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/

    相关文章:

    python - 无法从 xpath python 获取值

    forms - 如何在谷歌表单中获取元素ID

    python - scipy logsumexp() 是否处理下溢挑战?

    python - 如何将 numpy 1D 数组插入 numpy 3D 数组?

    python - Beautifulsoup 提取 <li> 和 <ul> 标签并将结果写入 CSV

    python - 检查excel表中的缺失值

    tableau-api - 在 Tableau 中创建新变量

    concatenation - 如何在 tableau 8.0.0 中连接年和月?

    python - 当给定复合键 'foo.bar.baz' 时递归设置 Python dict 项

    python - 从每行数据框中的列中删除不在列表中的字符串