问题描述
我正在尝试从此网页中提取“公司和测试”值: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"])
解决方法
在本例中,您的画面网址使用的是 server side rendering。这意味着,默认情况下没有数据发送到浏览器,服务器正在使用数据(表格、地图等)渲染图像,使用 JS 将鼠标坐标发送到服务器来触发选择事件。
但在您的情况下,有一种方法可以使用过滤器在客户端呈现一些数据。当您选择过滤器时,例如“标本”过滤器,数据会在客户端呈现(实际数据会发送到浏览器)。
我制作了一个 tableau scraper library 来从 Tableau 工作表中提取数据。您可以执行以下代码,该代码将加载表格数据(空工作表),在名为 Diagnostic Target
的工作表 Specimen Collected
中获取过滤器并迭代此过滤器的每个值并获取每个值的工作表数据这些:
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