如何爬取嵌入Microsoft Power BI的表格与图表以获取COVID-19疫情数据
我所在的州禁止强制佩戴口罩,所属郡县也没有推行相关政策的魄力,因此我需要追踪并可视化COVID-19趋势及时序数据,以便判断送孩子上学的风险。上周我使用Python、Selenium和Beautiful Soup编写了针对当地疫情网站的爬虫程序,虽然代码不够优雅,但成功抓取到了数据,我还搭建了Jupyter notebook用于数据分析,相关代码可查看本人公开代码仓库。
就在我完成初步分析、生成前几张图表时,当地郡县更新了疫情数据公示网站的格式,新网站由Microsoft Power BI驱动,没有提供表格数据的直接访问入口,仅保留了可视化内容。我想了解是否有办法爬取这类页面中的数据,该郡县的COVID-19数据看板可直接通过搜索引擎查找对应入口。
在上述代码仓库中可以看到,我已经实现了基于Jupyter notebook的爬虫页面(调用Python模块),以及用于数据分析和可视化的Jupyter notebook。我是网页爬虫领域的新手,此前得到了不少朋友的帮助,代码不够简洁高效,但确实可以正常运行。现在爬虫失效,因为我无法通过Power BI UI和新格式的页面进行交互。
我还没有针对新页面编写代码,此前的爬虫仅通过Selenium和webdriver实现。我暂时没有在新的页面结构中找到表格数据的存储位置。我此前已经完成了类似的简单分析,生成的分析结果示例为包含时序趋势和各校感染数据的可视化图表,希望可以继续维持数据更新。最好能获取到和原有格式一致的数据,不过新页面已经不再展示该格式的内容。我的最终目标是生成学校疫情地图,将各校感染比例和郡县的政区地图做对比分析。
针对Power BI驱动的公开看板,你可以通过以下三种方式获取数据,按实现难度从低到高排序:
- 模拟导出CSV:只要看板没有关闭数据导出权限,你可以直接用Selenium模拟点击图表右上角的更多操作按钮,选择「导出数据」选项,下载CSV文件到本地后直接读取即可,不需要额外解析逻辑,对你当前的技术栈来说适配成本最低。
- 提取DOM属性值:Power BI渲染的所有可视化元素的原始数据都会存在对应DOM节点的属性里,比如表格单元格的innerText、图表数据点的aria-label属性都存储了原始数值,你可以用Selenium定位到对应组件后遍历提取,整理成DataFrame即可用于后续分析。
- 抓包调用原始接口:打开浏览器控制台的网络面板,刷新后筛选XHR请求,找到Power BI加载数据的接口,这类接口通常路径包含/reports/相关字段,会直接返回JSON格式的全量原始数据,你可以直接构造请求拉取数据,不需要启动浏览器,运行效率最高。
内容的提问来源于stack exchange,提问作者brosenheim

