使用CDS API自动下载CMIP6多模型数据时循环执行失败求助
CMIP6数据循环下载连接错误解决方法
问题描述
通过Python的cdsapi工具从CMIP6气候预测数据集下载数据时,单独指定单个模型可正常完成下载,但使用列表循环批量调用时出现连接错误,控制台提示无法解析服务器域名、无法建立新连接。
报错分析
报错信息中的getaddrinfo failed属于DNS解析失败,无法识别目标服务器域名。结合场景判断,主要可能是以下原因:
- 短时间内连续发起请求,触发了Copernicus服务器的访问限制
- 多次下载共用同一个文件名
download.zip,导致文件被占用或覆盖,间接引发连接异常 - 本地网络DNS解析不稳定,批量请求时出现解析失败
解决方案
针对上述问题,可通过以下修改解决:
为每个模型设置独立下载文件名
避免重复文件名导致的文件冲突或锁定问题,每个模型的下载文件单独命名。添加请求间隔
在循环中增加延迟,避免短时间内连续请求触发服务器限制。循环内重新初始化Client(可选)
若原连接池存在状态异常,每次循环重新初始化Client可保证请求连接状态正常。
修改后的代码
import cdsapi import time # 定义待下载的模型列表 models = ['cnrm_cm6_1', 'cmcc_cm2_sr5'] for model_name in models: # 每次循环初始化Client,避免连接池异常 c = cdsapi.Client() print(f"开始下载模型 {model_name} 的数据...") c.retrieve( 'projections-cmip6', { 'format': 'zip', 'experiment': 'historical', 'temporal_resolution': 'monthly', 'variable': 'precipitation', 'model': model_name, 'year': '2010', 'month': '01', 'area': [-2, 29, -3, 30], }, # 为每个模型生成独立文件名 f'download_{model_name}.zip' ) # 添加60秒延迟,避免请求过于频繁 time.sleep(60)
额外排查建议
- 检查本地网络稳定性,尝试切换到更稳定的网络环境
- 手动测试能否访问目标服务器域名,确认DNS解析正常
- 若仍有问题,可在初始化Client时设置更长超时参数,比如
c = cdsapi.Client(timeout=300)
内容的提问来源于stack exchange,提问作者Georges Abitbol
相关产品推荐
相关产品推荐

