yczhu171018的个人博客分享 http://blog.sciencenet.cn/u/yczhu171018

博文

python环境下实现modis等卫星数据的自动下载

已有 672 次阅读 2019-7-28 12:39 |个人分类:程序代码|系统分类:科研笔记

简介

这个文章主要以modis产品为例,讲述如何利用requests代码库实现卫星数据的自动化下载。

MODIS数据:

Modis卫星数据产品主要存在的LP DAAC数据中心(lpdaac.usgs.gov/tools/d),这个数据中心的数据登录后都可以从网页上直接免费下载。

Python requests库:

requests 是用Python语言编写,基于 urllib,采用 Apache2 Licensed 开源协议的 HTTP 库。它比 urllib 更加方便,可以节约我们大量的工作,完全满足 HTTP 测试需求。

如何实现Modis等卫星数据的自动下载:

LP DAAC数据中心的MODIS数据需要登录授权后才能自动下载;因此,首先需要建立一个登录的授权文件,这个你可以使用netrc库帮助你建立,也可以自己建立,你可以在你的文件目录下建立一个.netrc的文件,里面存在你的授权网址、账户名和密码,如下:

这样做的好处是利用账户信息的管理,如果你想省事也可以将你的requests的auth直接添加你的账户名和密码:

request.get(...,auth=('username','password'),...)

之后就可以利用requests库获取待下载数据的信息,建立下载文件和下载数据。

# -*- coding: utf-8 -*-
"""
Created on Mon Jul 22 10:52:54 2019
@author: YchZhu
"""
# 导入数据库
import os
import time
import requests
from netrc import netrc
# 待下载数据的下载链接
f = ' 
# 数据的存在位置saveDir = 'C:\\Users\\YchZhu\\Downloads'# 数据的保存名称:和数据下载名称一致
saveName = os.path.join(saveDir, f.split('/')[-1].strip())# 授权信息的存放路径netrcDir = os.path.expanduser("~\.netrc")
# 带授权的网址
urs = 'Earthdata Login'  # Earthdata URL to call for authentication
# Create and submit request and download file
with requests.get(f.strip(), stream=True, auth=(netrc(netrcDir).authenticators(urs)[0], netrc(netrcDir).authenticators(urs)[2])) as response:
    if response.status_code != 200:
        print("{} not downloaded. Verify that your username and password are correct in {}")
    else:
        start = time.time() #开始时间
        size = 0 # data of download
        content_size = int(response.headers['Content-Length']) #总大小
        print('file size:'+str(content_size)+' bytes')
        print('[文件大小]:%0.2f MB' % (content_size/1024/1024))
        
        response.raw.decode_content = True
        content = response.raw
        with open(saveName, 'wb') as d:
            while True:
                chunk = content.read(16 * 1024)
                if not chunk:
                    break
                d.write(chunk)
                size +=len(chunk) #已下载数据大小
                # 显示下载进度条
                print('\r'+'[下载进度]:%s%.2f%%' %('>'*int(size*50/content_size),float(size/content_size*100)),end='')
                
        print('Downloaded file: {}'.format(saveName))
        end = time.time() #结束时间
        print('\n'+"全部下载完成!用时%0.2f秒"%(end-start))




http://blog.sciencenet.cn/blog-3367669-1191430.html

上一篇:Matlab中将图片保存为avi动画

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备14006957 )

GMT+8, 2019-11-19 05:03

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部