从Tableau公共仪表板中刮取数据

2024-10-02 04:32:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我对从网站上抓取数据的世界非常陌生,对于如何从使用Tableau Public的网站上抓取数据感到困惑

网站:https://showmestrong.mo.gov/data/public-health/

我一直在阅读一些关于如何检查元素并在其中找到表格的资料,但我不知所措。我曾尝试在Python中使用requestsBeautifulSoup,但不知道如何克服这一点

import requests
from bs4 import BeautifulSoup
import json
import re

r = requests.get("https://showmestrong.mo.gov/data/public-health/")
soup = BeautifulSoup(r.text, "html.parser")

例如,它似乎没有显示任何关于病例和死亡的表格

任何关于此的提示或文档/论坛都将不胜感激


Tags: 数据httpsimportdata网站世界publicrequests
1条回答
网友
1楼 · 发布于 2024-10-02 04:32:53

tableau.js库似乎加载了另一个从中获取数据的url:

https://public.tableau.com/views/COVID-19inMissouri/COVID-19inMissouri?:embed=y&:showVizHome=no&:host_url=https%3A%2F%2Fpublic.tableau.com%2F&:embed_code_version=3&:tabs=no&:toolbar=no&:animate_transition=yes&:display_static_image=no&:display_spinner=no&:display_overlay=yes&:display_count=yes&:language=en&:loadOrderID=0

从这里开始,它非常类似于this answerthis one,在这里您将从textarea标记提取JSON配置。提取sessionid以构建URL以获取数据:

import requests
from bs4 import BeautifulSoup
import json
import re

r = requests.get("https://public.tableau.com/views/COVID-19inMissouri/COVID-19inMissouri", 
    params = {
    ":embed": "y",
    ":showVizHome": "no",
    ":host_url": "https://public.tableau.com/",
    ":embed_code_version": 3,
    ":tabs": "no",
    ":toolbar": "no",
    ":animate_transition": "yes",
    ":display_static_image": "no",
    ":display_spinner": "no",
    ":display_overlay": "yes",
    ":display_count": "yes",
    ":language": "en",
    ":loadOrderID": 0
})
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,因此需要使用正则表达式对其进行解析,以从中提取JSON配置,如上述代码所示

run this on repl.it

相关问题 更多 >

    热门问题