如何使用 python 下载美国宇航局卫星 OPeNDAP 数据
How to download nasa satellite OPeNDAP data using python
我已经尝试过请求、pydap、urllib 和 netcdf4,但在尝试下载以下 NASA 数据时总是出现重定向错误或权限错误:
GLDAS_NOAH025SUBP_3H:GLDAS Noah 陆地表面模型 L4 3 每小时 0.25 x 0.25 度子集 V001 (http://disc.sci.gsfc.nasa.gov/uui/datasets/GLDAS_NOAH025SUBP_3H_V001/summary?keywords=Hydrology)
我正在尝试下载大约 50k 个文件,这里是一个示例,粘贴到 google chrome 浏览器(如果您有正确的用户名和密码)时可以使用:
有人有过使用 python 从网络上获取 OPeNDAP NASA 数据的经验吗?如果需要,我很乐意提供更多信息。
这是给出 401 错误的请求尝试:
import requests
def httpdownload():
'''loop through each line in the text file and open url'''
httpfile = open(pathlist[0]+"NASAdownloadSample.txt", "r")
for line in httpfile:
print line
outname = line[-134:-122]+".hdf"
print outname
username = ""
password = "*"
r = requests.get(line, auth=("username", "password"), stream=True)
print r.text
print r.status_code
with open(pathlist[0]+outname, 'wb') as out:
out.write(r.content)
print outname, "finished" # keep track of progress
这是给出重定向错误的 pydap 示例:
import install_cas_client
from pydap.client import open_url
def httpdownload():
'''loop through each line in the text file and open url'''
username = ""
password = ""
httpfile = open(pathlist[0]+"NASAdownloadSample.txt", "r")
fileone = httpfile.readline()
filetot = fileone[:7]+username+":"+password+"@"+fileone[7:]
print filetot
dataset = open_url(filetot)
我没有找到使用 python 的解决方案,但根据我现在掌握的信息,应该是可行的。我将 wget 与 .netrc 文件和 cookie 文件一起使用,如下所示 (https://disc.gsfc.nasa.gov/information/howto?title=How%20to%20Download%20Data%20Files%20from%20HTTP%20Service%20with%20wget):
#!/bin/bash
cd # path to output files
touch .netrc
echo "machine urs.earthdata.nasa.gov login <username> password <password>" >> .netrc
chmod 0600 .netrc
touch .urs_cookies
wget --content-disposition --trust-server-names --load-cookies ~/.urs_cookies --save-cookies ~/.urs_cookies --auth-no-challenge=on --keep-session-cookies
-i <path to text file of url list>
希望它能帮助其他人使用来自该服务器的 NASA 数据。
我意识到为原始发布者回答这个问题有点晚了,但我在尝试做同样的事情时偶然发现了这个问题,所以我会把我的解决方案留在这里。 NASA 服务器似乎以标准库不期望的方式使用重定向和基本授权。当您从(例如)https://hydro1.gesdisc.eosdis.nasa.gov
下载时,您将被重定向到 https://urs.earthdata.nasa.gov
以进行身份验证。该服务器将身份验证令牌设置为 cookie,并将您重定向回下载文件。如果您没有正确处理 cookie,您将陷入无限的重定向循环。如果您没有正确处理身份验证和重定向,您将收到拒绝访问错误。
要解决此问题,请将 HTTPRedirectHandler
、HTTPCookieProcessor
和 HTTPPasswordMgrWithDefaultRealm
链接在一起并将其设置为默认开启器或直接使用该开启器。
from urllib import request
username = "<your username>"
password = "<your password>"
url = "<remote url of file>"
filename = "<local destination of file>"
redirectHandler = request.HTTPRedirectHandler()
cookieProcessor = request.HTTPCookieProcessor()
passwordManager = request.HTTPPasswordMgrWithDefaultRealm()
passwordManager.add_password(None, "https://urs.earthdata.nasa.gov", username, password)
authHandler = request.HTTPBasicAuthHandler(passwordManager)
opener = request.build_opener(redirectHandler,cookieProcessor,authHandler)
request.install_opener(opener)
request.urlretrieve(url,filename)
我已经尝试过请求、pydap、urllib 和 netcdf4,但在尝试下载以下 NASA 数据时总是出现重定向错误或权限错误:
GLDAS_NOAH025SUBP_3H:GLDAS Noah 陆地表面模型 L4 3 每小时 0.25 x 0.25 度子集 V001 (http://disc.sci.gsfc.nasa.gov/uui/datasets/GLDAS_NOAH025SUBP_3H_V001/summary?keywords=Hydrology)
我正在尝试下载大约 50k 个文件,这里是一个示例,粘贴到 google chrome 浏览器(如果您有正确的用户名和密码)时可以使用:
有人有过使用 python 从网络上获取 OPeNDAP NASA 数据的经验吗?如果需要,我很乐意提供更多信息。
这是给出 401 错误的请求尝试:
import requests
def httpdownload():
'''loop through each line in the text file and open url'''
httpfile = open(pathlist[0]+"NASAdownloadSample.txt", "r")
for line in httpfile:
print line
outname = line[-134:-122]+".hdf"
print outname
username = ""
password = "*"
r = requests.get(line, auth=("username", "password"), stream=True)
print r.text
print r.status_code
with open(pathlist[0]+outname, 'wb') as out:
out.write(r.content)
print outname, "finished" # keep track of progress
这是给出重定向错误的 pydap 示例:
import install_cas_client
from pydap.client import open_url
def httpdownload():
'''loop through each line in the text file and open url'''
username = ""
password = ""
httpfile = open(pathlist[0]+"NASAdownloadSample.txt", "r")
fileone = httpfile.readline()
filetot = fileone[:7]+username+":"+password+"@"+fileone[7:]
print filetot
dataset = open_url(filetot)
我没有找到使用 python 的解决方案,但根据我现在掌握的信息,应该是可行的。我将 wget 与 .netrc 文件和 cookie 文件一起使用,如下所示 (https://disc.gsfc.nasa.gov/information/howto?title=How%20to%20Download%20Data%20Files%20from%20HTTP%20Service%20with%20wget):
#!/bin/bash
cd # path to output files
touch .netrc
echo "machine urs.earthdata.nasa.gov login <username> password <password>" >> .netrc
chmod 0600 .netrc
touch .urs_cookies
wget --content-disposition --trust-server-names --load-cookies ~/.urs_cookies --save-cookies ~/.urs_cookies --auth-no-challenge=on --keep-session-cookies
-i <path to text file of url list>
希望它能帮助其他人使用来自该服务器的 NASA 数据。
我意识到为原始发布者回答这个问题有点晚了,但我在尝试做同样的事情时偶然发现了这个问题,所以我会把我的解决方案留在这里。 NASA 服务器似乎以标准库不期望的方式使用重定向和基本授权。当您从(例如)https://hydro1.gesdisc.eosdis.nasa.gov
下载时,您将被重定向到 https://urs.earthdata.nasa.gov
以进行身份验证。该服务器将身份验证令牌设置为 cookie,并将您重定向回下载文件。如果您没有正确处理 cookie,您将陷入无限的重定向循环。如果您没有正确处理身份验证和重定向,您将收到拒绝访问错误。
要解决此问题,请将 HTTPRedirectHandler
、HTTPCookieProcessor
和 HTTPPasswordMgrWithDefaultRealm
链接在一起并将其设置为默认开启器或直接使用该开启器。
from urllib import request
username = "<your username>"
password = "<your password>"
url = "<remote url of file>"
filename = "<local destination of file>"
redirectHandler = request.HTTPRedirectHandler()
cookieProcessor = request.HTTPCookieProcessor()
passwordManager = request.HTTPPasswordMgrWithDefaultRealm()
passwordManager.add_password(None, "https://urs.earthdata.nasa.gov", username, password)
authHandler = request.HTTPBasicAuthHandler(passwordManager)
opener = request.build_opener(redirectHandler,cookieProcessor,authHandler)
request.install_opener(opener)
request.urlretrieve(url,filename)