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

Python3 Selenium爬取EEX天然气现货数据遇问题:仅获Spot列且无法修改日期

优化EEX天然气现货数据提取Selenium脚本

问题分析

  • 日期选择失效:原脚本直接对输入框执行send_keys,但EEX的日期选择器是自定义组件,需先激活输入框、清除原有内容才能生效,且原XPATH可能因网站更新失效。
  • 列数据提取不全:依赖table.select('table')[1]的索引定位表格,网站结构变动后易定位错误;DataFrame列名处理逻辑有误,导致仅Spot列数据正常。

优化方案

  1. 精准交互日期选择器:用稳定的CSS选择器定位输入框,先激活、清除原有内容再输入日期,最后回车确认选择。
  2. 稳定定位数据表格:通过表格类名table--bordered定位,避免依赖索引导致的定位偏差。
  3. 修复DataFrame列处理:正确提取表头行,确保列名与数据行匹配,解决列数据缺失问题。
  4. 替换硬等待为智能等待:用WebDriverWait替代time.sleep,提升脚本稳定性与执行效率。
  5. 启用反爬规避:配置selenium_stealth模拟真实浏览器行为,降低被反爬拦截的概率。

优化后的完整代码

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup as bs
import pandas as pd
from selenium_stealth import stealth
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.keys import Keys

url = "https://www.eex.com/en/market-data/natural-gas/spot"

# 配置Chrome选项
chrome_options = Options()
chrome_options.add_argument("--no-sandbox")
chrome_options.add_argument("--headless=new")  # 新版无头模式,更贴近真实浏览器
chrome_options.add_argument("--start-maximized")
chrome_options.add_argument("--disable-blink-features=AutomationControlled")  # 禁用自动化标识

# 初始化浏览器并配置stealth
service = Service("chromedriver1/chromedriver")
browser = webdriver.Chrome(service=service, options=chrome_options)

stealth(browser,
        languages=["en-US", "en"],
        vendor="Google Inc.",
        platform="Win32",
        webgl_vendor="Intel Inc.",
        renderer="Intel Iris OpenGL Engine",
        fix_hairline=True,
        )

try:
    browser.get(url)
    
    # 等待日期输入框可点击,激活并操作
    date_input = WebDriverWait(browser, 20).until(
        EC.element_to_be_clickable((By.CSS_SELECTOR, "#symbolheader_ngs input[type='text']"))
    )
    date_input.click()
    date_input.clear()
    date_input.send_keys("2023-01-23")
    date_input.send_keys(Keys.ENTER)  # 回车确认日期选择
    
    # 等待表格数据加载完成
    WebDriverWait(browser, 20).until(
        EC.presence_of_element_located((By.CSS_SELECTOR, "table.table--bordered"))
    )
    
    # 解析页面数据
    soup = bs(browser.page_source, "html.parser")
    table = soup.find("table", class_="table--bordered")
    if not table:
        raise ValueError("未找到目标数据表格")
    
    # 提取表头与数据行
    header = [th.get_text(strip=True) for th in table.find("tr").find_all("th")]
    data_rows = []
    for row in table.find_all("tr")[1:]:
        cols = [td.get_text(strip=True) for td in row.find_all("td")]
        if cols:
            data_rows.append(cols)
    
    # 构建DataFrame并保存
    df = pd.DataFrame(data_rows, columns=header)
    df.to_excel("eex_natural_gas_spot.xlsx", index=False)
    print("数据提取完成,已保存到eex_natural_gas_spot.xlsx")

finally:
    browser.quit()

关键优化点说明

  • 日期选择逻辑:通过点击激活、清除内容、回车确认的流程,确保日期选择操作生效,解决原脚本直接输入无效的问题。
  • 表格定位:使用类名定位表格,比索引更稳定,适配网站结构的潜在更新。
  • 反爬处理:启用selenium_stealth并禁用自动化标识,模拟真实浏览器特征,降低被拦截风险。
  • 智能等待:所有元素等待均使用WebDriverWait,避免硬等待导致的资源浪费或加载不充分问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 19:10:19