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后,再用同一个会话请求下载链接。具体步骤如下:
- 安装依赖:需要
beautifulsoup4解析登录页面获取CSRF令牌,执行:
pip install beautifulsoup4 requests
- 示例代码:
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
相关产品推荐
相关产品推荐

