GOCI数据批量下载

**

更新

**

原来的网址挂掉了,前面的爬虫代码不能用了,在此贴出新网站的爬虫代码。具体的爬取过程跟之前的类似,不过新网站的下载链接里多了一个文件所占字节大小,需要从响应里提取出来放到链接里。

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等下载工具。
在这里插入图片描述

  • 10
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 15
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值