[遥感]利用python爬虫获取美国冰雪数据中心的数据
00. 写在前面:
由于最近学习方面需要用到NSIDC(美国冰雪数据中心)的数据进行计算,但是手工下载又特别耗费时间,需要一个一个去点击,所以我尝试着去写一个小爬虫获取所需数据。
对所有需要在NSIDC下数据的科研工作者可能会有点左右,233333
欢迎大家指出问题,共同学习。我只是一个萌新。。。
所用到的工具:pycharm +python2.7.13 + BeautifulSoup
OK,正式开始今天的工作!
01. 工作开始前的分析工作:
确定我们需要下载的数据网站。http://nsidc.org/data/GLAH12(GLAS/ICESat L2 Antarctic and Greenland Ice Sheet Altimetry Data (HDF5), Version 34)
哈哈哈哈哈哈哈哈哈哈哈, 不要猜测我要用这些数据做什么拉。
点击右边的下载,然后会发现跳转到了另一个网站,也就是合作伙伴EARTHDATA 的登陆网站
登陆过后就会跳转到下载数据的网页,每天的数据按照日期排列,需要下载所有日子的话,就得一天一天点进去下载,贼麻烦!!!
这样,我们就知道了下载这个数据的一个流程,然后我们需要的,就是如何利用程序实现这个过程。而这个过程中最难得,应该就是模拟登陆的过程。这里应该有两个解决办法:(1)利用cookie模块来实现;(2)利用requests.session来实现 (我也不知道这么说对不对,但是的确是用了不同的模块。233333)
这里我们采用第二种方法(我的GitHub里面下载另一种数据采用的是第一种方法,大家可以看看),那么我们观察网页url的特征。发现只是在后面日期作为标签改变url。
(为了后面方便,我这里直接在网站源码里面保存这部分日期到本地了,哈哈哈哈,投机取巧了,其实完全可以在请求网站后,从源码里面获取,我主要还是懒。)
https://n5eil01u.ecs.nsidc.org/GLAS/GLAH12.034/2003.02.20/
https://n5eil01u.ecs.nsidc.org/GLAS/GLAH12.034/2003.02.21/
https://n5eil01u.ecs.nsidc.org/GLAS/GLAH12.034/2003.02.22/
02. 正式的编程工作:
(1)获取网站url.
with open(datetime, 'r') as fa:
for line in fa:
datanum = line[:-1]
url = 'https://n5eil01u.ecs.nsidc.org/GLAS/GLAH12.034/{}/'.format(datanum)
(2)设置请求的默认参数
USER_AGENTS = [
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; AcooBrowser; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)",
"Mozilla/4.0 (compatible; MSIE 7.0; AOL 9.5; AOLBuild 4337.35; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
"Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)"]
headers = {'User-agent': random.choice(USER_AGENTS),
'Connection': 'keep - alive',
'Accept-Encoding': 'gzip, deflate',
'Host': 'n5eil01u.ecs.nsidc.org'}
with requests.Session() as session:
session.auth = (username, password)
r1 = session.request('get', url)
(3)模拟访问
由于这里是一个get请求,所以直接用session.get
即可。然后利用Beautifulsoup
解析。
r1 = session.request('get', url)
r = session.get(r1.url, auth=(username, password))
soup = BeautifulSoup(r.content, 'lxml')
利用开发者工具(F12)可以看到,我们需要的文件夹,全部位于 tr
标签里面, 而我们需要的.H5
文件在对应td
标签下。这样就可以很容易获得我们所需的内容了。即对应的soup.find_all("tr")
和soup.find_all("td")
即可
(4)下载文件
其实在python里面下载一个文件并不算复杂。我们在前面已经已经获得了对应文件的下载路径,直接写入文件即可。
with open(filename, 'wb') as f:
for chunk in r.iter_content(100):
f.write(chunk)
这样我们就成功下载了一个所需文件。接下来只要构成批量循环就可以。剩下的就靠大家自己咯。
03. 写在后面:
作为一个学遥感的萌新,各种下数据真是让我伤透了心,整个时间有一半在找数据和下数据。幸好有了程序思想,哈哈哈哈,可以偷懒去看番了。
源码位置,除了ICESat还有用另一种方法下载的MODIS产品(偷偷让大家进去下我的GitHub,哈哈哈哈):
https://github.com/moonlighf/Leetcode/tree/master/02.NSIDC_BatchDownload