【问题标题】:Scrape Data from Tableau Public dashboard从 Tableau Public 仪表板中抓取数据
【发布时间】:2021-01-15 18:38:24
【问题描述】:

我对从网站上抓取数据的世界非常陌生,并且不知道如何从使用 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")

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

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

【问题讨论】:

    标签: python web-scraping beautifulsoup tableau-api


    【解决方案1】:

    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

    【讨论】:

    • 非常感谢!!!你在这方面帮了很多忙。如果我可能会问,您知道如何或任何其他论坛可以帮助解析这一庞大的数据线吗?
    猜你喜欢
    • 2016-07-18
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 2021-05-20
    • 1970-01-01
    • 2021-03-29
    • 2019-11-18
    • 2020-11-11
    相关资源
    最近更新 更多