PowerBI政府版仪表盘表格爬取仅获20行,求完整解决代码
解决PowerBI政府版表格滚动加载爬取问题
问题分析
PowerBI仪表盘的表格采用虚拟滚动渲染机制,仅加载当前可见区域的行,未滚动到的行不会被DOM渲染,因此直接获取只能得到初始可见的20行。原代码仅执行一次滚动,无法触发后续行的加载。
完整解决代码
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import time url = "https://app.powerbigov.us/view?r=eyJrIjoiZDQxYTM0MDMtMGQ2Mi00ZTRkLThmNzQtNTYyYjBhNjhiMTQyIiwidCI6IjUwNzZjM2QxLTM4MDItNGI5Zi1iMzZhLWUwYTQxYmQ2NDJhNyJ9" driver = webdriver.Chrome() driver.get(url) # 等待页面中两个表格全部加载完成 WebDriverWait(driver, 30).until(EC.presence_of_all_elements_located((By.XPATH, "//div[@role='grid']"))) tables = driver.find_elements(By.XPATH, "//div[@role='grid']") for table_index, table in enumerate(tables, 1): print(f"=== 处理第 {table_index} 个表格 ===") # 循环滚动加载所有行,直到行数不再增加 previous_row_count = 0 current_row_count = len(table.find_elements(By.XPATH, ".//div[@role='row']")) while current_row_count > previous_row_count: previous_row_count = current_row_count # 仅滚动当前表格到最底部,避免滚动整个页面 driver.execute_script("arguments[0].scrollTop = arguments[0].scrollHeight;", table) # 等待PowerBI渲染新行,可根据网络情况调整等待时长 time.sleep(2) # 更新当前表格的行数 current_row_count = len(table.find_elements(By.XPATH, ".//div[@role='row']")) # 提取并打印所有行数据 rows = table.find_elements(By.XPATH, ".//div[@role='row']") print(f"第 {table_index} 个表格共获取到 {len(rows)} 行数据") for row in rows: try: cells = row.find_elements(By.XPATH, ".//div[@role='gridcell' and not(@class='prefix-cell')]") row_content = " | ".join([cell.text.strip() for cell in cells if cell.text.strip()]) print(row_content) except Exception as e: print(f"行数据提取失败: {str(e)}") driver.quit()
核心方案说明
- 多表格定位:通过
presence_of_all_elements_located等待页面中两个目标表格全部加载,分别处理每个表格的滚动逻辑 - 循环滚动触发加载:通过对比滚动前后的行数,持续滚动表格到底部,直到行数不再变化(确认所有行已渲染)
- 精准表格滚动:使用
execute_script直接操作表格元素的scrollTop属性,确保滚动范围仅局限于目标表格,而非整个页面 - 加载等待机制:每次滚动后添加短暂等待,给PowerBI足够时间完成新行的DOM渲染
内容的提问来源于stack exchange,提问作者ankit bhaskar
相关产品推荐
相关产品推荐

