【问题标题】:How can I extract values from Tableau dashboard如何从 Tableau 仪表板中提取值
【发布时间】:2021-05-20 03:36:28
【问题描述】:

我正在尝试从此网页中提取“Company & Tests”值:https://public.tableau.com/views/v_7_14_2020/COVID-19TestingCommons

首选输出是包含公司和每个公司的测试数量的数组。

还有另一个帖子 (How can I scrape tooltips value from a Tableau graph embedded in a webpage) 有类似的问题..

我尝试使用它,但在我的情况下它不起作用

谢谢。

import requests 
from bs4 import BeautifulSoup
import json
import time

data_host = "https://public.tableau.com"

r = requests.get(
    f"{data_host}/views/v_7_14_2020/COVID-19TestingCommons",
    params= {
        ":showVizHome":"no",
    }
)
soup = BeautifulSoup(r.text, "html.parser")

tableauData = json.loads(soup.find("textarea",{"id": "tsConfigContainer"}).text)

dataUrl = f'{data_host}{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 web-scraping tableau-api dashboard scrape


    【解决方案1】:

    在这种情况下,您的画面 url 使用server side rendering。这意味着,默认情况下没有数据发送到浏览器,服务器正在使用数据(表格、地图等)渲染图像,选择事件是使用 JS 向服务器发送鼠标坐标触发的。

    但在您的情况下,有一种方法可以使用过滤器获取一些客户端渲染的数据。当您选择过滤器时,例如“样本”过滤器,数据会在客户端呈现(实际数据会发送到浏览器)。

    我创建了一个tableau scraper library 来从 Tableau 工作表中提取数据。您可以执行以下代码,该代码将加载表格数据(空工作表),在名为 Specimen Collected 的工作表 Diagnostic Target 中获取过滤器,并迭代此过滤器的每个值并获取其中每一个的工作表数据:

    from tableauscraper import TableauScraper as TS
    import pandas as pd
    
    url = "https://public.tableau.com/views/v_7_14_2020/COVID-19TestingCommons"
    
    ts = TS()
    ts.loads(url)
    workbook = ts.getWorkbook()
    
    ws = workbook.getWorksheet("Diagnostic Target")
    
    specimens = [
        t["values"]
        for t in ws.getFilters()
        if t["column"] == "Specimen Collected"
    ][0]
    
    pdList = []
    for specimen in specimens:
        print(f"specimen: {specimen}")
        specResultWb = ws.setFilter("Specimen Collected", specimen)
        df = specResultWb.getWorksheet("Company and Tests").data
        pdList.append(df)
    
    result = pd.concat(pdList, ignore_index=True)
    print(result)
    

    repl.it:https://replit.com/@bertrandmartel/TableauCovid19TestingCommonsASU

    【讨论】:

      猜你喜欢
      • 2021-01-15
      • 2019-11-18
      • 1970-01-01
      • 2017-07-31
      • 1970-01-01
      • 2020-01-22
      • 2019-02-16
      • 2020-01-24
      • 2018-07-18
      相关资源
      最近更新 更多