欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

[遥感]利用python爬虫获取美国冰雪数据中心的数据

程序员文章站 2022-07-14 23:19:41
...

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

[遥感]利用python爬虫获取美国冰雪数据中心的数据

(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