Extraer datos del panel de Tableau Public
Soy muy nuevo en el mundo de la extracción de datos de sitios web y no sé cómo extraer datos de un sitio web que utiliza Tableau Public.
sitio web: https://showmestrong.mo.gov/data/public-health/
He estado leyendo sobre varias fuentes sobre cómo inspeccionar los elementos y encontrar la tabla dentro de ellos, pero estoy perdido. Intenté usar en Python requestsy BeautifulSoupno sé cómo trabajar más allá de eso.
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")
y no parece mostrar ninguna tabla sobre casos y muertes, por ejemplo.
¡Se agradecería cualquier consejo o documentación / foros sobre esto!
Respuestas
La biblioteca tableau.js parece cargar otra URL de la que obtiene los datos:
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
A partir de ahí, es muy similar a esta respuesta y esta en la que extraería una configuración JSON de una textareaetiqueta. Extraiga sessionidpara construir la URL para obtener los datos:
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"])
El resultado no es JSON, por lo que debe analizarse con expresiones regulares para extraer la configuración JSON como se muestra en el código anterior.
ejecutar esto en repl.it