我正在尝试弄清楚是否有一种方法以及如何使用python从网页中的Tableau嵌入式图形中抓取工具提示值。
以下是用户将鼠标悬停在条形图上时工具提示的图形示例:
https://public.tableau.com/views/NumberofCOVID-19patientsadmittedordischarged/DASHPublicpage
_
patientsdischarges?:embed=y&:showVizHome=no&:host
_
url=https%3A%2F%2Fpublic.tableau.com%2F&:embed
_
代码
_
version=3&:tabs=no&:toolbar=yes&:animate
_
transition=yes&:display
_
静态
_
image=no&:display
_
spinner=no&:display
_
overlay=yes&:display
_
count=yes&publish=yes&:loadOrderID=1
我从我想要抓取的原始网页中抓取了这个url:
https://covid19.colorado.gov/hospital-data
如有任何帮助,我们将不胜感激。
发布于 2020-05-24 02:01:48
编辑
我做了
用于抓取tableau仪表板的python库
..。实现更简单:
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)在repl.it上运行此程序
老答案
该图形似乎是在JS中从API的结果中生成的,如下所示:
POST https://public.tableau.com/TITLE/bootstrapSession/sessions/SESSION_ID会话
_
ID参数位于(其中)
用于构建iframe的URL中的textarea。
开始于
https://covid19.colorado.gov/hospital-data
:
使用类检查元素
获取
具有属性的元素
它会为您提供以下url:
前面的链接给出了一个带有id的文本区域
使用一堆json值
提取
和根路径(
)
在…上发表帖子
使用
作为表单数据
从结果中提取json (result不是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对象中的其他字段可能会对此有所帮助。
https://stackoverflow.com/questions/61962611
复制相似问题