首页 > 解决方案 > 无法抓取 Tableau 公共仪表板

问题描述

我正在尝试抓取Tableau 仪表板,但是我遇到了一个问题,即我的输出中缺少值。具体来说,我的代码似乎不会抓取/打印重复的值(出现两次的值只会被抓取/打印一次)。

这是我正在使用的代码:

import requests
from bs4 import BeautifulSoup
import json
import re

r = requests.get("https://public.tableau.com/views/COVID-19HospitalsDashboard/Hospitals?%3Aembed=y&%3AshowVizHome=no", 
    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"])

标签: pythonscreen-scraping

解决方案


我查看了您的原始请求文本和正则表达式搜索数据,但找不到您正在讨论的差异。来自请求的原始数据中的点和您自己的正则表达式搜索都使用以下内容返回 1132 个匹配项:

x = data["secondaryInfo"]["presModelMap"]["dataDictionary"]["presModelHolder"]["genDataDictionaryPresModel"]["dataSegments"]["0"]["dataColumns"][0]["dataValues"]

duplicates = set()
# loop through elements and find matches
for i in x:
    if i not in duplicates:
        duplicates.add(i)

print(len(duplicates))

由此看来,您的代码工作正常。


推荐阅读