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

Python Selenium爬取EEX德国电力期货数据遇问题及历史数据需求

问题分析与解决方案

一、当前代码的核心问题

  1. 未等待动态元素加载:页面数据为异步渲染,直接调用find_element会在德国电力数据组件未加载完成时执行,导致获取默认的奥地利数据。
  2. XPATH路径错误:循环中使用//tr是全局查询所有<tr>元素,而非仅在目标<tbody>下查找,会混入其他区域的行数据。
  3. 锚点URL未等待加载:带锚点的URL需要等待页面完全渲染后再抓取数据,否则会因元素未加载返回空。

二、修正后的德国电力期货数据爬取代码

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

options = Options()
# 可选:开启无头模式,避免弹出浏览器窗口
# options.add_argument("--headless=new")

def get_german_power_futures():
    driver = webdriver.Chrome(options=options)
    try:
        # 直接使用锚点URL定位德国电力期货区域
        driver.get('https://www.eex.com/en/market-data/power/futures#%7B%22snippetpicker%22%3A%2228%22%7D')
        
        # 等待目标tbody加载完成,最长等待10秒
        wait = WebDriverWait(driver, 10)
        tbody = wait.until(EC.presence_of_element_located(
            (By.XPATH, '//*[@id="baseloadwidget_pfpde"]/table/tbody')
        ))
        
        data = []
        # 使用相对路径.//tr仅在当前tbody下查找行
        for tr in tbody.find_elements(By.XPATH, './/tr'):
            row = [item.text.strip() for item in tr.find_elements(By.XPATH, './/td')]
            if row:  # 过滤空行
                data.append(row)
        
        print("德国电力期货数据:")
        for row in data:
            print(row)
        return data
    finally:
        driver.quit()

if __name__ == '__main__':
    get_german_power_futures()

三、获取D0、D-1、D-2、D-3数据的方法

这类短期/日内电力数据通常在页面的**Intraday(日内交易)**板块中,需先切换对应tab再抓取:

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

options = Options()

def get_short_term_power_data():
    driver = webdriver.Chrome(options=options)
    try:
        driver.get('https://www.eex.com/en/market-data/power/futures')
        
        # 点击切换到Intraday板块(若元素文本或路径变更,需用浏览器开发者工具重新定位)
        intraday_tab = WebDriverWait(driver, 10).until(
            EC.element_to_be_clickable((By.XPATH, '//a[contains(text(), "Intraday")]'))
        )
        intraday_tab.click()
        
        # 等待短期数据表格加载(XPATH需根据实际页面结构调整)
        short_term_tbody = WebDriverWait(driver, 10).until(
            EC.presence_of_element_located(
                (By.XPATH, '//*[@id="intradaywidget_pfpde"]/table/tbody')
            )
        )
        
        data = []
        for tr in short_term_tbody.find_elements(By.XPATH, './/tr'):
            row = [item.text.strip() for item in tr.find_elements(By.XPATH, './/td')]
            if row:
                data.append(row)
        
        print("短期电力数据(D0/D-1等):")
        for row in data:
            print(row)
        return data
    finally:
        driver.quit()

if __name__ == '__main__':
    get_short_term_power_data()

关键注意事项

  • XPATH验证:用浏览器开发者工具(F12)定位元素,确保路径准确,避免页面更新导致路径失效。
  • 等待策略:必须使用WebDriverWait等待元素加载,避免异步渲染导致数据为空或错误。
  • 页面切换:部分数据需切换tab显示,需确保tab可点击并完成切换后再抓取数据。

内容的提问来源于stack exchange,提问作者Nikolina9113

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 16:35:27