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

使用Python自动下载指定网站特定CSV文件的技术问题

解决方法:抓取动态生成的CSV文件

我之前处理过不少这类金融数据平台的下载需求,这类网站的CSV文件通常不是静态挂在页面上的——点击"Upload"按钮时,其实是向后台API发送了一个请求,服务器实时生成CSV内容再返回给浏览器,这就是你在页面源码里找不到直接CSV链接的原因。下面是具体的解决步骤:

1. 用浏览器开发者工具抓包分析下载请求

首先得搞清楚点击下载时到底发送了什么请求:

  • 打开目标页面,按下F12打开开发者工具,切换到Network面板
  • 在页面上选择你要下载的"Settlement price"或"BASE Year"选项,点击"Upload"按钮
  • 这时Network面板会出现一个新的请求(通常是GET或POST方法,响应类型为text/csv)
  • 点击这个请求,查看它的Request URL、Headers(尤其是User-Agent、Referer、Cookie这些)和携带的参数,这些是我们后面用Python模拟请求的关键

2. 用Python模拟请求下载CSV

根据抓包得到的信息,我们可以用requests库来模拟浏览器发送请求,直接获取CSV内容并保存。以下是示例代码(注意替换成你抓包得到的实际参数):

import requests

# 从抓包结果中复制实际的下载接口URL
download_api = "https://wyniki.tge.pl/en/wyniki/archiwum/2/download"

# 模拟浏览器的请求头,至少带上User-Agent,其他必要的头(如Cookie、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://wyniki.tge.pl/en/wyniki/archiwum/2/?date_to=2018-03-21&date_from=2018-02-19&data_scope=contract&market=rtee&data_period=3"
}

# 构造请求参数,包含页面筛选条件和下载类型(type值从抓包结果获取)
# 下载Settlement price时的参数
settlement_params = {
    "date_to": "2018-03-21",
    "date_from": "2018-02-19",
    "data_scope": "contract",
    "market": "rtee",
    "data_period": "3",
    "type": "settlement_price"  # 替换成抓包得到的实际值
}

# 发送请求并保存Settlement price的CSV
response = requests.get(download_api, headers=headers, params=settlement_params)
if response.status_code == 200:
    with open("settlement_price_2018.csv", "w", encoding="utf-8") as f:
        f.write(response.text)
    print("Settlement price CSV文件已保存!")
else:
    print(f"下载失败,状态码:{response.status_code}")

# 下载BASE Year时,只需要修改type参数即可
base_year_params = settlement_params.copy()
base_year_params["type"] = "base_year"  # 替换成抓包得到的BASE Year对应的type值

response = requests.get(download_api, headers=headers, params=base_year_params)
if response.status_code == 200:
    with open("base_year_2018.csv", "w", encoding="utf-8") as f:
        f.write(response.text)
    print("BASE Year CSV文件已保存!")
else:
    print(f"下载失败,状态码:{response.status_code}")

注意事项

  • 如果网站有反爬机制,可能需要带上抓包得到的Cookie(注意Cookie有有效期,过期后需要重新抓取)
  • 确保参数中的type值和抓包结果一致,不同的下载类型对应不同的参数值
  • 如果请求是POST方法,就把参数放在data参数里传递,而不是params

内容的提问来源于stack exchange,提问作者John.Doh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:37:55