Ber*_*tel 5

编辑

我制作了一个 python 库来抓取 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 Code Online (Sandbox Code Playgroud)

在 repl.it 上运行它


旧答案

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

POST https://public.tableau.com/TITLE/bootstrapSession/sessions/SESSION_ID 
Run Code Online (Sandbox Code Playgroud)

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

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

  • 用类检查元素 tableauPlaceholder
  • 获取param具有属性的元素name
  • 它给你网址: https://public.tableau.com/views/{urlPath}
  • 上一个链接为您提供了一个带有 idtsConfigContainer和一堆 json 值的 textarea
  • 提取session_id根路径 ( vizql_root)
  • https://public.tableau.com/ROOT_PATH/bootstrapSession/sessions/SESSION_ID使用sheetIdas 表单数据进行 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"])
Run Code Online (Sandbox Code Playgroud)

从那里你有所有的数据。您将需要寻找拆分数据的方式,因为似乎所有数据都通过单个列表转储。可能查看 JSON 对象中的其他字段对此很有用。