使用R+Selenium抓取Power BI仪表盘数据的问题求助
解决Power BI仪表盘数据抓取的两个核心问题:列匹配错误与滚动加载不完整
一、修复列数据匹配混乱的问题
原代码中bind_cols()的逻辑会导致列结构错乱,Power BI表格的每行数据都被包裹在同一个父容器内,正确的做法是将每行的单元格文本整理为向量,再组合成数据框,确保列与表头一一对应:
- 先定位表格的所有行容器(
div.row) - 遍历每行,提取该行内所有单元格的文本
- 将每行数据转为数据框后按行合并,最后匹配表头
二、添加滚动加载逻辑获取完整数据
Power BI表格采用虚拟滚动,只有可见区域的数据会渲染,需要模拟滚动到表格底部,触发新数据加载,直到没有更多数据可加载:
- 定位表格的滚动容器(
div.bodyCells) - 循环执行JavaScript滚动脚本,每次滚动到底部后等待数据加载
- 通过对比滚动前后的页面高度,判断是否已加载全部数据
修改后的完整R代码
library(dplyr) library(purrr) library(readr) library(wdman) library(RSelenium) library(xml2) library(selectr) # 启动Selenium服务与浏览器 selServ <- selenium( port = 4444L, version = 'latest', chromever = '105.0.5195.19' ) remDr <- remoteDriver( remoteServerAddr = 'localhost', port = 4444L, browserName = 'chrome' ) remDr$open() # 导航到Power BI仪表盘 report_url <- "https://app.powerbi.com/view?r=eyJrIjoiNmY4MTQyN2YtNTMyOC00NWMyLTk0ZWUtNDA1ZTllNDZlMTE0IiwidCI6IjZiY2NiNTZkLWI1YTQtNDkzOC05MGRhLTNhNDE4ZjA0MDJjYyIsImMiOjF9&pageName=ReportSection787ec227054b3e646910" remDr$navigate(report_url) # 等待页面加载(可根据实际情况调整等待时间) Sys.sleep(5) # --- 滚动加载完整数据 --- scroll_container <- remDr$findElement(using = "css selector", value = "div.bodyCells") previous_height <- 0 current_height <- scroll_container$executeScript("return this.scrollHeight;")[[1]] # 循环滚动直到高度不再变化 while (current_height > previous_height) { previous_height <- current_height # 滚动到容器底部 scroll_container$executeScript("this.scrollTop = this.scrollHeight;") # 等待数据加载 Sys.sleep(3) current_height <- scroll_container$executeScript("return this.scrollHeight;")[[1]] } # --- 抓取并整理数据 --- page_source <- read_html(remDr$getPageSource()[[1]]) zipcode_data_table <- page_source %>% querySelector("div.tableEx") # 获取列表头 col_headers <- zipcode_data_table %>% querySelectorAll("div.columnHeaders div.pivotTableCellWrap") %>% map_chr(xml_text) %>% trimws() # 获取所有行数据 zipcode_data <- zipcode_data_table %>% querySelectorAll("div.bodyCells div.row") %>% map(function(row) { row %>% querySelectorAll("div.pivotTableCellWrap") %>% map_chr(xml_text) %>% trimws() }) # 转换为数据框并匹配表头 df_final <- zipcode_data %>% map_dfr(~tibble(!!!set_names(.x, col_headers))) %>% type_convert(trim_ws = TRUE, na = c("")) # 导出为CSV write_csv(df_final, "power_bi_data.csv") # 关闭浏览器与服务 remDr$close() selServ$stop()
内容的提问来源于stack exchange,提问作者Will
相关产品推荐
相关产品推荐

