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

如何用Python结合API、日期约束编写循环爬取气象数据并保存为CSV

解决AEMET API多站点气象数据获取与CSV保存问题

嘿,我来帮你理顺这个问题!你已经迈出了很好的第一步,接下来咱们调整代码,把日期约束融入循环,再把数据顺利导出成CSV文件。

一、给循环加上日期约束

你之前的循环没把日期参数和站点关联起来——其实每个站点的API请求都需要带上你定义的start和end日期范围。咱们重新写循环,让每个站点都用正确的日期范围去请求数据:

import requests
import json
import pandas as pd

# 基础配置
base_url = 'https://opendata.aemet.es/opendata/api/valores/climatologicos/diarios/datos/'
start_date = 'fechaini/2000-01-01T00:00:00UTC/'
end_date = 'fechafin/2003-01-01T00:00:00UTC/'
api_key = 'xxxxxxxxx'  # 替换成你的真实API密钥
stations = ['1690A', '其他站点ID']  # 把你要爬的站点都放这里

responses = []

for station in stations:
    # 为每个站点构建完整的API请求URL
    complete_url = f"{base_url}{start_date}{end_date}estacion/{station}/{api_key}"
    
    # 第一步:获取数据的实际链接
    response = requests.get(complete_url)
    if response.status_code != 200:
        print(f"请求站点{station}失败,状态码:{response.status_code}")
        continue
    
    data_url = json.loads(response.text)['datos']
    
    # 第二步:获取实际的气象数据
    data_response = requests.get(data_url)
    if data_response.status_code != 200:
        print(f"获取站点{station}数据失败,状态码:{data_response.status_code}")
        continue
    
    station_data = json.loads(data_response.text)
    responses.extend(station_data)  # 用extend把每个站点的数据平合并到列表里

这里的关键是:每个站点的请求URL都包含了固定的日期范围,所以循环里每一次请求都会获取该站点2000-2003年的所有数据,完美解决日期约束的问题。

二、把数据保存为CSV文件

用pandas来处理CSV导出是最省心的,它能自动识别JSON的字段作为表头,还能处理多站点数据的合并:

# 把所有数据转换成DataFrame
df = pd.DataFrame(responses)

# 保存为CSV文件,设置编码避免乱码,索引不要写入
df.to_csv('aemet_2000-2003_climate_data.csv', encoding='utf-8-sig', index=False)

print("数据已成功保存为CSV文件!")

如果你不想用pandas,也可以用Python内置的csv模块,稍微麻烦一点,但也能实现:

import csv

if not responses:
    print("没有数据可保存!")
else:
    # 获取表头(取第一条数据的键)
    fieldnames = responses[0].keys()
    
    with open('aemet_2000-2003_climate_data.csv', 'w', newline='', encoding='utf-8-sig') as csvfile:
        writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
        writer.writeheader()
        writer.writerows(responses)
    
    print("数据已成功保存为CSV文件!")

几点注意事项

  • 记得替换代码里的api_key为你的真实AEMET API密钥;
  • 如果站点列表里有很多站点,建议在循环里加个time.sleep(1),避免请求太频繁被限流;
  • 可以添加更多错误处理,比如判断data_url是否存在(防止API返回异常)。

内容的提问来源于stack exchange,提问作者mariancatholic

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 12:37:45