从Tableau画布动态加载的页面中删除与冠状病毒相关的数据(我认为…)



我会非常高兴地发现这个问题是重复的,但如果是这样的话-我找不到Q&A.

纽约州卫生部有一个神秘的页面,里面有"按县和年龄组划分的死亡人数"。正如标题所示,它包含两个表("按县"/"按年龄组"(。

出于某种奇怪的原因,这个页面上的数据是超级安全的。它无法选择,页面无法保存,也无法打印。数据不在页面源上。我还尝试(但失败了(检查xhr对数据的调用。

显然,请求和beautifulsoup无法处理它。我尝试了通常的Selenium咒语(所以,除非有人告诉我,否则我不会用"我尝试了什么"的片段来混淆这个问题(。

期望输出:来自这两个表的数据,以任何可能的格式。

我唯一能想到的就是拍一张截图,然后尝试ocr图像。。。

我不知道是硒、Tableau、纽约州卫生部还是只有我,但是时候召集重炮了。。。

让我为您解释一下场景:

  1. 网站在参数X-Session-Id后面生成一个sessionid,该id是在您访问主页页索引后动态生成的。所以我通过GET请求调用它,并从headers响应中获取它
  2. 我已经找到了一个POST请求,它是在您达到所需的url之前自动生成的,实际上是使用我们之前收集的sessionid。这是https://covid19tracker.health.ny.gov/vizql/w/NYS-COVID19-Tracker/v/NYSDOHCOVID-19Tracker-Fatalities/clear/sessions/{session id}

  3. 现在我们可以呼叫您的目标https://covid19tracker.health.ny.gov/views/NYS-COVID19-Tracker/NYSDOHCOVID-19Tracker-Fatalities?%3Aembed=yes&%3Atoolbar=no&%3Atabs=n

  4. 现在我注意到另一个XHRback-endAPI的请求。但在我们进行调用之前,我们将解析HTML内容以获取time对象,该对象负责从API生成数据freshly,因此我们将获得即时数据(实际上将其视为实时聊天(。在我们的情况下,它在HTML内的lastUpdatedAt后面

  5. 我还注意到,我们需要从之前的POST请求中提取最近的X-Session-Id

  6. 现在,我们将使用我们拾取的sessionhttps://covid19tracker.health.ny.gov/vizql/w/NYS-COVID19-Tracker/v/NYSDOHCOVID-19Tracker-Fatalities/bootstrapSession/sessions/{session}进行呼叫

现在我们已经收到了完整的回复。你可以解析它或者做任何你想做的事情。

import requests
import re

data = {
'worksheetPortSize': '{"w":1536,"h":1250}',
'dashboardPortSize': '{"w":1536,"h":1250}',
'clientDimension': '{"w":1536,"h":349}',
'renderMapsClientSide': 'true',
'isBrowserRendering': 'true',
'browserRenderingThreshold': '100',
'formatDataValueLocally': 'false',
'clientNum': '',
'navType': 'Reload',
'navSrc': 'Top',
'devicePixelRatio': '2.5',
'clientRenderPixelLimit': '25000000',
'allowAutogenWorksheetPhoneLayouts': 'true',
'sheet_id': 'NYSDOH%20COVID-19%20Tracker%20-%20Fatalities',
'showParams': '{"checkpoint":false,"refresh":false,"refreshUnmodified":false}',
'filterTileSize': '200',
'locale': 'en_US',
'language': 'en',
'verboseMode': 'false',
':session_feature_flags': '{}',
'keychain_version': '1'
}

def main(url):
with requests.Session() as req:
r = req.post(url)
sid = r.headers.get("X-Session-Id")
r = req.post(
f"https://covid19tracker.health.ny.gov/vizql/w/NYS-COVID19-Tracker/v/NYSDOHCOVID-19Tracker-Fatalities/clear/sessions/{sid}")
r = req.get(
"https://covid19tracker.health.ny.gov/views/NYS-COVID19-Tracker/NYSDOHCOVID-19Tracker-Fatalities?%3Aembed=yes&%3Atoolbar=no&%3Atabs=n")
match = re.search(r"lastUpdatedAt.+?(d+),", r.text).group(1)
time = '{"featureFlags":"{"MetricsAuthoringBeta":false}","isAuthoring":false,"isOfflineMode":false,"lastUpdatedAt":xxx,"workbookId":9}'.replace(
'xxx', f"{match}")
data['stickySessionKey'] = time
nid = r.headers.get("X-Session-Id")
r = req.post(
f"https://covid19tracker.health.ny.gov/vizql/w/NYS-COVID19-Tracker/v/NYSDOHCOVID-19Tracker-Fatalities/bootstrapSession/sessions/{nid}", data=data)
print(r.text)

main("https://covid19tracker.health.ny.gov")

我制作了一个tableau scraper库来从tableau工作表中提取数据

您可以使用以下代码获取每个工作表的pandas数据帧中的所有数据:

from tableauscraper import TableauScraper as TS
url = "https://covid19tracker.health.ny.gov/views/NYS-COVID19-Tracker/NYSDOHCOVID-19Tracker-Fatalities"
ts = TS()
ts.loads(url)
dashboard = ts.getWorkbook()
for t in dashboard.worksheets:
# show worksheet name
print(f"WORKSHEET NAME : {t.name}")
# show dataframe for this worksheet
print(t.data)

在repl.it 上试试这个

相关内容

  • 没有找到相关文章

最新更新