python批量下载modis数据(可筛选日期、范围、数据类型)

news2024/11/17 17:26:21

找了一圈下modis数据的,有的不能空间筛选有的不能下初级产品(也可能没找到),不甚满意,自己搞了个

0 前言

  • 用到的主要依赖是selenium,下载网站是https://ladsweb.modaps.eosdis.nasa.gov,环境是anaconda,python 3.9.12
  • 因为涉及html解析,若该网站结构变了,可能就得修改
  • 网站的#Online Archive里可以实现产品和日期筛选,但是不知道怎么进行空间筛选 ,如果可以的话能省很多事

1 安装selenium

需要的主要依赖是selenium,这个库用来模拟浏览器操作。该库的介绍见
https://blog.csdn.net/benzhujie1245com/article/details/117089767
除了库本身,使用它还需要

  1. 电脑安装了浏览器
  2. 安装对应的WebDriver

浏览器我用的chrome,以此为例。WebDriver的下载地址是
http://chromedriver.storage.googleapis.com/index.html
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

将下载的压缩包解压,exe文件找个地方放好就行了

2 注册账号获取token

地址是
https://urs.earthdata.nasa.gov/users/new
注册之后在搜索页右上角可以看token
在这里插入图片描述
在这里插入图片描述

3 下载脚本

import os
import shutil
import sys
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import time

USERAGENT = 'tis/download.py_1.0--' + sys.version.replace('\n', '').replace('\r', '')


def geturl(url, out):
    """
    根据url下载文件
    :param url: 地址
    :param out: 存储路径
    :return:
    """
    headers = {'user-agent': USERAGENT, 'Authorization': 'Bearer ' + token}

    import ssl
    CTX = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)

    from urllib.request import urlopen, Request
    fh = urlopen(Request(url, headers=headers), context=CTX)
    shutil.copyfileobj(fh, out)


def init(url, chrome_driver):
    """
    初始化页面解析
    :param url: 网页地址
    :param chrome_driver: 浏览器驱动地址
    """
    chrome_options = webdriver.ChromeOptions()
    chrome_options.add_argument('--headless')
    chrome_options.add_argument('--disable-gpu')

    browser = webdriver.Chrome(executable_path=chrome_driver, chrome_options=chrome_options)
    # 设置隐式等待时间,等待页面完整加载,最长等待 60s
    browser.implicitly_wait(60)
    browser.get(url)

    try:
        # 等待下载标签加载,最长60s
        elements = WebDriverWait(browser, 60).until(
            EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "#tab4FilesTable a")))
        wait_a_list(0, len(elements), browser)
    finally:
        browser.quit()


def wait_a_list(times, len_a_list, browser):
    """
    递归等待下载标签全部加载
    :param times: 循环累计次数
    :param len_a_list: 下载标签长度
    :param browser: browser
    """

    # 强制等待 2s 后再执行下一步
    time.sleep(2)
    elements = browser.find_elements(By.CSS_SELECTOR, "#tab4FilesTable a")

    if len(elements) == len_a_list:
        times += 1
        if times == 5:
            print('等待5次,长度不变,输出最终')
            for my_elem in elements:
                url = my_elem.get_attribute("href")

                file_name = url.split('/')[-1]
                path = os.path.join(save_dir, file_name)

                if not os.path.exists(path):
                    print('downloading: ', path)
                    with open(path, 'w+b') as fh:
                        geturl(url, fh)
                else:
                    print('skipping: ', path)

        else:

            print('长度不变,循环次数:' + str(times))
            wait_a_list(times, len_a_list, browser)
    else:
        print('长度重置,现在长度:' + str(len(elements)))
        wait_a_list(0, len(elements), browser)


if __name__ == '__main__':
    # token https://ladsweb.modaps.eosdis.nasa.gov/ 注册后获取
    # 如果不设置token,下下来的会是一个让你登录的html页面。。
    token = '你的token'
    # 存储路径
    save_dir = './dataDirectModis'
    # 下载地址
    _url = 'https://ladsweb.modaps.eosdis.nasa.gov/search/order/4/MOD021KM--61/2023-01-17..2023-01-18/DB/Country:CHN'
    # selenium的chromedriver驱动地址
    _chrome_driver = 'D:/Program Files/chromedriver.exe'

    init(_url, _chrome_driver)

4 脚本解释

4.1 下载地址

下载地址是按照LAADS网站一步步查询拼出来的
在这里插入图片描述
筛选主要分四步,这里简单介绍。如果你一步步筛选到第四步,你会发现之前的筛选项都体现在了url里。

  1. 产品
    就上图那些,左边是分类,右边是具体的产品,可多选

  2. 时间
    在这里插入图片描述
    都很明了,不多说了

  3. 空间
    在这里插入图片描述

  4. 文件
    根据上述选择列出的所有文件。手动下载的话,这里就可以选择然后进入第五步了。
    在这里插入图片描述

再看一下代码里这一段

# 下载地址
    _url = 'https://ladsweb.modaps.eosdis.nasa.gov/search/order/4/MOD021KM--61/2023-01-17..2023-01-18/DB/Country:CHN'

明显看出刚才的选项都体现在了url里。拿页面上的url来看
在这里插入图片描述
大家可以在第三步换不同的空间筛选种类试试。矩形的话就是两个坐标,国家的话就是国家代码。

4.2 页面解析

进行到第四步,出现的表格就已经可以直接下载了
在这里插入图片描述
写个脚本,读出表格,点击下载,岂不轻轻松松
然而问题是,页面加载本身就不快,然后表格是页面元素渲染完成后才出现的,而且数据也不是全部加载好再渲染而是一条一条出现,一个处理不好就会下不全。

  1. 先等待页面加载
    selenium的几种等待见官网文档介绍
    https://selenium-python.readthedocs.io/waits.html

        # 设置隐式等待时间,等待页面完整加载,最长等待 60s
        browser.implicitly_wait(60)
    
  2. 然后等待表格第一行下载标签出现

            # 等待下载标签加载,最长60s
            elements = WebDriverWait(browser, 60).until(
                EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "#tab4FilesTable a")))
    
  3. 递归判断所有行加载完
    主要就是代码里的wait_a_list函数,作用是等待2秒后再获取一遍列表下载标签,若和上一次不同,则清空循环次数再来一次,若相同,带着循环次数递归,直到连续五次没有新增行,执行下载
    在这里插入图片描述

4.3 根据url下载文件

在这里插入图片描述
这部分,遍历所有获取到的< a >标签,读取href属性(即文件下载地址),分割出文件名,和存储路径一起构建文件地址,若文件存在就跳过,文件不存在就通过geturl函数写入数据。

geturl函数是根据官网脚本大力删改之后的(完整版见该文章),因为我不需要各种判断和异常抛出,我的环境自己有数。token,USERAGENT都是在这一步放入请求头里的,urlopen的context参数也是,上述几个地方简易保持原样不要改,搞不好就会下下来一个20k的垃圾文件=_=

最后

如果运行过程中遇到什么奇怪错误,可以先自行百度。我记得好像碰到过啥小问题,搜了一下降低了某个库的版本就好了。这种依赖相关的问题每个人环境不一样,碰到的也不同,问我也没用。

参考
https://blog.csdn.net/NingAnMe/article/details/103461808
https://ladsweb.modaps.eosdis.nasa.gov/search/
https://selenium-python.readthedocs.io/api.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/173164.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ensp实现不同VLAN之间的通信

1.VLAN的基本配置 一个简单的VLAN实验&#xff0c;基本配置如图。 其中交换机为S5700。 在只对四台PC配置IP地址&#xff0c;交换机不用配置后&#xff0c;四台PC可以互相ping通。 下面是对交换机配置VLAN的方法 <Huawei>sys #进入系统视图 [Huawei…

钉钉搭和金蝶云星空接口打通对接实战

数据源系统:阿里宜搭宜搭是阿里巴巴自研的基于钉钉和阿里云的低代码平台&#xff0c;可让用户通过简单的拖拽、配置即可完成应用搭建&#xff0c;为每个组织提供低门槛、高效率的数字化业务应用生产新模式。有效缩减企业应用开发时间&#xff0c;助力企业数字化升级。对接目标系…

第四层:友元与函数成员别样定义

文章目录前情回顾友元友元的概念友元的目的友元的关键字友元的两种种用法全局函数做友元类做友元函数成员的别样定义有缘人学友元&#xff0c;急速突破第四层本章知识点&#xff08;图片形式&#xff09;&#x1f389;welcome&#x1f389; ✒️博主介绍&#xff1a;一名大一的…

Python怎么获取节假日信息?

“holidays” 是一个 Python 第三方库&#xff0c;它可以用来解析和处理节假日信息。 该库提供了一系列函数&#xff0c;可以用来检查某一天是否是节假日、获取某一年中所有节假日的列表等。它支持多种国家和地区的节假日&#xff0c;例如美国、加拿大、澳大利亚、英国等。 “…

【软件架构思想系列】分层架构

- 分层架构 -今天谈下架构设计中的分层思想和分层模型。架构思维概述对于架构思维本身仍然是类似系统思维&#xff0c;结构化思维&#xff0c;编程思维等诸多思维模式的一个合集。由于架构的核心作用是在业务现实世界和抽象的IT实现之间建立起一道桥梁&#xff0c;因此…

CUDA编程笔记(4)

文章目录前言1.CUDA的计时程序2.CUDA程序的计时影响GPU加速的关键总结前言 怎么才能看出使用cuda编程&#xff0c;提高了程序的性能&#xff0c;一般都是通过比较程序运行的时间来验证。所以熟悉程序的运行时间的计时&#xff0c;可以查看优化的性能效果。 1.CUDA的计时程序 …

每日亿题(面试题)

每日亿题(面试题) new Fn和new Fn()有什么区别&#xff1f; 1.首先如果是为传参数的情况下结果是相同的 2.如果是获取属性new Fn() 正常执行&#xff0c;而 new Fn 报错 3.不带括号不能给构造函数传参 分析比较 opacity: 0、visibility: hidden、display: none 优劣和适用…

Spring看这一篇文章就够了

第一章 Spring简介 第1节 Spring的介绍 Spring官网地址 1https://spring.ioSpring的介绍 1Spring是一个开放源代码的设计层面框架&#xff0c;他解决的是业务逻辑层和其他各层的松耦合问题&#xff0c;因此它将面向接口的编程思想贯穿整个系统应用。Spring是于2003年兴起的一…

4.2w字,详细的带你认识基础I/O【Linux--基础IO】

前言 相信大家最开始都挺疑惑的&#xff0c;什么I/O。在计算机操作系统中&#xff0c;所谓的I/O实则就是输入&#xff08;Input&#xff09;和输出&#xff08;Output&#xff09;&#xff0c;也可以理解为读&#xff08;Read&#xff09;和写&#xff08;Write&#xff09;&…

Linux常用命令——tar命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) tar Linux下的归档使用工具&#xff0c;用来打包和备份。 补充说明 tar命令可以为linux的文件和目录创建档案。利用tar&#xff0c;可以为某一特定文件创建档案&#xff08;备份文件&#xff09;&#xff0c;也…

mysql 基本组成

1 mysql 基本组成 1.1、mysql连接器的工作流程: 1.2、查看连接状态: show processlist; Note:客户端太长时间没动静 就自动断开 这个时间是由wait_timeout参数控制的,默认8h 长连接短链接 长连接是链接成功后,如果客户端持续有请求,则使用同一个链接[尽量使用长连接,因为每次…

组件间通信

1、Vue组件的嵌套关系 1.1、认识组件的嵌套 前面我们是将所有的逻辑放到一个App.vue中&#xff1a; 在之前的案例中&#xff0c;我们只是创建了一个组件App&#xff1b;如果我们一个应用程序将所有的逻辑都放在一个组件中&#xff0c;那么这个组件就会变成非常的臃肿和难以维…

【网络通信】【电信运营商实战工程师】思科设备篇-思科设备园区网实战

电信运营商实战工程师系列文章. 思科设备篇-思科设备园区网实战. 文章目录1. 思科设备链路捆绑实战2. 思科设备VRRP、HSRP实战3. 思科设备ACL实战全集4. 思科设备RIP协议实战5. 思科设备OSPF协议全集-理论6. 思科设备OSPF协议全集-实战1. 思科设备链路捆绑实战 知识点&#xff…

【中科微北斗+GPS模块经纬度数据解析详细教程-附免费代码工程】

中科微北斗GPS模块经纬度数据解析详细教程-附免费代码工程简介准备工作PC端需要用到的工具代码下载地址GD32F103C8T6最小系统板代码实现GD32串口引脚定义如下&#xff1a;串口的初始化串口0初始化代码&#xff1a;串口1初始化代码串口的输入串口0的输入代码如下&#xff1a;串口…

嵌入式Linux-线程的开始

1. 线程的开始 1.1 线程的含义 学习了进程相关的知识内容&#xff0c;对进程有了一个比较全面的认识和理解&#xff0c;从今开始呢&#xff0c;我们要学习一个新的概念&#xff0c;叫做线程&#xff01; 那什么是线程呢? 与进程类似&#xff0c;线程是允许应用程序并发执行…

java中的方法2023016

定义方法&#xff08;VS函数&#xff09;&#xff1a; 方法是类或对象的行为特征的抽象&#xff0c;方法是类或对象最重要的组成部分。但从功能上来看&#xff0c;方法完全类似于传统结构化程序设计里的函数。区别是&#xff1a;Java里的方法不能独立存在&#xff0c;所有的方法…

《精力管理》阅读笔记

目录 什么是精力及如何管理精力 高效表现有节奏——劳逸结合的平衡 管理精力的三个步骤 明确目标——知道什么最重要才能全情投入 正视现实——你的精力管理做得如何 付诸行动——积极仪式习惯的力量 精力管理的四个基本原则 体能精力——为身体添柴加火 情感精力——把…

微信小程序----全局数据共享

1.什么是全局数据共享 全局数据共享&#xff08;又叫做:状态管理&#xff09;是为了解决组件之间数据共享的问题。开发中常用的全局数据共享方案有:Vuex、Redux、MobX等。 2.小程序中的全局数据共享方案 在小程序中&#xff0c;可使用 mobx-miniprogram 配合 mobx-miniprog…

【SAP Abap】X档案:SAP Native SQL 简介及本地数据库访问实现方式(EXEC SQL、ADBC、AMDP)

SAP Native SQL 简介及本地数据库访问实现方式&#xff08;EXEC SQL、ADBC、AMDP&#xff09;1、SAP Open SQL 与 Native SQL 的特点2、实现方式方式一&#xff1a;Native SQL&#xff08;Exec SQL&#xff09;&#xff08;1&#xff09;获取单值&#xff08;2&#xff09;获取…

iOS上架appstore详细教材

假如你用原生xcode开发&#xff0c;上架是相对简单。 但假如是用hbuilderx这些uniapp框架开发&#xff0c;没有mac电脑&#xff0c;没有xcode&#xff0c;那么还能上架吗&#xff1f;是可以的&#xff0c;你看完这篇文章&#xff0c;就知道如何在没有mac电脑的情况下&#xff…