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

使用Python抓取嵌入网站的PowerBI报表时遇Selenium超时问题求助

问题分析与解决方案

原代码核心问题

  1. iframe选择器错误:原代码用iframe.mapbox定位PowerBI的iframe,但实际页面中PowerBI报表的iframe并不带有该类,导致无法找到目标iframe触发超时。
  2. 缺少分页操作:原代码未实现切换到第2页的逻辑,直接尝试抓取内容,无法获取目标页面数据。
  3. 无头模式配置不足:仅设置--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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 09:07:44