python - 无法抓取 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"])
解决方案
我查看了您的原始请求文本和正则表达式搜索数据,但找不到您正在讨论的差异。来自请求的原始数据中的点和您自己的正则表达式搜索都使用以下内容返回 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))
由此看来,您的代码工作正常。
推荐阅读
- javascript - 用于获取私有文件的 AWS S3 签名 URL
- java - Hazelcast IMap 中的序列化
- css - 当页面大于 100vh 时如何使用 React Page Scroller
- database - MongoDb:将模型字段从字符串数组修改为引用另一个模型的 id 数组的最佳方法是什么?
- wso2 - WSO2 多实例问题 2.60 和 5.7.0(APIM,IS)
- azure - 可用性测试生成的警报未触发
- python - 我收到此错误:RuntimeWarning:从未等待协程
- youtube-dl - youtube-dl 在 mpv 中播放视频并在 imv 中显示图像
- swift - 在(swift)的搜索栏中按名称过滤不起作用?
- nginx - 如何禁用将 HTTP/0.9、HTTP/1.0 或 HTTP/1.1 连接升级到 HTTP/2