该图形似乎是由JS中的API结果生成的,如下所示:
POST https://public.tableau.com/TITLE/bootstrapSession/sessions/SESSION_ID
SESSION_ID参数(除其他外)位于
tsConfigContainer用于构建iframe的URL的textarea中。
从https://covid19.colorado.gov/hospital-
data开始:
- 检查类的元素
tableauPlaceholder
- 获取
param
具有属性的元素name
- 它给你的网址:
https://public.tableau.com/views/{urlPath}
- 上一个链接为您提供了一个id为ID的textarea,
tsConfigContainer
其中包含一堆json值 - 提取
session_id
和根路径(vizql_root
) https://public.tableau.com/ROOT_PATH/bootstrapSession/sessions/SESSION_ID
使用sheetId
as表单数据进行POST- 从结果中提取json(结果不是json)
代码:
import requestsfrom bs4 import BeautifulSoupimport jsonimport rer = requests.get("https://covid19.colorado.gov/hospital-data")soup = BeautifulSoup(r.text, "html.parser")# get the second tableau linktableauContainer = 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对象中的其他字段。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)