[我正在尝试找出是否有一种方法以及如何使用python从网页中的Tableau嵌入式图中抓取工具提示值。
这是当用户将鼠标悬停在条形图上时带有工具提示的图形的示例:
我从我要从其抓取的原始网页中获取了该URL:
https://covid19.colorado.gov/hospital-data
感谢您的任何帮助。
[图形似乎是由JS生成的,看起来像是:]
POST https://public.tableau.com/TITLE/bootstrapSession/sessions/SESSION_ID
SESSION_ID参数(除其他外)位于用于构建iframe的URL的tsConfigContainer
文本区域中。
从https://covid19.colorado.gov/hospital-data开始:
tableauPlaceholder
的元素param
的name
元素https://public.tableau.com/views/{urlPath}
tsConfigContainer
并带有一堆JSON值的文本区域session_id
和根路径(vizql_root
)https://public.tableau.com/ROOT_PATH/bootstrapSession/sessions/SESSION_ID
作为表单数据在sheetId
上进行POST代码:
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对象中的其他字段。