Tableau Public 대시 보드에서 데이터 스크랩

Sep 30 2020

저는 웹 사이트에서 데이터를 스크래핑하는 세계에 익숙하지 않으며 Tableau Public을 사용하는 웹 사이트에서 데이터를 가져 오는 방법을 잃었습니다.

웹 사이트 : https://showmestrong.mo.gov/data/public-health/

요소를 검사하고 그 안의 테이블을 찾는 방법에 대한 여러 소스를 읽었지만 손실이 있습니다. 파이썬에서 사용 해봤 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")

예를 들어 사건과 사망에 대한 표를 표시하지 않는 것 같습니다.

이에 대한 모든 팁이나 문서 / 포럼을 주시면 감사하겠습니다!

답변

2 BertrandMartel Oct 01 2020 at 02:02

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

거기에서, 그것은 매우 유사 이 대답 하고 이것 당신이에서 JSON 구성을 추출합니다 textarea태그입니다. 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 구성을 추출하려면 regex를 사용하여 구문 분석해야합니다.

repl.it에서 실행