**
更新
**
原来的网址挂掉了,前面的爬虫代码不能用了,在此贴出新网站的爬虫代码。具体的爬取过程跟之前的类似,不过新网站的下载链接里多了一个文件所占字节大小,需要从响应里提取出来放到链接里。
import urllib.request
import urllib.parse
import datetime
def get_url(year, month, day):
"""
输入日期,返回当天内 GOCI L1B数据下载链接(列表)
"""
# 请求头
url = f'http://kosc.kiost.ac.kr/gociSearch/list.nm?menuCd=11&lang=ko&url=gociSearch&dirString=/COMS/GOCI/L1/{year}/{month}/{day}/L1B'
response = urllib.request.urlopen(url)
html = response.read().decode('utf-8')
urls = []
for num in range(8):
# 提取文件名
try:
index0 = html.index(f'realPath" name="downloadVOList[{num}].realPath" value="') + len('realPath" name="downloadVOList[1].realPath" value="')
index1 = index0 + len('/download/downService.do?fileName=/home/goci/nfsdb/COMS/GOCI/L1/2012/01/02/L1B/COMS_GOCI_L1B_GA_20120102011640.he5.zip')
filename = html[index0:index1]
# 提取文件大小
index0 = html.index(f'class="fSize" name="downloadVOList[{num}].fSize" value="') + len('class="fSize" name="downloadVOList[1].fSize" value="')
index1 = index0 + len('786513032')
filesize = int(html[index0:index1]) - 1
# 组合为链接
url = f'http://kosc.kiost.ac.kr/{filename}&_Html5=true&_StartOffset=0&_EndOffset={filesize}'
urls.append(url)
except Exception:
print(f'缺少{year}_{month}_{day}_{num}')
continue
return urls
def days_to_month(year, days):
dd = datetime.datetime.strptime(str(year) + str(days), "%Y%j")
mon, day = str(dd.timetuple().tm_mon), str(dd.timetuple().tm_mday)
return year, mon, day
# years = [2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020]
years = [2021]
for year in years:
filename = f'{year}.txt'
startday = 1
endday = 366
if year == 2011:
startday = 91
if year in [2012, 2016, 2020]:
endday = 367
with open(filename, 'w') as f:
for day in range(startday, endday):
year, month, day = days_to_month(year, day)
month = '%.02d' % int(month)
day = '%.02d' % int(day)
try:
urls = get_url(year, month, day)
for url in urls:
f.write(url + '\n')
except Exception:
print(f'{year}_{month}_{day}链接无法打开')
=====================================================================================
以下为原文章:
GOCI数据下载地址有两个,一个是NASA的 ocean color 网站:https://oceancolor.gsfc.nasa.gov/;二是韩国的官网:http://kosc.kiost.ac.kr/eng/p10/kosc_p11.html。其中ocean color 需科学上网,因心疼流量,最终选择了韩国的网站。
本篇博文的主要内容包括两个:一是GOCI数据链接的批量抓取(附代码);二是提取链接后的批量下载。
1、GOCI数据链接批量抓取
数据链接抓取不需太深厚的爬虫功底,入门即可。如嫌麻烦,在此附上2011.04-2020.04的L1级全部下载链接(链接:https://pan.baidu.com/s/1pbC9lV4g4KoyycdvhQw07Q 提取码:j3d8 ),但2020.04以后的数据和其他类型就需自己搞了。
仔细观察下载链接,其实是有一定的规律可循,因为网站前缀是一样的,而GOCI文件名的命名有其规则。本想直接按照规律生成这些链接,但发现每个文件名的最后两个数字找不到规律,在38-42之间波动。所以无奈还是得从网站上爬取,以下为爬取步骤及代码。
1)kosc.kiost.ac.kr 网页解析
打开官网,进入数据搜索页面,右键“检查”,在弹出的界面中选择network,然后在数据搜索页面点击search,此时右侧会出现一个list.php,所需要的下载链接则全部在这里了。
2)数据时间范围和类型选择
如下图红色框,数据范围和类型的选择主要依靠这四个keys,可根据自己需要选择时间范围和L1/L2数据。
3)爬取代码
import urllib.request
import urllib.parse
import re
url = 'http://kosc.kiost.ac.kr/eng/p10/list.php'
# 四个关键词,根据需要调整
data = {}
data['src1'] = 'GOCI'
data['src2'] = '1.0/L1B'
data['start_date'] ='2011-04-01'
data['end_date'] = '2020-04-10'
data = urllib.parse.urlencode(data).encode('utf-8')
response = urllib.request.urlopen(url,data)
html = response.read().decode('utf-8')
# 正则表达式,找到response中全部的文件名
# 如需下载L2级数据,文件名前缀需做相应修改
list_GOCI = re.findall(r"='COMS_GOCI_L1B_GA_20[0-2][0-9][0-1][0-9][0-3][0-9]0[0-7]16[0-9][0-9].he5.zip", html)
# 将获取的链接按照年分别存放
def GeneralList(list_GOCI, year_num):
link_list = []
for each in list_GOCI:
i = each[2:]
year = i[17:21]
month = i[21:23]
day = i[23:25]
link = 'http://222.236.46.45/nfsdb/COMS/GOCI/1.0/' + str(year) + '/' + str(month) + '/' + str(
day) + '/' + 'L1B/' + str(i)
if str(year) == str(year_num):
link_list.append(link)
return link_list
# 将各个年份链接写入.txt
for year in range(2011, 2021):
link_list = GeneralList(list_GOCI, year)
name = 'GOCI_Download_list' + str(year) + '.txt'
with open(name, 'w') as f:
for i in link_list:
f.write(i + '\n')
最终生成如下文件:
2、批量下载
获取上述链接后,因官网服务器不需科学上网、注册登录等,下载就很简单了。我是直接将链接批量复制到迅雷,下载速度基本在3-10 M/s,基本能满足需求。也可选择IDM等下载工具。