从 Tableau Public 仪表板中抓取数据
Scrape Data from Tableau Public dashboard
我对从网站上抓取数据的世界还很陌生,不知道如何从使用 Tableau 的网站上抓取数据 Public
网站:https://showmestrong.mo.gov/data/public-health/
我一直在阅读有关如何检查元素并在其中找到 table 的多个来源,但我不知所措。我试过在 Python requests
和 BeautifulSoup
中使用,但不知道如何解决。
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")
它似乎没有显示任何 table 有关病例和死亡的信息。
如有任何提示或documentation/forums,我们将不胜感激!
tableau.js 库似乎加载了另一个 url,它从中获取数据:
从那里开始,它与 and 非常相似,您可以从 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配置,如上面的代码
所示
我对从网站上抓取数据的世界还很陌生,不知道如何从使用 Tableau 的网站上抓取数据 Public
网站:https://showmestrong.mo.gov/data/public-health/
我一直在阅读有关如何检查元素并在其中找到 table 的多个来源,但我不知所措。我试过在 Python requests
和 BeautifulSoup
中使用,但不知道如何解决。
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")
它似乎没有显示任何 table 有关病例和死亡的信息。
如有任何提示或documentation/forums,我们将不胜感激!
tableau.js 库似乎加载了另一个 url,它从中获取数据:
从那里开始,它与 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配置,如上面的代码
所示