NASA HDF文件下载失败求助:Requests/urllib无法获取71MB文件
解决NASA HDF文件下载失败的问题
问题根源
你遇到的下载失败(仅下载11KB)是因为NASA的LADS Web归档数据需要Earthdata账号认证,未提供认证信息时,服务器返回的是登录提示页面而非实际数据文件。另外,你用h5py直接写入response.content的方式是错误的——h5py是用于读写本地HDF5文件的工具,不能直接处理HTTP响应内容。
解决步骤
1. 注册Earthdata账号
首先需要注册NASA的Earthdata账号,这是访问EOSDIS归档数据的必要前提。
2. 带认证的分块下载(推荐用requests)
使用requests会话保持认证,并分块下载大文件(避免内存占用过高):
import requests # 替换为你的Earthdata账号信息 username = "你的Earthdata用户名" password = "你的Earthdata密码" url = "https://ladsweb.modaps.eosdis.nasa.gov/archive/allData/61/MOD021KM/2022/152/MOD021KM.A2022152.1930.061.2022153073644.hdf" # 创建会话并设置认证 session = requests.Session() session.auth = (username, password) # 分块下载文件 with session.get(url, stream=True) as response: response.raise_for_status() # 检查请求是否成功 with open("MOD021KM.A2022152.1930.061.2022153073644.hdf", "wb") as f: for chunk in response.iter_content(chunk_size=8192): f.write(chunk)
3. 使用urllib带认证下载
如果偏好urllib,可以添加HTTP基本认证处理器:
from urllib.request import build_opener, HTTPBasicAuthHandler, install_opener, urlretrieve username = "你的Earthdata用户名" password = "你的Earthdata密码" url = "https://ladsweb.modaps.eosdis.nasa.gov/archive/allData/61/MOD021KM/2022/152/MOD021KM.A2022152.1930.061.2022153073644.hdf" # 配置认证处理器 auth_handler = HTTPBasicAuthHandler() auth_handler.add_password(realm="LADS", uri=url, user=username, passwd=password) opener = build_opener(auth_handler) install_opener(opener) # 执行下载 local_filename, headers = urlretrieve(url) print(f"文件已保存至:{local_filename}")
4. 正确使用h5py读取文件
下载完成后,再用h5py读取本地HDF文件:
import h5py with h5py.File("MOD021KM.A2022152.1930.061.2022153073644.hdf", "r") as f: print("文件中的数据集:", list(f.keys()))
内容的提问来源于stack exchange,提问作者M.javad.soltani
相关产品推荐
相关产品推荐

