Google Colab使用Requests下载NASA Earthdata遇401鉴权失败及.netrc配置求助
Colab环境下NASA Earthdata GPM数据下载401鉴权报错的解决方法
- 首先解决.netrc文件不被识别的核心问题:
Colab默认的用户主目录为/root,Requests库只会自动读取该目录下权限合规的.netrc文件。如果之前把文件存在其他路径、或是文件权限不符合安全要求,库会直接跳过加载配置。
直接在Colab单元格执行以下代码生成合规的配置文件,替换成你自己的Earthdata账号信息即可:!cat << EOF > /root/.netrc machine urs.earthdata.nasa.gov login 你的Earthdata注册用户名 password 你的Earthdata账号密码 EOF # 必须设置600权限,否则Requests会判定.netrc不安全,拒绝加载 !chmod 600 /root/.netrc - 修正下载请求的逻辑缺陷:
原代码直接调用requests.get()发起请求,既不会自动关联.netrc存储的鉴权信息,也会在NASA的302重定向鉴权链路中丢失会话cookie,是触发401报错的直接原因。替换成带自动鉴权的会话逻辑,分块写入大文件避免Colab内存溢出:import requests from requests.auth import HTTPBasicAuth # 初始化自动读取.netrc配置的会话 dl_session = requests.Session() # 绑定.netrc的鉴权信息到会话 dl_session.auth = HTTPBasicAuth.from_netrc() for i in range(len(rutas_GPM)): target_url = rutas_GPM.iloc[i,0] save_name = f'GPM{i}.nc' save_full_path = "/content/drive/MyDrive/Colab Notebooks/Prueba/" + save_name try: # 允许跨域重定向,设置10分钟超时适配大文件下载 resp = dl_session.get(target_url, allow_redirects=True, timeout=600) resp.raise_for_status() # 分块写入文件,避免大文件占用全部Colab运行时内存 with open(save_full_path, 'wb') as f: for chunk in resp.iter_content(chunk_size=1024*1024): if chunk: f.write(chunk) print(f'{save_name} 下载完成,已保存到目标路径') except Exception as e: err_code = resp.status_code if 'resp' in locals() else "请求未正常发出" print(f'{save_name} 下载失败,错误码{err_code},详情:{str(e)}') - 常见排查点:
- 每次Colab运行时重启,都要重新执行一遍生成.netrc的代码,因为运行时的本地临时文件不会跨会话保留
- 确认你的Earthdata账号已经开通了对应GPM数据集合的访问权限,未授权的账号就算鉴权流程走完,也会返回403/401错误
- 不要直接把账号密码拼接到下载URL的参数里,NASA的网关会自动拦截这类带敏感参数的请求
内容的提问来源于stack exchange,提问作者Devis Alexander Perez Campo
相关产品推荐
相关产品推荐

