当前位置: 首页 > article >正文

告别手动点击!用Python脚本+Wget批量下载NASA VIIRS夜间灯光数据(附完整代码)

自动化获取NASA VIIRS夜间灯光数据的Python实践指南夜间灯光数据已成为城市发展、能源消耗和灾害评估等领域的重要研究工具。NASA的VIIRSVisible Infrared Imaging Radiometer Suite传感器提供的DBNDay/Night Band数据特别是VNP46系列产品以其高时空分辨率成为学术界和工业界的热门选择。然而手动下载这些数据不仅耗时耗力还容易因网络波动导致前功尽弃。本文将展示如何用Python构建一个健壮的自动化下载系统彻底解放研究人员的双手。1. 理解VIIRS夜间灯光数据体系VIIRS传感器搭载在Suomi NPPSNPP卫星上每天提供全球覆盖的夜间灯光观测。VNP46产品系列包含多个层级的数据处理结果VNP46A1基础产品包含经过大气校正的原始辐射值VNP46A2月光校正版本可直接用于分析VNP46A3月度合成产品VNP46A4年度合成产品# 典型VNP46A1文件命名示例 filename VNP46A1.A2020356.h30v05.001.2020358000243.h5 # 各部分含义 # A2020356 - 采集日期2020年第356天 # h30v05 - MODIS网格编号 # 001 - 集合版本号 # 2020358000243 - 处理时间戳对于需要日尺度分析的研究VNP46A1虽然受月光影响较大但因其更新及时通常延迟仅1-2天仍是动态监测的理想选择。下表对比了主要产品的特性产品代码更新频率月光校正适用场景VNP46A1每日无实时监测、短期变化分析VNP46A2不定期有长期趋势研究目前只到2018年VNP46A3每月有月度经济活动评估VNP46A4每年有年度发展对比提示选择数据产品时需权衡时效性与数据质量。对于需要即时分析的应用VNP46A1配合后期月光校正可能是更优方案。2. 构建自动化下载系统的核心技术2.1 EarthData认证机制解析NASA EarthData使用OAuth 2.0进行身份验证需要处理授权令牌Bearer Token的获取与刷新。以下是关键步骤注册EarthData账号并获取APP_KEY通过API获取临时访问令牌在请求头中加入授权信息处理令牌过期情况import requests from getpass import getpass def get_earthdata_token(username, password): auth_url https://urs.earthdata.nasa.gov/api/users/token response requests.post( auth_url, auth(username, password), headers{Content-Type: application/x-www-form-urlencoded} ) if response.status_code 200: return response.json()[access_token] else: raise Exception(f认证失败: {response.text}) # 安全获取凭证 username input(EarthData用户名: ) password getpass(EarthData密码: ) token get_earthdata_token(username, password)2.2 订单管理与文件列表获取提交数据请求后系统会生成一个订单号通过API可以获取该订单包含的所有文件信息def get_order_files(order_id, token): order_url fhttps://ladsweb.modaps.eosdis.nasa.gov/archive/orders/{order_id}/ headers {Authorization: fBearer {token}} response requests.get(order_url, headersheaders) if response.status_code 200: # 解析HTML获取文件列表 from bs4 import BeautifulSoup soup BeautifulSoup(response.text, html.parser) return [a[href] for a in soup.select(a[href$.h5])] else: raise Exception(f获取订单文件失败: {response.status_code})3. 实现健壮的下载管理器3.1 基于Wget的Python封装虽然可以直接使用系统wget命令但通过Python的subprocess模块封装可以提供更好的控制和错误处理import subprocess import os from pathlib import Path def download_with_wget(url, target_dir, token): Path(target_dir).mkdir(parentsTrue, exist_okTrue) cmd [ wget, -e, robotsoff, -m, -np, -R, *.html,*.tmp, -nH, --cut-dirs3, --header, fAuthorization: Bearer {token}, -P, target_dir, url ] try: result subprocess.run( cmd, checkTrue, stdoutsubprocess.PIPE, stderrsubprocess.PIPE, textTrue ) return True except subprocess.CalledProcessError as e: print(f下载失败: {e.stderr}) return False3.2 断点续传与错误恢复网络不稳定是批量下载大文件时的常见挑战。实现可靠的断点续传机制需要考虑记录已成功下载的文件检测部分下载的文件并恢复设置合理的重试机制import json from datetime import datetime class DownloadTracker: def __init__(self, state_filedownload_state.json): self.state_file state_file self.state self._load_state() def _load_state(self): try: with open(self.state_file, r) as f: return json.load(f) except (FileNotFoundError, json.JSONDecodeError): return {completed: [], failed: {}} def save_state(self): with open(self.state_file, w) as f: json.dump(self.state, f, indent2) def add_completed(self, filename): if filename not in self.state[completed]: self.state[completed].append(filename) self.save_state() def record_failure(self, filename, error): self.state[failed][filename] { error: str(error), timestamp: datetime.now().isoformat() } self.save_state() def get_remaining_files(self, all_files): return [f for f in all_files if f not in self.state[completed]]4. 构建完整的自动化流水线4.1 主控制流程实现将各个组件整合为一个完整的自动化系统def automated_download_pipeline(order_id, target_dir, max_retries3): # 初始化组件 tracker DownloadTracker() username input(EarthData用户名: ) password getpass(EarthData密码: ) # 获取认证令牌 try: token get_earthdata_token(username, password) except Exception as e: print(f认证失败: {e}) return # 获取文件列表 try: all_files get_order_files(order_id, token) except Exception as e: print(f获取文件列表失败: {e}) return remaining_files tracker.get_remaining_files(all_files) print(f发现{len(remaining_files)}个待下载文件) # 下载循环 for file_url in remaining_files: retry_count 0 while retry_count max_retries: try: print(f正在下载 {file_url}...) success download_with_wget(file_url, target_dir, token) if success: tracker.add_completed(file_url) print(下载成功) break else: retry_count 1 print(f尝试 {retry_count}/{max_retries} 失败) except Exception as e: tracker.record_failure(file_url, e) retry_count 1 print(f发生异常: {e}) if retry_count max_retries: print(f文件 {file_url} 下载失败已达最大重试次数) print(下载任务完成) print(f成功: {len(tracker.state[completed])}) print(f失败: {len(tracker.state[failed])})4.2 进度监控与通知系统为长时间运行的下载任务添加可视化监控import time from tqdm import tqdm def monitor_download_progress(tracker, check_interval60): prev_count len(tracker.state[completed]) with tqdm(totallen(tracker.state[completed]) len(tracker.state[failed])) as pbar: while True: current_count len(tracker.state[completed]) new_completed current_count - prev_count pbar.update(new_completed) prev_count current_count if len(tracker.state[completed]) len(tracker.state[failed]) pbar.total: break time.sleep(check_interval)5. 高级技巧与优化策略5.1 并行下载加速使用多线程可以显著提高下载效率但需要注意EarthData的请求限制from concurrent.futures import ThreadPoolExecutor, as_completed def parallel_download(file_urls, target_dir, token, max_workers4): with ThreadPoolExecutor(max_workersmax_workers) as executor: futures { executor.submit(download_with_wget, url, target_dir, token): url for url in file_urls } for future in as_completed(futures): url futures[future] try: success future.result() if success: print(f{url} 下载完成) else: print(f{url} 下载失败) except Exception as e: print(f{url} 发生异常: {e})5.2 数据完整性验证NASA提供checksum文件用于验证下载完整性import hashlib def verify_checksum(file_path, expected_md5): hash_md5 hashlib.md5() with open(file_path, rb) as f: for chunk in iter(lambda: f.read(4096), b): hash_md5.update(chunk) return hash_md5.hexdigest() expected_md5 def validate_downloads(target_dir, checksum_file): checksums {} with open(checksum_file, r) as f: for line in f: md5, filename line.strip().split() checksums[filename] md5 for filename, expected_md5 in checksums.items(): file_path os.path.join(target_dir, filename) if not os.path.exists(file_path): print(f{filename} 缺失) continue if verify_checksum(file_path, expected_md5): print(f{filename} 验证通过) else: print(f{filename} 校验失败)在实际项目中这套系统将NASA VIIRS数据的下载时间从数小时的手动操作缩短为完全自动化的过程同时通过完善的错误处理机制确保了数据完整性。一个典型的应用场景是监测东南亚地区夜间灯光变化系统可以设置为每天自动下载最新数据为区域发展研究提供实时数据支持。

相关文章:

告别手动点击!用Python脚本+Wget批量下载NASA VIIRS夜间灯光数据(附完整代码)

自动化获取NASA VIIRS夜间灯光数据的Python实践指南 夜间灯光数据已成为城市发展、能源消耗和灾害评估等领域的重要研究工具。NASA的VIIRS(Visible Infrared Imaging Radiometer Suite)传感器提供的DBN(Day/Night Band)数据&#…...

STM32步进电机控制实战:从GPIO模拟到定时器主从与编码器闭环的代码实现与选型指南(基于TB6600/DRV8825)

1. 步进电机控制方案选型指南 刚接触步进电机控制时,最让人头疼的就是选择哪种控制方式。我在做第一个3D打印机项目时,就曾在这个问题上纠结了很久。现在回头看,其实每种方案都有其适用场景,关键是要理解它们的优缺点。 GPIO模拟是…...

如何部署OpenClaw?2026年4月云端大模型Coding Plan配置步骤

如何部署OpenClaw?2026年4月云端大模型Coding Plan配置步骤。本文面向零基础用户,完整说明在轻量服务器与本地Windows11、macOS、Linux系统中部署OpenClaw(Clawdbot)的流程,包含环境配置、服务启动、Skills集成、阿里云…...

【STM32】实战3.2—基于TB6600与微步进控制实现42步进电机的平滑驱动

1. 微步进控制的核心价值 第一次用TB6600驱动42步进电机时,电机转动时的"咔哒"声让我印象深刻。这种典型的满步驱动噪音不仅影响使用体验,在需要精密控制的场景更是致命伤。后来接触到微步进技术,才发现原来步进电机可以运行得如此…...

怎么安装OpenClaw?2026年4月本地配置Coding Plan零门槛流程

怎么安装OpenClaw?2026年4月本地配置Coding Plan零门槛流程。本文面向零基础用户,完整说明在轻量服务器与本地Windows11、macOS、Linux系统中部署OpenClaw(Clawdbot)的流程,包含环境配置、服务启动、Skills集成、阿里云…...

智能编码平台上线72小时后崩溃?揭秘代码生成器与APM系统割裂导致的5大可观测性断层

第一章:智能编码平台上线72小时后崩溃?揭秘代码生成器与APM系统割裂导致的5大可观测性断层 2026奇点智能技术大会(https://ml-summit.org) 当AI生成的Go服务在Kubernetes集群中每秒创建37个goroutine却未触发任何APM告警时,崩溃已成定局。根…...

Cursor Free VIP:三步解锁AI编程神器的终极指南

Cursor Free VIP:三步解锁AI编程神器的终极指南 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached your trial req…...

2026 云+AI 架构选型指南:从 IaaS 到 MaaS 的九大服务模型与云原生实战涵盖—— IaaS、PaaS、SaaS、FaaS、CaaS、DaaS、MaaS、KaaS、XaaS 全栈服务模型

引言:数字时代的“水电煤”革命在数字经济时代,计算资源如同工业时代的电力与自来水,正以前所未有的方式被标准化、商品化和按需交付。这一变革的核心,正是云计算。而云计算的精髓,在于其分层的服务模型——从最底层的…...

Obsidian Dataview完全指南:3步将笔记库变成智能数据库的终极秘籍

Obsidian Dataview完全指南:3步将笔记库变成智能数据库的终极秘籍 【免费下载链接】obsidian-dataview A data index and query language over Markdown files, for https://obsidian.md/. 项目地址: https://gitcode.com/gh_mirrors/ob/obsidian-dataview 还…...

生成式AI推理服务扩缩容失效案例分析与解决方案(GPU利用率低于12%却持续扩容的底层逻辑)

第一章:生成式AI推理服务扩缩容失效案例分析与解决方案(GPU利用率低于12%却持续扩容的底层逻辑) 2026奇点智能技术大会(https://ml-summit.org) 在真实生产环境中,某大模型推理服务集群频繁触发水平自动扩缩容(HPA&a…...

如何免费掌握AMD Ryzen处理器调试:SMUDebugTool完整入门指南

如何免费掌握AMD Ryzen处理器调试:SMUDebugTool完整入门指南 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: http…...

智能缝纫机与无人缝纫生产线行业研究报告 -以泉州誉财自动化为例

引言随着“中国制造2025”战略和全球工业4.0浪潮的持续推进,制造业正经历着从“汗水驱动”向“智慧驱动”的深刻变革。纺织服装行业作为中国制造业的重要支柱,长期以来依赖大量熟练工人,面临着劳动力成本上升、用工荒、生产效率瓶颈等多重挑战。智能缝纫机与无人缝纫生产线的兴…...

docker运行容器

【-it交互式启动容器】docker run -it --gpus all --networkhost --ipchost --rm --name qwen3.5-test \-v /home/vllm-models/Qwen3___5-35B-A3B:/home/vllm-models/Qwen3___5-35B-A3B \-v /etc/localtime:/etc/localtime:ro \-v /etc/timezone:/etc/timezone:ro \--entrypoin…...

SpringBoot项目实战:用mysql-binlog-connector-java实现用户行为日志的实时同步(附完整代码)

SpringBoot实战:基于MySQL Binlog的用户行为日志实时同步架构设计 在当今数据驱动的业务环境中,用户行为数据的实时采集与分析已成为企业精细化运营的核心能力。想象这样一个场景:当用户在电商平台完成一笔支付后,风控系统需要在5…...

AI Illustrator 钢笔工具进阶:从基础锚点到流畅贝塞尔曲线的绘制秘籍

1. 钢笔工具基础:从零开始掌握锚点操作 第一次接触AI Illustrator的钢笔工具时,很多人都会被它看似复杂的操作吓退。但说实话,掌握了基本要领后,你会发现它比想象中简单得多。钢笔工具的核心在于锚点的控制,这就像搭积…...

QobuzDownloaderX-MOD 终极指南:三步轻松下载Qobuz无损音乐

QobuzDownloaderX-MOD 终极指南:三步轻松下载Qobuz无损音乐 【免费下载链接】QobuzDownloaderX-MOD Downloads streams directly from Qobuz. Experimental refactoring of QobuzDownloaderX by AiiR 项目地址: https://gitcode.com/gh_mirrors/qo/QobuzDownloade…...

如何快速配置trackerslist:终极BT下载加速方案

如何快速配置trackerslist:终极BT下载加速方案 【免费下载链接】trackerslist Updated list of public BitTorrent trackers 项目地址: https://gitcode.com/GitHub_Trending/tr/trackerslist 你是否曾经遇到过BT下载速度慢如蜗牛,资源卡在99%无法…...

保姆级教程:用Python+ArcPy搞定ERA5-Land月数据(降水/气温/辐射)的下载与批量处理

PythonArcPy自动化处理ERA5-Land气象数据的完整实战指南 当面对全球尺度的ERA5-Land月数据时,手动处理降水、气温和辐射等多变量数据就像用勺子舀干大海——效率低下且容易出错。本文将分享一套经过实战检验的自动化处理方案,帮助地理信息、生态水文领域…...

矩阵求逆引理新解:从Woodbury恒等式到高效计算实践

1. 从通信到AI:Woodbury恒等式为何如此重要 第一次接触Woodbury恒等式是在研究生时期的通信系统课上。当时教授在黑板上写下这个公式时,我完全没意识到它会在后来的机器学习项目中成为我的"救命稻草"。这个看似复杂的公式,本质上解…...

2026最权威的五大降AI率方案推荐榜单

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 在内容创作的进程当中,降低 AIGC 率这个目标,得从语言风格与结构逻辑…...

Bodymovin扩展面板完整指南:如何将After Effects动画转化为轻量级JSON动效

Bodymovin扩展面板完整指南:如何将After Effects动画转化为轻量级JSON动效 【免费下载链接】bodymovin-extension Bodymovin UI extension panel 项目地址: https://gitcode.com/gh_mirrors/bod/bodymovin-extension 你是否曾为After Effects中的精美动画无法…...

保姆级教程:用Python搞定Semantic Drone Dataset的掩码图生成与数据加载(附完整代码)

从零构建无人机语义分割数据管道:Semantic Drone Dataset实战指南 当第一次打开Semantic Drone Dataset的压缩包时,很多开发者会陷入茫然——6000x4000像素的原始图像、复杂的目录结构、没有现成的掩码文件。这份数据集就像未经雕琢的玉石,需…...

时间继电器测试校验仪精准高效的检测解决方案

时间继电器是工业控制、电力调度、轨道交通等领域的核心时序元件,其动作精度、可靠性直接决定整个系统的运行安全与效率。西安同步电子研发的SYN5606型时间继电器测试仪,以“精准适配、高效便捷、稳定可靠”为核心,适配各类时间继电器全生命周…...

告别Overleaf!在VS Code里用LaTeX Workshop写论文的保姆级配置(含环境变量、PDF同步、Snippets)

告别Overleaf!在VS Code里用LaTeX Workshop写论文的保姆级配置 如果你正在写学术论文或技术报告,大概率已经受够了在线LaTeX编辑器的种种限制——网络延迟导致的卡顿、功能阉割带来的不便,或是隐私泄露的潜在风险。今天,我们将彻底…...

从Mixamo到Unity:构建角色动画控制系统的完整实践指南

1. 从Mixamo获取角色动画资源 Mixamo是Adobe旗下专注于3D角色动画的在线资源库,提供大量免费且高质量的动作捕捉数据。对于刚接触Unity动画系统的新手来说,这个平台能快速解决"如何让角色动起来"的核心问题。我第一次使用Mixamo时,…...

别再为SBUS负逻辑头疼了!硬件反相器电路设计与STM32软件避坑全指南

SBUS负逻辑难题终结手册:从硬件反相到STM32配置的工程实践 当你第一次将航模遥控器的SBUS输出端直接连接到自制的STM32飞控板时,那个令人沮丧的时刻——串口调试器里只有乱码或者干脆一片寂静——可能已经成为许多嵌入式开发者的"成人礼"。这…...

Redux DevTools 终极调试指南:从状态混乱到精准掌控的完整解决方案

Redux DevTools 终极调试指南:从状态混乱到精准掌控的完整解决方案 【免费下载链接】redux-devtools DevTools for Redux with hot reloading, action replay, and customizable UI 项目地址: https://gitcode.com/gh_mirrors/re/redux-devtools 你是否曾为R…...

加载时重写 Linux 二进制文件系统调用:低开销控制进程交互的新方法?

在加载时重写 Linux 二进制文件中的每个系统调用问题的起源如今,软件运行方式存在奇怪之处。多数容器(生产环境主导部署单元)仅运行单个进程,如 Python 脚本、Node.js 服务器或 Go 二进制文件。但此单一进程依赖完整 Linux 内核&a…...

突破传统收音机局限:用SI4735库打造智能无线电系统的终极指南

突破传统收音机局限:用SI4735库打造智能无线电系统的终极指南 【免费下载链接】SI4735 SI473X Library for Arduino 项目地址: https://gitcode.com/gh_mirrors/si/SI4735 还在为传统收音机开发繁琐的硬件设计而烦恼吗?还在为复杂的射频电路调试而…...

如何零成本掌握专业音频编辑:5个实战场景+3步高效流程+7个核心技巧

如何零成本掌握专业音频编辑:5个实战场景3步高效流程7个核心技巧 【免费下载链接】audacity Audio Editor 项目地址: https://gitcode.com/GitHub_Trending/au/audacity 想要创作专业级音频内容却担心成本和技术门槛?今天我将为你揭秘一款完全免…...