如何在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
相关产品推荐
相关产品推荐

