简单爬虫 -- 以爬取NASA AOD数据(TIFF文件)为例

 

目录:

  • 网站分析
  • 爬取下载链接
  • 爬取TIFF图片

 

1、网站分析

主页面:https://neo.sci.gsfc.nasa.gov/view.php?datasetId=MYDAL2_M_AER_OD

需求:下载不同年份、不同月份、AAOT和TAOT数据;

点击AAOT和TAOT和年份可知,链接:

AAOT:https://neo.sci.gsfc.nasa.gov/view.php?datasetId=MYDAL2_M_AER_OD&year=2018

TAOT:https://neo.sci.gsfc.nasa.gov/view.php?datasetId=MODAL2_M_AER_OD&year=2018

AAOT和TAOT的区分:改变MYD和MOD;

年份区分:改变“year=”后面的数字;

月份如何区分?

点击下载处,链接为:

https://neo.sci.gsfc.nasa.gov/servlet/RenderData?si=1744422&cs=rgb&format=FLOAT.TIFF&width=360&height=180

https://neo.sci.gsfc.nasa.gov/servlet/RenderData?si=1618332&cs=rgb&format=FLOAT.TIFF&width=360&height=180

可知在下载链接里面“si=”后面的数字是不知道的,查看源代码,检查上图中月份处,发现这个数字就在这里:这个就是月份区分

 

分析完毕,爬取思路:

  • 根据月份检查元素获取图片下载链接中的“si”,构建所有的下载链接;
  • 下载已爬取的下载链接中的TIFF图片

 

2、爬取下载链接

由以上的分析,代码如下,这里爬取的是2008-2011的AAOT和TAOT数据链接:

 1 import requests
 2 from bs4 import BeautifulSoup as bsp
 3 
 4 def url_collect():
 5     // 两个主链接
 6     taot_main_url = 'https://neo.sci.gsfc.nasa.gov/view.php?datasetId=MODAL2_M_AER_OD&year='
 7     aaot_main_url = 'https://neo.sci.gsfc.nasa.gov/view.php?datasetId=MYDAL2_M_AER_OD&year='
 8 
 9     // 需要下载的年份
10     years = ['2011', '2010', '2009', '2008']
11 
12     // 构造确定AOT类别和年份页面链接 
13     aot_url_list = []
14     for year in years:
15         aot_url_list.append(taot_main_url + year)
16         aot_url_list.append(aaot_main_url + year)
17 
18     for aot_url in aot_url_list:
19         // 请求获取网页
20         try:
21             response = requests.get(aot_url)
22             response.raise_for_status()
23             print('aot_url connect succeed !')
24         except:
25             print('aot_url connect failed !')
26         
27         // 分析网页,获取代表月份的“si=”后面的数字
28         response_text = response.text
29         soup = bsp(response_text, 'html.parser')
30         divs = soup.find_all('div',{"class":"slider-elem month"})
31 
32         // 创建保存链接和命名形式的文件
33         url_txt = open('D:/home/research/lung_cancer/code/aot_url_all.txt', 'a')
34         url_name_txt = open('D:/home/research/lung_cancer/code/url_name.txt', 'a')
35 
36         // 构造下载链接和命名形式,并保存到文件中
37         for div in divs:
38             print(div)
39             aot_url_txt = 'https://neo.sci.gsfc.nasa.gov/servlet/RenderData?si=' + div.a['onclick'][13:20] + '&cs=rgb&format=FLOAT.TIFF&width=360&height=180'
40             name = aot_url.split('?')[1][10:] + div.a['onclick'][27:-3] + '.TIFF'
41             url_txt.write(aot_url_txt + '\n')
42             url_name_txt.write(name + '\n')

以下是爬取的结果:

 

Q:为什么要把命名形式也写入文件?

A:因为下载文件时,发现命名形式并不固定,有时候包含了年、月和AOT类别,有时候就是个简单的RenderData.TIFF,这样文件下载下来了也不知道是什么数据,所以命名很重要。

 

3、爬取TIFF图片

根据上一步爬取下来的链接,就可开始爬取图片了:

 1 # code : utf-8
 2 
 3 """
 4 下载指定链接(在文本文件中)下的tiff图像
 5 """
 6 
 7 import requests
 8 
 9 def download():
10     local_path = 'D:/home/research/lung_cancer/code/'
11     
12     // 读取文本文件中已经下载好的链接
13     url_list = []
14     with open(local_path + 'aot_url_all.txt', 'r') as f:
15         for url in f.readlines():
16             url_list.append(url.strip())
17 
18     // 读取命名形式
19     name_list = []
20     with open(local_path + 'url_name.txt', 'r') as f:
21         for name in f.readlines():
22             name_list.append(name.strip())
23     
24     // 获取以上链接中的TIFF文件
25     for i in range(len(url_list)):
26         url = url_list[i]
27         name = name_list[i]
28 
29         try:
30             response = requests.get(url)
31             response.raise_for_status()
32             print('main_url connect succeed !')
33         except:
34             print('main_url connect failed !')
35 
36         // 将文件写入本地硬盘
37         with open('D:/home/research/lung_cancer/data/AOD_process/' + name, 'wb') as f:
38             f.write(response.content)
39             print(name + "write succeed!")

爬取结果:

 

转载于:https://www.cnblogs.com/echo-coding/p/8663555.html

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基本的cesium代码,用于导入tiff高程图片: ```javascript <!DOCTYPE html> <html lang="en"> <head> <title>Cesium - Inserting Tiff Elevation Data</title> <style> @import url(../Templates/Widgets/widgets.css); html, body, #cesiumContainer { width: 100%; height: 100%; margin: 0; padding: 0; overflow: hidden; } #loadingOverlay { background: rgba(57, 76, 103, 0.5); color: #fff; position: absolute; top: 50%; left: 50%; margin: -25px 0 0 -50px; width: 100px; height: 50px; text-align: center; line-height: 50px; z-index: 10000; } #loadingIndicator { height: 50px; width: 50px; margin: 0 auto; background-image: url(../Templates/Widgets/Images/loading-indicator.gif); background-repeat: no-repeat; background-position: center; } </style> <script src="../ThirdParty/requirejs-2.1.20/require.js"></script> <script> require.config({ baseUrl: '../Source', paths: { 'Cesium': '../Build/Cesium/Cesium', 'cesiumjs': '../Build/Cesium' } }); require([ 'cesiumjs/Cesium', 'cesiumjs/Widgets/Viewer/Viewer', 'cesiumjs/Core/Cartographic', 'cesiumjs/Core/CesiumTerrainProvider', 'cesiumjs/Core/Cesium3DTileset', 'cesiumjs/Scene/SceneMode', 'cesiumjs/Scene/ImageryLayer', 'cesiumjs/Scene/Globe', 'cesiumjs/Scene/TerrainProvider' ], function (Cesium, Viewer, Cartographic, CesiumTerrainProvider, Cesium3DTileset, SceneMode, ImageryLayer, Globe, TerrainProvider) { var viewer = new Viewer('cesiumContainer'); viewer.scene.globe.terrainProvider = new CesiumTerrainProvider({ url : 'https://assets.agi.com/stk-terrain/v1/tilesets/world/tiles', requestVertexNormals: true }); var tiffProvider = new CesiumTerrainProvider({ url : 'http://localhost:8000/path/to/tiff/tiles', requestVertexNormals: true }); viewer.scene.terrainProvider = tiffProvider; var imageryLayer = new ImageryLayer(new Cesium.UrlTemplateImageryProvider({ url: 'https://webglobe24.de/krater/{z}/{x}/{y}.jpg', credit: 'Krater' })); viewer.scene.imageryLayers.add(imageryLayer); var globeDepth = new Globe(); var terrainProvider = new TerrainProvider(); viewer.scene.terrainProvider = tiffProvider; var position = Cesium.Cartographic.fromDegrees(-94.4375667,39.0660454,0); var height = tiffProvider.getHeight(position); var cartographic = Cesium.Ellipsoid.WGS84.cartesianToCartographic(position); cartographic.height = height; var surface = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, cartographic.height); viewer.camera.position = surface; viewer.camera.lookAt(Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, cartographic.height + 1000), new Cesium.Cartesian3(0.0, 0.0, 1.0)); viewer.camera.lookAtTransform(Cesium.Matrix4.IDENTITY); viewer.scene.globe.depthTestAgainstTerrain = true; var tileset = new Cesium3DTileset({ url: "./Tilesets/Batched/BatchedColors/tileset.json", maximumMemoryUsage: 2048 }); tileset.readyPromise.then(function() { viewer.scene.primitives.add(tileset); viewer.camera.zoomTo(tileset); }); }); </script> </head> <body> <div id="cesiumContainer"></div> <div id="loadingOverlay"><div id="loadingIndicator"><div class="rotating"></div></div></div> </body> </html> ``` 需要注意的是,上面代码中的tiffProvider.url需要根据实际的tiff文件路径进行修改。由于使用Cesium导入tiff高程图片需要将其切片成小块,因此需要使用专门的软件工具进行操作。可以借助GDAL等工具或在线转换服务来实现。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值