Как загрузить данные OPeNDAP со спутника НАСА с помощью python

Я пробовал запросы, pydap, urllib и netcdf4 и продолжаю получать ошибки перенаправления или ошибки разрешения при попытке загрузить следующие данные НАСА:

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)

Я пытаюсь загрузить около 50 тыс. файлов, вот пример одного из них, который работает при вставке в браузер 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=0.02&ATALAYERS=AAAB&DLAYERS=AAAB_1.02&DLAYERS=AAAB_GRIB&VERSION=1.02&DLAYERS=AAAB&DLAYERS

У кого-нибудь есть опыт получения данных OPeNDAP NASA из Интернета с использованием python? Я рад предоставить дополнительную информацию, если это необходимо.

Вот попытка запросов, которая дает ошибку 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)

person timpjohns    schedule 17.10.2016    source источник


Ответы (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>

Надеюсь, это поможет всем, кто работает с данными НАСА с этого сервера.

person timpjohns    schedule 18.10.2016
comment
Ссылка устарела. Та же информация теперь здесь: disc.gsfc.nasa.gov/SSW/ - person FlippingBinary; 07.05.2020

Я понимаю, что уже немного поздно отвечать на этот вопрос для оригинального плаката, но я наткнулся на этот вопрос, пытаясь сделать то же самое, поэтому я оставлю свое решение здесь. Похоже, что сервер НАСА использует перенаправления и базовую авторизацию так, как этого не ожидают стандартные библиотеки. При загрузке с (например) 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)
person FlippingBinary    schedule 07.05.2020