You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 03:05:21