使用Python抓取嵌入网站的PowerBI报表时遇Selenium超时问题求助
问题分析与解决方案
原代码核心问题
- iframe选择器错误:原代码用
iframe.mapbox定位PowerBI的iframe,但实际页面中PowerBI报表的iframe并不带有该类,导致无法找到目标iframe触发超时。 - 缺少分页操作:原代码未实现切换到第2页的逻辑,直接尝试抓取内容,无法获取目标页面数据。
- 无头模式配置不足:仅设置
--headless和--disable-gpu可能导致页面渲染异常,元素无法正常加载。
修正后的代码
import time from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.chrome.options import Options from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 优化Chrome无头模式配置 chrome_options = Options() chrome_options.add_argument("--headless=new") # 新版无头模式兼容性更强 chrome_options.add_argument("--disable-gpu") chrome_options.add_argument("--window-size=1920x1080") # 设置窗口大小,避免元素因视口过小不可见 chrome_options.add_argument("--no-sandbox") # 解决部分环境权限问题 chromedriver_path = "~/bin/chromedriver" url = "https://www.transport.nsw.gov.au/data-and-research/drives-reporting-portal/registration-snapshot-report" # 基于PowerBI特征定位iframe,避免依赖不稳定的class powerbi_iframe_selector = 'iframe[src*="powerbi"]' # 第2页分页按钮选择器 page_2_button_selector = '[aria-label="Page 2"]' # 报表内容容器选择器 report_content_selector = ".visualContainerHost" service = Service(chromedriver_path) driver = webdriver.Chrome(service=service, options=chrome_options) driver.get(url) try: # 等待PowerBI iframe加载并切换上下文 iframe = WebDriverWait(driver, 30).until( EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR, powerbi_iframe_selector)) ) # 等待报表核心容器加载完成 WebDriverWait(driver, 30).until( EC.visibility_of_element_located((By.CSS_SELECTOR, report_content_selector)) ) # 等待分页控件可用并点击第2页 page_2_button = WebDriverWait(driver, 20).until( EC.element_to_be_clickable((By.CSS_SELECTOR, page_2_button_selector)) ) page_2_button.click() # 等待第2页数据渲染完成(可根据实际加载速度调整时长) time.sleep(5) # 获取第2页报表内容 report_contents = driver.find_element(By.CSS_SELECTOR, report_content_selector).get_attribute("innerHTML") print(report_contents) finally: driver.quit()
关键调整说明
- iframe定位优化:通过
src*="powerbi"匹配PowerBI专属iframe,避免依赖易变的class名称。 - 添加分页逻辑:明确实现点击第2页按钮的操作,确保抓取目标页面数据。
- 增强无头模式:使用新版无头模式并配置窗口大小、禁用沙箱,提升页面渲染稳定性。
- 延长等待时间:将超时时间调整为30秒,适配PowerBI报表的加载速度。
内容的提问来源于stack exchange,提问作者Sam Hunter
相关产品推荐
相关产品推荐

