我在另一篇博客里制作了一个拥有图形用户界面的程序,供大家参考:GOCI数据下载–基于Tkinter制作图形用户界面程序进行下载
IDM是一款优秀的下载器,其优点这里不在赘述。请大家登录其官方网站购买、下载、安装正版软件(http://www.internetdownloadmanager.com)。
IDM提供了使用命令行调用的接口,官方说明文档见:https://www.internetdownloadmanager.com/support/command_line.html
这里做一个简单翻译:
使用:
idman /s
或
idman /d URL [/p local_path] [/f local_file_name] [/q] [/h][/n] [/a]
可以进行下载
参数解释:
/d URL #根据URL下载文件
/s #开始下载队列中的任务
/p #定义文件要存储在本地的地址
/f #定义文件存储在本地的文件名
/q #下载成功后IDM将退出。
/h #下载成功后IDM将挂起你的链接
/n #当IDM不出问题时启动静默模式
/a #添加指定文件到/d的下载队列,但是不进行下载
可以打开CMD窗口,根据需求进行文件下载。在Python中可以调用命令行进行下载,在第三部分予以说明。
GOCI是搭载在韩国静止卫星COMS上的水色传感器。其介绍可以在其官网http://kosc.kiost.ac.kr/eng/上查看。相信大家来看这篇博客之前就已经对GOCI数据有详细的了解,这里不在介绍。
在该网站可以下载GOCI数据,包括L1级数据和L2级数据(还有其他卫星数据,大家可以自行探索),但是该网站有时候可能无法成功访问。可以通过该网站下载数据:http://222.236.46.45。
该网站也可以下载GOCI的L1级和L2级数据及其他卫星数据,这里只介绍下载GOCI-L1级数据的方法。大家根据需要自行探索。
依次点击:nfsdb->COMS->GOCI。可以看到如下界面:
这里的1.0、2.0就是代表L1级产品和L2级产品。我们下载L1级数据,点击1.0后可以看到如下界面:
没错,这里的数字就是表示的年份,根据自己需要下载的日期,依次点击即可。这里以下载2020年1月1日的数据为例,点击进入该日的数据目录:
这里列出了该日的所有L1级数据。根据需要可以点击下载。
第二部分介绍了单个GOCI数据的下载方法。下面我们来介绍GOCI的下载链接的规律,以达到批量下载的目的。在数据目录中右键单击任一数据,复制链接。
http://222.236.46.45/nfsdb/COMS/GOCI/1.0/2020/01/01/L1B/COMS_GOCI_L1B_GA_20200101001642.he5.zip
通过观察,我们可以看到,该链接包括了所需文件的日期和文件名。可以总结出链接的格式如下:
http://222.236.46.45/nfsdb/COMS/GOCI/1.0/yyyy/mm/dd/L1B/filename
yyyy表示年份,mm代表月份,dd表示天。filename表示文件名。也就是说,我们只要知道所要下载数据的年份、月份、天,文件名就可以下载我们要的数据。年月日都可以准确的指定。但是文件名却不容易构造。
有经验的小伙伴知道遥感数据的文件名一般也是有规律的。何况GOCI是一颗静止卫星,其卫星位置是固定的,应该更容易构造。
但经过观察,GOCI的成像时间在每个小时存在差异。因此不能简单的构造。但是,我们能够在浏览器中查看到某一天的所有文件名。这时想到使用Python对网页经行爬取,获取文件名。然后构造出下载链接。
根据前三部分的介绍。可以总结出使用Python调用IDM批量下载GOCI数据的步骤:
a.根据需要数据的日期,爬取网页获得文件名;
b.根据日期和文件名构造下载链接;
c.根据下载链接,在Python自动调用IDM下载数据。
我们先看某一日期网页的HTML代码:
我们只要获取标签a的href值,并加上‘http://222.236.46.45’即可构造出下载链接。值得注意的是,第一个标签a是返回上一级目录,应该剔除。
我这里以下载一天的数据为例,要下载多天的数据,自己可以写一个循环。
import os
from subprocess import call #用于调用CMD命令行
import time
from datetime import datetime
from bs4 import BeautifulSoup
import urllib
import os
from urllib.error import URLError,HTTPError,ContentTooShortError
IDM = r"D:\Program Files\IDM\IDMan.exe" #IDM程序在电脑上的位置,大家根据IDM在自己电脑上的位置更改
def CallIDM(urlList,y,m,d):
DownPath='E:/GOCI/L1/'+str(y)+'/'+str(m).zfill(2)+'/'+str(d).zfill(2)+'/' #用于存储下载数据的位置,根据日期构建文件夹
os.makedirs(DownPath)
#将下载链接全部加入到下载列表,之后再进行下载。
for ul in urlList:
call([IDM, '/d',ul, '/p',DownPath,'/n','/a'])
call([IDM,'/s'])
def ComUrl(y,m,d):
#构建URL列表
urllist=[]
#根据日期,定位到某一日的数据存储位置,注意日期和月份应该用两位数字表示
DayUrl='http://222.236.46.45/nfsdb/COMS/GOCI/1.0/'+str(y)+'/'+str(m).zfill(2)+'/'+str(d).zfill(2)+'/L1B/'
#开始爬取
try:
DayHTML= urllib.request.urlopen(DayUrl).read()
soup=BeautifulSoup(DayHTML,'html.parser')
alink=soup.find_all('a') #获取界面下所有标签为a的元素
for A in alink:
fileUrl=A.get('href') #数据的下载链接
filename=fileUrl.split('/')[-1]
#该判断用于剔除返回上一级目录的链接
if filename=='':
continue
else:
urllist.append('http://222.236.46.45'+fileUrl) #将有效的链接加入到列表中
except(URLError,HTTPError,ContentTooShortError):
print(DayUrl)
return urllist
Year=2020
Month=1
Day=1
UrlList=ComUrl(Year,Month,Day) #构建URL列表
CallIDM(UrlList,Year,Month,Day) #调用IDM下载
要想下载L2级数据或这个网址下的其他数据,进行简单的修改即可实现。
也可以加个定时器定时下载当天数据。