如何通过Web Scraping抓取Nordpool 2021年全时段风电预测表格数据
解决方案
核心思路
要抓取2021年所有日期的风电预测数据,需自动操作页面日期选择器并触发查询,核心步骤如下:
- 生成2021年所有日期,格式适配网站输入要求
- 通过JavaScript修改
data-end-date输入框的日期值(直接输入可能因组件只读限制失效) - 触发查询按钮加载对应日期的数据
- 循环抓取并合并所有日期的有效数据
完整代码
from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from bs4 import BeautifulSoup import pandas as pd from datetime import date, timedelta # 初始化浏览器 options = webdriver.ChromeOptions() options.add_experimental_option("detach", True) webdriver_service = Service("./chromedriver") # 替换为你的chromedriver路径 driver = webdriver.Chrome(service=webdriver_service, options=options) # 初始化总数据容器 all_data = pd.DataFrame() # 生成2021年所有日期(格式:dd-mm-yyyy) start_date = date(2021, 1, 1) end_date = date(2021, 12, 31) delta = timedelta(days=1) current_date = start_date while current_date <= end_date: # 格式化日期为网站要求的格式 formatted_date = current_date.strftime("%d-%m-%Y") print(f"正在抓取日期:{formatted_date}") try: # 打开目标页面 driver.get('https://www.nordpoolgroup.com/en/Market-data1/Power-system-data/Production1/Wind-Power-Prognosis/SE/Hourly/?view=table') # 等待并点击同意按钮 WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, '//*[@class="pure-button"]'))).click() # 使用JavaScript修改日期输入框的值 date_input = WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.ID, 'data-end-date'))) driver.execute_script(f"arguments[0].value = '{formatted_date}';", date_input) # 触发查询按钮 show_button = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, '//button[contains(text(), "Show")]'))) show_button.click() # 等待表格加载完成 WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.CLASS_NAME, 'table-responsive'))) # 解析页面并提取表格数据 soup = BeautifulSoup(driver.page_source, "html.parser") df = pd.read_html(str(soup))[1] # 清理数据:移除无关列和行,添加日期标识 df.drop(columns=[formatted_date, 'SE'], inplace=True, errors='ignore') df = df.iloc[:24] # 保留24小时数据 df['日期'] = formatted_date # 合并到总数据 all_data = pd.concat([all_data, df], ignore_index=True) except Exception as e: print(f"抓取日期{formatted_date}失败:{str(e)}") # 日期前进一天 current_date += delta # 保存结果到CSV all_data.to_csv('2021_sweden_wind_prognosis.csv', index=False) print("数据抓取完成,已保存为2021_sweden_wind_prognosis.csv") # 关闭浏览器 driver.quit()
关键说明
- 日期输入处理:网站日期输入框为只读组件,直接
send_keys无法修改,因此用execute_script直接修改DOM元素的value属性 - 元素等待:全程使用
WebDriverWait替代time.sleep,提升程序稳定性和执行效率 - 异常处理:添加try-except块,避免单个日期抓取失败导致整个程序终止
- 数据清理:根据页面表格结构,保留前24行对应24小时数据,并添加日期列方便后续分析
内容的提问来源于stack exchange,提问作者user20050294
相关产品推荐
相关产品推荐

