[遥感]利用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 的登陆网站
  [遥感]利用python爬虫获取美国冰雪数据中心的数据_第1张图片
  
  登陆过后就会跳转到下载数据的网页,每天的数据按照日期排列,需要下载所有日子的话,就得一天一天点进去下载,贼麻烦!!!
  [遥感]利用python爬虫获取美国冰雪数据中心的数据_第2张图片
  [遥感]利用python爬虫获取美国冰雪数据中心的数据_第3张图片
  
  这样,我们就知道了下载这个数据的一个流程,然后我们需要的,就是如何利用程序实现这个过程。而这个过程中最难得,应该就是模拟登陆的过程。这里应该有两个解决办法:(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") 即可

[遥感]利用python爬虫获取美国冰雪数据中心的数据_第4张图片

(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

你可能感兴趣的:(Python爬虫,遥感)