Python Selenium爬取EEX德国电力期货数据遇问题及历史数据需求
问题分析与解决方案
一、当前代码的核心问题
- 未等待动态元素加载:页面数据为异步渲染,直接调用
find_element会在德国电力数据组件未加载完成时执行,导致获取默认的奥地利数据。 - XPATH路径错误:循环中使用
//tr是全局查询所有<tr>元素,而非仅在目标<tbody>下查找,会混入其他区域的行数据。 - 锚点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
相关产品推荐
相关产品推荐

