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

Python使用requests下载USGS ECOSTRESS数据遇HTTP Basic权限拒绝

问题:Python requests下载USGS ECOSTRESS数据时HTTP Basic认证失败

尝试用Python从USGS下载ECOSTRESS的.h5数据,链接为:https://e4ftl01.cr.usgs.gov/ECOB/ECOSTRESS/ECO2LSTE.001/2022.08.30/ECOSTRESS_L2_LSTE_23529_005_20220830T064558_0601_02.h5。手动在Mac浏览器打开需要登录Earthdata验证,输入正确凭证可正常访问,但用requests库尝试以下方式均失败:

  • 使用auth参数:response = requests.get(url, auth=(config.username, config.password)),返回b'HTTP Basic: Access denied.'
  • 凭证嵌入URL:response = requests.get('https://username:password@e4ftl01.cr.usgs.gov/...'),同样失败
  • 尝试过POST请求,核对凭证无误仍无效,需要批量下载无法手动操作,求问题原因及解决方法。

问题原因及解决方法

原因

USGS的ECOSTRESS数据托管在Earthdata系统上,不支持直接的HTTP Basic认证,浏览器登录时实际走的是表单认证+会话Cookie的流程,而非简单的Basic Auth,所以直接用auth参数或URL嵌入凭证的方式会被拒绝。

解决方法:使用会话+表单登录获取认证Cookie

需要先通过Earthdata的登录页面完成表单认证,获取会话Cookie后,再用同一个会话请求下载链接。具体步骤如下:

  1. 安装依赖:需要beautifulsoup4解析登录页面获取CSRF令牌,执行:
pip install beautifulsoup4 requests
  1. 示例代码:
import requests
from bs4 import BeautifulSoup

# 替换为你的Earthdata凭证和目标下载链接
USERNAME = "your_earthdata_username"
PASSWORD = "your_earthdata_password"
DOWNLOAD_URL = "https://e4ftl01.cr.usgs.gov/ECOB/ECOSTRESS/ECO2LSTE.001/2022.08.30/ECOSTRESS_L2_LSTE_23529_005_20220830T064558_0601_02.h5"
SAVE_PATH = "ECOSTRESS_L2_LSTE.h5"

# 创建会话,自动维护Cookie
session = requests.Session()

# 第一步:获取登录页面,提取CSRF令牌(表单提交必填)
login_page = session.get("https://urs.earthdata.nasa.gov/login")
soup = BeautifulSoup(login_page.content, "html.parser")
csrf_token = soup.find("input", attrs={"name": "authenticity_token"})["value"]

# 第二步:构造登录表单数据,提交登录请求
login_payload = {
    "username": USERNAME,
    "password": PASSWORD,
    "authenticity_token": csrf_token,
    "utf8": "✓",
    "commit": "Login"
}
session.post("https://urs.earthdata.nasa.gov/login", data=login_payload)

# 第三步:使用已认证的会话下载文件
response = session.get(DOWNLOAD_URL, stream=True)
if response.status_code == 200:
    with open(SAVE_PATH, "wb") as f:
        # 分块写入大文件,避免内存溢出
        for chunk in response.iter_content(chunk_size=1024*1024):
            f.write(chunk)
    print(f"文件已保存至:{SAVE_PATH}")
else:
    print(f"下载失败,状态码:{response.status_code},响应内容:{response.text}")

额外注意事项

  • 如果开启了Earthdata账户的两步验证,需要生成应用专用密码(登录Earthdata账户后,在"Settings"->"App-specific passwords"中创建),替换代码中的普通密码。
  • 批量下载时,只需创建一次会话并登录,之后循环请求所有下载链接即可,无需重复登录,提升效率。
  • 用stream=True处理大文件,分块写入磁盘,避免一次性加载整个文件到内存。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 17:14:58