earthdata.nasa 各种对地观测及再分析资料 python批下载方法(附代码)

美国宇航局的earthdata数据网站下发布了各式各样的数据集,公众可免费下载
(https://search.earthdata.nasa.gov/search)
earthdata.nasa 各种对地观测及再分析资料 python批下载方法(附代码)_第1张图片然而当我们需要大批量下载数据时,手动下载的方式就显得捉襟见肘了
不同的数据集下给出了不同的批获取方式,有的需要Linux系统支持,有的给出了C++的下载脚本等等。
那么当然这些获取方式对我们做遥感的就有点呵呵呵。。。
下面给出了一个简单的python爬虫,只要简单的python库支持就可以打遍全网数据~

一般来说,在这个网站上下载数据,当请求下载成功以后,它们会给出url下载链接列表,大概就是下图这个样子吧,也不一定都是这样。
earthdata.nasa 各种对地观测及再分析资料 python批下载方法(附代码)_第2张图片
下载出来的就是放在txt这样文件中的一条条下载链接
earthdata.nasa 各种对地观测及再分析资料 python批下载方法(附代码)_第3张图片对了注意在这上面下载数据是需要注册账户的
然后就通过python循环,一条条调取下载就行了~

# -*- coding: utf-8 -*-
import requests # get the requsts library from https://github.com/requests/requests
import re # 主要是可能会需要进行文件名字符串的匹配
 
 
# overriding requests.Session.rebuild_auth to mantain headers when redirected
# 一个自定义的类来辅助下载
class SessionWithHeaderRedirection(requests.Session):
 
    AUTH_HOST = 'urs.earthdata.nasa.gov'
 
    def __init__(self, username, password):
 
        super().__init__()
 
        self.auth = (username, password)

   # Overrides from the library to keep headers when redirected to or from
 
   # the NASA auth host.
 
    def rebuild_auth(self, prepared_request, response):
 
        headers = prepared_request.headers
 
        url = prepared_request.url

        if 'Authorization' in headers:
 
            original_parsed = requests.utils.urlparse(response.request.url)
 
            redirect_parsed = requests.utils.urlparse(url)

            if (original_parsed.hostname != redirect_parsed.hostname) and redirect_parsed.hostname != self.AUTH_HOST and original_parsed.hostname != self.AUTH_HOST:
 
                del headers['Authorization']

        return
# create session with the user credentials that will be used to authenticate access to the data
# 在这里填入你在earthdata注册的信息
username = "xxx"
password = "xxx"
# 相当于登录
session = SessionWithHeaderRedirection(username, password)
# 打开你获取的url文件,懂python的大佬应该都明白接来下在干什么了
f=open('xxx.txt','r')
urls=f.readlines()

for i in range(0,len(urls)):
    # the url of the file we wish to retrieve
    url = urls[i]
    url = url.replace('\n','')

    # extract the filename from the url to be used when saving the file
    # 自行对下载到的文件进行命名,注意要写清楚自己下载的文件后缀如.hdf
    filename='xxxx.hdf'
    # submit the request using the session 
    # 下面就是一个从获取到保存到本地的过程
    response = session.get(url, stream=True) 
    # response.status_code返回200则代表访问成功
    print(response.status_code,'\t',filename) 
    with open(filename, 'wb') as fd: 
        for chunk in response.iter_content(chunk_size=1024*1024): 
            fd.write(chunk)
    fd.close()
f.close()  

其实包括一些团队自己搭建的网站,很多公布在网上的数据集手动下载的都比较麻烦
像一些considerate的网站可能还会返给你url列表
如果实在没有的,就只能扒网页源码看url了,然后爬取这些链接或者根据命名规则自己生成
一般没有登录要求的网站,实际上可以直接放在迅雷里面,建一个下载任务然后下载,是不会被限速的
或者写python来request,后面我如果记起来可能会再仔细讲讲

眼看着已经忙了大半年没有更博了,今天在家突然心血来潮,这大概要从一只蝙蝠讲起了

你可能感兴趣的:(数据获取)