如何用Python获取并下载隐藏在JavaScript后的MISO网站CSV文件?
解决MISO能源网站动态CSV链接的Python下载方案
这个网站的“Download to CSV”按钮并非直接提供静态链接,而是通过JavaScript触发后台接口生成临时下载地址,所以直接请求父页面拿不到有效下载链接。下面提供两种可行的解决方法:
方法一:直接抓取后台API接口
这是效率最高的方案,无需模拟浏览器,直接对接生成CSV的后台接口:
- 打开浏览器开发者工具(按F12),切换到「Network」标签页,勾选「Preserve log」选项。
- 点击页面上的“Download to CSV”按钮,观察网络请求列表,找到触发下载的请求(通常为POST类型,响应内容是CSV格式)。
- 复制该请求的URL、请求头(Headers)和请求体(Body),包括所有携带的参数(比如筛选条件、时间范围等)。
- 用Python的
requests库模拟这个请求,将响应内容保存为CSV文件。
示例代码:
import requests # 替换为你抓取到的真实API地址 api_url = "https://www.misoenergy.org/api/interactivequeue/downloadcsv" # 模拟浏览器请求头,至少保留User-Agent和Referer字段 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36", "Referer": "https://www.misoenergy.org/planning/generator-interconnection/GI_Queue/gi-interactive-queue/" } # 替换为你抓取到的真实请求体参数,可能是表单或JSON格式 payload = { "filter_param1": "value1", "filter_param2": "value2" } # 发送请求并保存文件 response = requests.post(api_url, headers=headers, data=payload) if response.status_code == 200: with open("miso_gi_queue.csv", "wb") as f: f.write(response.content) print("CSV文件下载完成") else: print(f"请求失败,状态码:{response.status_code}")
方法二:用Selenium模拟浏览器点击
如果不想分析接口,直接模拟人工操作浏览器也能完成下载:
- 安装依赖:执行
pip install selenium webdriver-manager(webdriver-manager可自动管理浏览器驱动,无需手动下载)。 - 编写代码打开目标页面、等待按钮加载、模拟点击操作,自动完成文件下载。
示例代码:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from webdriver_manager.chrome import ChromeDriverManager import time # 自定义浏览器下载路径(可选,不设置则用默认下载目录) options = webdriver.ChromeOptions() prefs = {"download.default_directory": "你的本地文件保存路径"} options.add_experimental_option("prefs", prefs) # 启动Chrome浏览器 driver = webdriver.Chrome(ChromeDriverManager().install(), options=options) driver.get("https://www.misoenergy.org/planning/generator-interconnection/GI_Queue/gi-interactive-queue/") try: # 等待下载按钮加载完成,最长等待10秒 download_btn = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.XPATH, "//button[contains(text(), 'Download to CSV')]")) ) # 点击下载按钮 download_btn.click() # 根据文件大小调整等待时间,确保下载完成 time.sleep(5) print("文件下载完成") finally: # 关闭浏览器 driver.quit()
注意事项:
- 抓取API时,请求头和参数要与浏览器发起的完全一致,否则可能被服务器拦截。
- 使用Selenium时,若页面加载缓慢,可适当延长等待时间;webdriver-manager会自动匹配浏览器与驱动版本,无需手动校验。
内容的提问来源于stack exchange,提问作者d0m1n0
相关产品推荐
相关产品推荐

