如何从网页中嵌入的 Tableau 图表中抓取工具提示值
How can I scrape tooltips value from a Tableau graph embedded in a webpage
我正在尝试找出是否有一种方法以及如何使用 python 从网页中的 Tableau 嵌入式图形中抓取工具提示值。
以下是用户将鼠标悬停在条形图上时带有工具提示的图表示例:
我从我想从中抓取的原始网页中抓取了这个url:
https://covid19.colorado.gov/hospital-data
感谢任何帮助。
编辑
我做到了a python library to scrape tableau dashboard。实现更直接:
from tableauscraper import TableauScraper as TS
url = "https://public.tableau.com/views/Colorado_COVID19_Data/CO_Home"
ts = TS()
ts.loads(url)
dashboard = ts.getDashboard()
for t in dashboard.worksheets:
#show worksheet name
print(f"WORKSHEET NAME : {t.name}")
#show dataframe for this worksheet
print(t.data)
旧答案
该图形似乎是在 JS 中根据 API 的结果生成的,看起来像 :
POST https://public.tableau.com/TITLE/bootstrapSession/sessions/SESSION_ID
SESSION_ID 参数(除其他外)位于 URL 用于构建 iframe 的 tsConfigContainer
textarea 中。
从 https://covid19.colorado.gov/hospital-data 开始:
- 检查元素 class
tableauPlaceholder
- 获取属性为
name
的param
元素
- 它给你 url :
https://public.tableau.com/views/{urlPath}
- 前面的 link 给你一个 id 为
tsConfigContainer
的文本区域,其中有一堆 json 值
- 提取
session_id
和根路径(vizql_root
)
- 在
https://public.tableau.com/ROOT_PATH/bootstrapSession/sessions/SESSION_ID
上创建一个 POST 并将 sheetId
作为表单数据
- 从结果中提取json(结果不是json)
代码:
import requests
from bs4 import BeautifulSoup
import json
import re
r = requests.get("https://covid19.colorado.gov/hospital-data")
soup = BeautifulSoup(r.text, "html.parser")
# get the second tableau link
tableauContainer = soup.findAll("div", { "class": "tableauPlaceholder"})[1]
urlPath = tableauContainer.find("param", { "name": "name"})["value"]
r = requests.get(
f"https://public.tableau.com/views/{urlPath}",
params= {
":showVizHome":"no",
}
)
soup = BeautifulSoup(r.text, "html.parser")
tableauData = json.loads(soup.find("textarea",{"id": "tsConfigContainer"}).text)
dataUrl = f'https://public.tableau.com{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"])
从那里您可以获得所有数据。您将需要寻找数据拆分的方式,因为似乎所有数据都通过单个列表转储。可能查看 JSON 对象中的其他字段对此很有用。
我正在尝试找出是否有一种方法以及如何使用 python 从网页中的 Tableau 嵌入式图形中抓取工具提示值。
以下是用户将鼠标悬停在条形图上时带有工具提示的图表示例:
我从我想从中抓取的原始网页中抓取了这个url:
https://covid19.colorado.gov/hospital-data
感谢任何帮助。
编辑
我做到了a python library to scrape tableau dashboard。实现更直接:
from tableauscraper import TableauScraper as TS
url = "https://public.tableau.com/views/Colorado_COVID19_Data/CO_Home"
ts = TS()
ts.loads(url)
dashboard = ts.getDashboard()
for t in dashboard.worksheets:
#show worksheet name
print(f"WORKSHEET NAME : {t.name}")
#show dataframe for this worksheet
print(t.data)
旧答案
该图形似乎是在 JS 中根据 API 的结果生成的,看起来像 :
POST https://public.tableau.com/TITLE/bootstrapSession/sessions/SESSION_ID
SESSION_ID 参数(除其他外)位于 URL 用于构建 iframe 的 tsConfigContainer
textarea 中。
从 https://covid19.colorado.gov/hospital-data 开始:
- 检查元素 class
tableauPlaceholder
- 获取属性为
name
的 - 它给你 url :
https://public.tableau.com/views/{urlPath}
- 前面的 link 给你一个 id 为
tsConfigContainer
的文本区域,其中有一堆 json 值 - 提取
session_id
和根路径(vizql_root
) - 在
https://public.tableau.com/ROOT_PATH/bootstrapSession/sessions/SESSION_ID
上创建一个 POST 并将sheetId
作为表单数据 - 从结果中提取json(结果不是json)
param
元素
代码:
import requests
from bs4 import BeautifulSoup
import json
import re
r = requests.get("https://covid19.colorado.gov/hospital-data")
soup = BeautifulSoup(r.text, "html.parser")
# get the second tableau link
tableauContainer = soup.findAll("div", { "class": "tableauPlaceholder"})[1]
urlPath = tableauContainer.find("param", { "name": "name"})["value"]
r = requests.get(
f"https://public.tableau.com/views/{urlPath}",
params= {
":showVizHome":"no",
}
)
soup = BeautifulSoup(r.text, "html.parser")
tableauData = json.loads(soup.find("textarea",{"id": "tsConfigContainer"}).text)
dataUrl = f'https://public.tableau.com{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"])
从那里您可以获得所有数据。您将需要寻找数据拆分的方式,因为似乎所有数据都通过单个列表转储。可能查看 JSON 对象中的其他字段对此很有用。