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

如何在Kaggle Notebook中获取EIA网站的xlsx文件及元信息

解决方案:Kaggle Notebook爬取EIA电网监控数据

问题原因

你之前用requests+BeautifulSoup抓不到目标xlsx链接,核心原因是这个页面的内容是JavaScript动态渲染的——requests只能获取初始静态HTML,而地区xlsx链接是页面加载后通过JS动态生成的,所以静态源码里根本没有这些内容。

可行方案

下面提供两种适配Kaggle Notebook的方案,优先推荐方案二(更高效稳定):

方案一:用Selenium抓取动态内容

Kaggle支持Selenium,需先配置Chrome浏览器环境:

# 安装依赖(Kaggle预装部分库,缺啥补啥)
!pip install selenium webdriver-manager pandas

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import pandas as pd
import requests
import os

# 配置Chrome无头模式(适配Kaggle环境)
chrome_options = Options()
chrome_options.add_argument("--headless")
chrome_options.add_argument("--no-sandbox")
chrome_options.add_argument("--disable-dev-shm-usage")

# 初始化浏览器并访问目标页
driver = webdriver.Chrome(options=chrome_options)
target_url = "https://www.eia.gov/electricity/gridmonitor/dashboard/electric_overview/US48/US48"
driver.get(target_url)

# 等待页面加载完成,定位所有地区xlsx链接
wait = WebDriverWait(driver, 10)
links = wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "a[href*='Region_'][href$='.xlsx']")))

# 整理元信息到目标DataFrame格式
meta_data = []
base_url = "https://www.eia.gov"
for link in links:
    href = link.get_attribute("href")
    # 从URL提取地区ID(比如Region_CAL.xlsx → CAL)
    region_id = href.split("_")[-1].split(".")[0]
    # 从链接文本获取地区名称
    region_name = link.text.strip()
    meta_data.append({
        "ID": region_id,
        "Type": "Region",
        "Name": region_name,
        "URL": href if href.startswith("http") else base_url + href
    })

url_meta_df = pd.DataFrame(meta_data)
print(url_meta_df)

# 批量下载xlsx文件
save_dir = "./eia_xlsx_files"
os.makedirs(save_dir, exist_ok=True)

for idx, row in url_meta_df.iterrows():
    file_url = row["URL"]
    file_name = f"{row['ID']}_{row['Name']}.xlsx"
    file_path = os.path.join(save_dir, file_name)
    
    response = requests.get(file_url)
    with open(file_path, "wb") as f:
        f.write(response.content)
    print(f"已下载:{file_path}")

# 关闭浏览器
driver.quit()

方案二:直接调用官方API(推荐)

EIA电网监控页面的数据源来自官方API,直接请求API可避免动态渲染问题,速度更快:

import pandas as pd
import requests
import os

# 调用EIA地区元数据API(抓包获取的稳定接口)
api_url = "https://api.eia.gov/gridmonitor/v1/regions?region_type=load_region"
response = requests.get(api_url)
data = response.json()

# 整理成目标格式的DataFrame
meta_data = []
base_xlsx_url = "https://www.eia.gov/electricity/gridmonitor/knownissues/xls/Region_{}.xlsx"
for region in data["regions"]:
    region_id = region["region_id"]
    region_name = region["name"]
    xlsx_url = base_xlsx_url.format(region_id)
    meta_data.append({
        "ID": region_id,
        "Type": "Region",
        "Name": region_name,
        "URL": xlsx_url
    })

url_meta_df = pd.DataFrame(meta_data)
# 可选:过滤你需要的特定地区
url_meta_df = url_meta_df[url_meta_df["ID"].isin(["CAL", "CAR", "CENT", "FLA"])]
print(url_meta_df)

# 批量下载文件
save_dir = "./eia_xlsx_files"
os.makedirs(save_dir, exist_ok=True)

for idx, row in url_meta_df.iterrows():
    file_url = row["URL"]
    file_name = f"{row['ID']}_{row['Name']}.xlsx"
    file_path = os.path.join(save_dir, file_name)
    
    response = requests.get(file_url)
    with open(file_path, "wb") as f:
        f.write(response.content)
    print(f"已下载:{file_path}")

注意事项

  • Kaggle用Selenium时,--headless、--no-sandbox参数必须加,否则会触发环境限制报错。
  • API接口若后续更新,可通过浏览器F12抓包重新获取最新地址。
  • 注意Kaggle的存储空间限制,避免批量下载过多文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 19:05:35