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

