如何用Python从指定气象网站下载CSV数据文件?
解决加拿大气候数据网站CSV文件自动下载问题
你的方向是对的,但这类网站的下载按钮通常不会直接暴露CSV文件的静态链接,而是通过动态生成的API请求或表单提交返回文件,所以直接用BeautifulSoup遍历DOM找不到CSV地址是正常情况。以下是具体的解决思路:
- 用浏览器抓包分析真实请求:打开目标网页后按F12进入开发者工具,切换到「Network」标签,点击"download data"按钮,观察新增的网络请求。重点关注类型为
text/csv或返回文件的请求,它的Request URL就是获取CSV的真实地址,同时留意请求方法(GET/POST)和携带的参数(比如StationID、时间范围、数据时间粒度等)。 - 提取并构造请求参数:从原页面URL或DOM元素中提取关键参数(比如你的页面里StationID是51459,时间范围、
timeframe表示小时/日/月数据),结合抓包得到的请求格式,构造完整的下载链接。 - 用Python发送请求并保存文件:借助
requests库发送构造好的请求,注意带上模拟浏览器的请求头避免被拦截,最后将响应内容写入本地CSV文件。
示例代码
import requests # 根据抓包结果构造的下载链接(参数可按需调整) download_url = "https://climate.weather.gc.ca/climate_data/bulk_data_e.html?format=csv&stationID=51459&Year=2020&Month=5&Day=22&timeframe=1&submit=Download+Data" # 模拟浏览器请求头 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" } # 发送请求获取文件内容 response = requests.get(download_url, headers=headers) # 保存到本地CSV文件 with open("toronto_hourly_climate_20200522.csv", "wb") as file: file.write(response.content)
内容的提问来源于stack exchange,提问作者jjk
相关产品推荐
相关产品推荐

