【问题标题】:How can I scrape tooltips value from a Tableau graph embedded in a webpage如何从网页中嵌入的 Tableau 图表中抓取工具提示值
【发布时间】:2020-09-09 17:48:44
【问题描述】:

我正在尝试找出是否有办法以及如何使用 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_code_version=3&:tabs=no&:toolbar=yes&:animate_transition=yes&:display_static_image=no&:display_spinner=no&:display_overlay=yes&:display_count=yes&publish=yes&:loadOrderID=1

我从我想要抓取的原始网页中抓取了这个网址:

https://covid19.colorado.gov/hospital-data

感谢任何帮助。

【问题讨论】:

标签: python web-scraping graph web-crawler tableau-api


【解决方案1】:

编辑

我制作了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)

run this on repl.it


旧答案

图形似乎是在 JS 中从 API 的结果生成的,如下所示:

POST https://public.tableau.com/TITLE/bootstrapSession/sessions/SESSION_ID 

SESSION_ID 参数位于(除其他外)用于构建 iframe 的 URL 中的 tsConfigContainer textarea 中。

https://covid19.colorado.gov/hospital-data开始:

  • 检查类tableauPlaceholder的元素
  • 获取具有name 属性的param 元素
  • 它为您提供网址:https://public.tableau.com/views/{urlPath}
  • 上一个链接为您提供了一个 ID 为 tsConfigContainer 的文本区域,其中包含一堆 json 值
  • 提取session_id和根路径(vizql_root)
  • https://public.tableau.com/ROOT_PATH/bootstrapSession/sessions/SESSION_ID 上使用sheetId 作为表单数据进行POST
  • 从结果中提取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 对象中的其他字段会对此很有用。

【讨论】:

  • 很好的回应!谢谢你的时间。您是否会回答我的以下问题,以便我清楚和理解我需要为其他网站做同样的事情: 1- 当我在 Chrome 中检查时,我没有看到“param”元素。为什么不? 2-你是如何计算“showVizHome=no”的Get参数的?我在任何地方都没有看到它。
  • @dmornad div 中有一些 param 元素,其类为 tableauPlaceholder of covid19.colorado.gov/hospital-data
  • @dmornad 当您检查图形时,您会注意到它嵌入在 iframe 中。事实上,tableau js lib 正在动态创建 iframe url。我刚刚设法重现了这个网址。当您检查时,您可以看到有很多 url 参数,但我发现只有 showVizHome 是获取数据所必需的。
  • 完整网址为:public.tableau.com/views/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-20
相关资源
最近更新 更多