如何从 Tableau 仪表板中提取值
Posted
技术标签:
【中文标题】如何从 Tableau 仪表板中提取值【英文标题】:How can I extract values from Tableau dashboard 【发布时间】: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_hosttableauData["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"])
【问题讨论】:
【参考方案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
【讨论】:
以上是关于如何从 Tableau 仪表板中提取值的主要内容,如果未能解决你的问题,请参考以下文章
对于 Tableau Online 中托管的仪表板,如何使用 Tableau Javascript API 将仪表板嵌入网页中?
tableau可视化数据分析60讲(十九)-tableau仪表板布局
数据可视化工具:Tableau仪表板和Smartbi自助仪表盘对比