【问题标题】:How to download nasa satellite OPeNDAP data using python如何使用 python 下载 nasa 卫星 OPeNDAP 数据
【发布时间】:2017-02-26 13:50:07
【问题描述】:

我已经尝试过 requests、pydap、urllib 和 netcdf4,但在尝试下载以下 NASA 数据时不断收到重定向错误或权限错误:

GLDAS_NOAH025SUBP_3H:GLDAS 诺亚陆地表面模型 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 浏览器时有效(如果您有正确的用户名和密码):

http://hydro1.gesdisc.eosdis.nasa.gov/daac-bin/OTF/HTTP_services.cgi?FILENAME=%2Fdata%2FGLDAS_V1%2FGLDAS_NOAH025SUBP_3H%2F2016%2F244%2FGLDAS_NOAH025SUBP_3H.A2016244.2100.001.2016256190725.grb&FORMAT=TmV0Q0RGLw&BBOX=-11.95%2C28.86%2C-0.62%2C40.81&LABEL=GLDAS_NOAH025SUBP_3H.A2016244.2100.001.2016286201048.pss.nc&SHORTNAME=GLDAS_NOAH025SUBP_3H&SERVICE=SUBSET_GRIB&VERSION=1.02&LAYERS=AAAB&DATASET_VERSION=001

有人有使用 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 httprequest netcdf opendap


    【解决方案1】:

    我意识到为原始海报回答这个问题有点晚了,但我在尝试做同样的事情时偶然发现了这个问题,所以我将把我的解决方案留在这里。似乎 NASA 服务器以标准库不期望的方式使用重定向和基本授权。当您从(例如)https://hydro1.gesdisc.eosdis.nasa.gov 下载时,您将被重定向到 https://urs.earthdata.nasa.gov 进行身份验证。该服务器将身份验证令牌设置为 cookie,并将您重定向回下载文件。如果您没有正确处理 cookie,您将陷入无限重定向循环。如果您没有正确处理身份验证和重定向,您将收到拒绝访问错误。

    要解决此问题,请将HTTPRedirectHandlerHTTPCookieProcessorHTTPPasswordMgrWithDefaultRealm 链接在一起并将其设置为默认开启程序或直接使用该开启程序。

    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)
    

    【讨论】:

      【解决方案2】:

      我没有找到使用 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 数据的人。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-16
      • 1970-01-01
      • 2022-01-05
      • 2017-02-17
      • 1970-01-01
      相关资源
      最近更新 更多