Python3 Selenium爬取EEX天然气现货数据遇问题:仅获Spot列且无法修改日期
优化EEX天然气现货数据提取Selenium脚本
问题分析
- 日期选择失效:原脚本直接对输入框执行
send_keys,但EEX的日期选择器是自定义组件,需先激活输入框、清除原有内容才能生效,且原XPATH可能因网站更新失效。 - 列数据提取不全:依赖
table.select('table')[1]的索引定位表格,网站结构变动后易定位错误;DataFrame列名处理逻辑有误,导致仅Spot列数据正常。
优化方案
- 精准交互日期选择器:用稳定的CSS选择器定位输入框,先激活、清除原有内容再输入日期,最后回车确认选择。
- 稳定定位数据表格:通过表格类名
table--bordered定位,避免依赖索引导致的定位偏差。 - 修复DataFrame列处理:正确提取表头行,确保列名与数据行匹配,解决列数据缺失问题。
- 替换硬等待为智能等待:用
WebDriverWait替代time.sleep,提升脚本稳定性与执行效率。 - 启用反爬规避:配置
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
相关产品推荐
相关产品推荐

