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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 09:50:25