使用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
相关产品推荐
相关产品推荐

