MSWEP降水数据下载太慢?这篇文章帮你提速10倍
- 2026-09-25 09:59:56
一、写在前面:为什么你的 MSWEP 下载这么慢?
MSWEP(Multi-Source Weighted-Ensemble Precipitation)是 GloH2O 团队发布的全球降水数据集,凭借卫星、再分析与雨量计的多源融合,0.1° 的空间分辨率,成为降水研究最常用的数据之一。V3 版本更是引入了机器学习算法,数据质量进一步提升。

但很多同学在下载时都会遇到同样的崩溃:官方指定用 rclone 从 Google Drive 下载,而 Past/3hourly 目录下有 13 万多个文件平铺存放,实测下载速度只有 4~5 个文件/分钟。按这个速度,下载一年的数据(2920 个文件)需要 10 个小时,全部 46 年数据要下一周!
笔者最近完整下载了 MSWEP V3 数据,把踩过的坑和最终的提速方案整理成这篇教程。照着做,一年数据 1 小时内下完,速度提升 10 倍。全程免费。
先看效果对比
方案 | 下载速度 | 下完一年(2920文件)耗时 | 备注 |
rclone 默认配置 | 约 4 个/分钟 | 约 12 小时 | 频繁 403 限流,每下载一个文件几乎都要吃一次 403、等 30 秒重试 |
本文方案:专属 OAuth + API 并行下载 | 约 40 个/分钟 | 约 1 小时 | 8 线程并行、断点续传、自动重试,全程稳定 |
二、方案总览:慢的根源在哪?
在动手之前,先搞清楚慢的原因,才能对症下药。慢的根源有两个:
根源 1:rclone 默认的客户端 ID 是"公交车"
rclone 安装后,默认使用 rclone 官方注册的 Google OAuth 客户端 ID。全世界所有 rclone 用户共享这同一个 ID 的配额,Google 对每个客户端 ID 有每分钟请求数(QPM)限制。高峰期配额被挤占,你的每个下载请求都会先吃一个 403 错误,等待 30 秒退避后重试才能成功——这就是"4 个/分钟"的由来。
解决办法:在 Google Cloud 免费注册一个自己的 OAuth 客户端 ID,配额独享。这是本文的核心提速手段。
根源 2:13 万个文件平铺,rclone 列目录就要半小时
MSWEP 的 Past/3hourly 目录把 46 年共 13.5 万个文件全部平铺在一个文件夹里。rclone 每次执行 copy 命令,都需要先向 Google Drive 查询目录列表,而 Drive 列目录有分页限制(每页 1000 条),实测列完这个目录需要 20~50 分钟,而且这一步同样消耗宝贵的配额。
解决办法:先用 rclone lsjson 一次性把所有文件的 ID 导出成清单,之后下载时直接按文件 ID 调用 Drive API,完全跳过列目录,还能多线程并行。
整体技术路线
步骤 | 做什么 | 耗时 |
第 1 步 | 申请 MSWEP 数据访问权限(邮件确认) | 几分钟~几天 |
第 2 步 | 安装并配置 rclone,绑定 Google 账号 | 约 10 分钟 |
第 3 步 | 注册免费的专属 OAuth 客户端 ID | 约 10 分钟 |
第 4 步 | 导出文件 ID 清单 | 约 30 分钟(挂机) |
第 5 步 | 运行并行下载脚本 | 一年约 1 小时 |
三、配置OAuth并行下载
第 1 步:申请 MSWEP 数据访问权限
打开官网 gloh2o.org/mswep,找到数据申请入口,填写申请表。
申请用途填非商业科研用途(non-commercial research),附上姓名、单位、邮箱。
等几天会收到确认邮件,里面有两个 Google Drive 链接:旧版 MSWEP V2.8 和新版 MSWEP V3.16(test)。
用浏览器登录你打算下载用的 Google 账号,逐个点开邮件里的链接并接受共享。这一步不能省:共享是精确绑定到邮箱的,哪个账号点开接受了链接,哪个账号才能下载数据。
重要提醒:邮件里会说明 NRT 近实时数据中 10 天以内的文件会被渐进升级(新数据源到达后重新计算),建议等文件"老化"超过 10 天后再下载,或之后重新下载这些文件,以保证精度。
第 2 步:安装配置 rclone
2.1 安装
Windows 用户到 rclone.org/downloads 下载压缩包,解压后把 rclone.exe 放到任意目录,并把该目录加入系统 PATH 环境变量。macOS / Linux 用户用包管理器安装即可(如 brew install rclone 或 apt install rclone)。
2.2 配置 Google Drive 远程
在终端运行:
rclone config按提示依次选择:
n) New remote —— 新建远程
名称:输入 gdrive(名字随意,后文以此为准)
存储类型:输入 drive(Google Drive)
client_id / client_secret:先直接回车跳过(第 3 步会回来改)
scope:选 1(完全访问)
其余选项一路回车,最后问是否用高级配置选 n,问是否自动打开浏览器授权选 y
浏览器会弹出 Google 授权页面,登录你第 1 步接受共享用的那个 Google 账号,点"允许"。回到终端看到 "Login Ok" 即配置成功。
2.3 验证能否看到共享文件夹
运行以下命令,列出"与我共享"的文件夹:
rclone lsd gdrive: --drive-shared-with-me能看到 GloH2O 共享的文件夹名(如 MSWEP_V316_test、3hourly 等)就说明权限通了。
常见坑:如果看不到,99% 是浏览器里接受共享的账号和 rclone 授权的账号不是同一个。可以运行 rclone config dump 查看配置,或者用 rclone authorize 单独测试授权账号。
第 3 步:注册免费的专属 OAuth 客户端 ID(核心提速步骤)
这一步全程免费,不需要绑定信用卡,10 分钟搞定,是一劳永逸的投入。
3.1 创建 Google Cloud 项目
浏览器登录你的 Google 账号,打开 console.cloud.google.com/projectcreate
项目名称随意(如 mswep),点"创建"
3.2 启用 Google Drive API
打开 console.cloud.google.com/apis/library/drive.googleapis.com
确认左上角项目选择器选的是刚建的项目,点"启用"
3.3 配置 OAuth 同意屏幕
左侧菜单进入"API 和服务 → OAuth 同意屏幕"(新版界面叫 Google Auth Platform)
用户类型选"外部(External)",点创建
应用名称随便填(如 mswep),用户支持邮箱选自己,保存
应用首页/隐私政策/服务条款链接:填任意有效网址(如 example.com)。注意:如果填 example.com 后发布应用时提示"缺少的网域",不用纠结——直接跳过"发布应用",用测试模式即可,速度提升效果完全一样
进入"受众群体(Audience)"页面,在"测试用户"里添加自己的邮箱为测试用户
测试模式的唯一代价:授权令牌每 7 天过期一次,到期后重新点一次"允许"即可,一年也就多点几次鼠标。
3.4 创建 OAuth 客户端 ID
左侧"凭据 → 创建凭据 → OAuth 客户端 ID"
应用类型选择"桌面应用(Desktop app)"
名称随意,点"创建"
弹窗中复制"客户端 ID"(形如 123456789-xxxxx.apps.googleusercontent.com)和"客户端密钥"(形如 GOCSPX-xxxxx),妥善保存
5.5 把客户端 ID 填进 rclone
编辑 rclone 配置文件(Windows 在 C:\Users\你的用户名\AppData\Roaming\rclone\rclone.conf),在你的远程配置段落中加入两行:
[gdrive]type = driveclient_id = 你的客户端ID.apps.googleusercontent.comclient_secret = 你的客户端密钥scope = drivetoken = {...}
然后重新授权一次(让新客户端 ID 生效):
rclone config reconnect gdrive:浏览器再次弹出授权页面,点"允许"。如果出现"Google 尚未验证此应用"警告,属正常(自用测试模式),点"继续"即可。
至此,你的配额就独享了,限流大幅缓解。但列目录慢的问题还在,继续第 4 步。
第 4 步:导出文件 ID 清单
用 lsjson 把共享文件夹里的所有文件信息(文件名、ID、大小)一次性导出。以 V3.16 的 Past/3hourly 为例,先找到文件夹 ID:
rclone lsjson gdrive: --drive-shared-with-me输出中找到 Past/3hourly 文件夹对应的 ID,然后导出清单:
rclone lsjson "gdrive:" --drive-root-folder-id 文件夹ID --drive-shared-with-me -v > file_list.json13.5 万个文件列完约需 20~30 分钟(Drive 分页限制,每页 1000 条),挂机等待即可。这一步只需做一次,产出 file_list.json 约 25MB,包含每个文件的名称、ID 和字节数。
小技巧:清单里顺手统计一下各年份的文件数,方便后面规划下载。V3 命名规则和 V2 一致,为 YYYYDDD.HH.nc(年.天.时),一天 8 个文件,一年约 2920 个。
第 5 步:并行下载脚本(附完整代码)
原理:读取文件清单,按文件 ID 直接调用 Drive API 的 download 接口,8 线程并行,带 403 自动退避重试、access token 自动刷新、断点续传(已下载的文件自动跳过)、大小校验。
完整代码如下,保存为 download_mswep.py,按需修改开头的配置区即可直接运行:
# -*- coding: utf-8 -*-"""MSWEP V3 批量并行下载脚本用法: python download_mswep.py <年份> [线程数]依赖: 无第三方依赖(仅标准库)"""import json, os, re, sys, time, threading, urllib.request, urllib.errorfrom concurrent.futures import ThreadPoolExecutor, as_completed# ================= 配置区 =================RCLONE_CONF = r"C:\Users\你\AppData\Roaming\rclone\rclone.conf"# rclone配置REMOTE_NAME = "gdrive"# rclone远程名FILE_LIST= r"D:\data\file_list.json"# 第4步导出的清单OUT_BASE= r"D:\data\mswep"# 下载输出目录# =========================================_token_lock = threading.Lock()_token = {"value": None, "ts": 0}def load_token():"""从 rclone 配置读取 access token(含过期则刷新的说明见文末)"""with open(RCLONE_CONF, encoding="utf-8") as f:content = f.read()m = re.search(r"\[" + REMOTE_NAME + r"\].*?token = (\{.*?\})", content, re.S)return json.loads(m.group(1))def refresh_token():"""用 refresh_token 换新的 access_token(OAuth 标准流程)"""t = load_token()data = urllib.parse.urlencode({"client_id": CLIENT_ID, "client_secret": CLIENT_SECRET,"refresh_token": t["refresh_token"], "grant_type": "refresh_token",}).encode()req = urllib.request.Request("https://oauth2.googleapis.com/token", data=data)resp = json.loads(urllib.request.urlopen(req, timeout=60).read())t["access_token"] = resp["access_token"]return t["access_token"]def get_token(force=False):with _token_lock:if not force and _token["value"] and time.time() - _token["ts"] < 1500:return _token["value"]tok = refresh_token()_token.update(value=tok, ts=time.time())return tokdef download_one(fid, dest, expect_size, max_retry=5):for attempt in range(1, max_retry + 1):try:token = get_token(force=(attempt > 1))url = f"https://www.googleapis.com/drive/v3/files/{fid}?alt=media"req = urllib.request.Request(url, headers={"Authorization": f"Bearer {token}"})with urllib.request.urlopen(req, timeout=300) as resp, open(dest, "wb") as f:while True:chunk = resp.read(1024 * 1024)if not chunk: breakf.write(chunk)if expect_size and os.path.getsize(dest) != expect_size:raise IOError("size mismatch")return Trueexcept Exception as e:if attempt == max_retry:print(f"FAILED {os.path.basename(dest)}: {e}", flush=True)return Falsetime.sleep(15 * attempt)# 退避:15s/30s/45s...def main():year, workers = sys.argv[1], int(sys.argv[2]) if len(sys.argv) > 2 else 8outdir = os.path.join(OUT_BASE, year)os.makedirs(outdir, exist_ok=True)with open(FILE_LIST, encoding="utf-8") as f:items = json.load(f)tasks = [(x["Name"], x["ID"], x.get("Size", 0)) for x in itemsif x["Name"].startswith(year) and x["Name"].endswith(".nc")]done = {n for n in os.listdir(outdir) if n.endswith(".nc")}todo = [t for t in tasks if t[0] not in done]# 断点续传:跳过已有文件print(f"{year}: 共{len(tasks)}个, 已有{len(done)}, 待下载{len(todo)}", flush=True)t0, ok = time.time(), 0with ThreadPoolExecutor(max_workers=workers) as pool:futs = {pool.submit(download_one, fid, os.path.join(outdir, name), size): namefor name, fid, size in todo}for fut in as_completed(futs):if fut.result():ok += 1if ok % 50 == 0:rate = ok / (time.time() - t0) * 60print(f"进度 {ok}/{len(todo)}速率 {rate:.0f} 个/分钟", flush=True)print(f"完成: {ok}/{len(todo)} 成功", flush=True)if __name__ == "__main__":main()
运行:
python download_mswep.py 2023 8实测速度约 40 个文件/分钟,一年 2920 个文件(约 7GB)1 小时左右下完,且全程稳定、零失败。
提示:脚本里 CLIENT_ID/CLIENT_SECRET 填第 3 步注册时拿到的值。如果不想在脚本里做令牌刷新,也可以每 50 分钟手动跑一次 rclone config reconnect gdrive: 让 rclone 帮你刷新令牌。
四、避坑指南:笔者踩过的所有坑
坑 | 现象 | 解决办法 |
共享账号不匹配 | rclone 看不到共享文件夹 | 接受共享的账号必须和 rclone 授权的账号完全一致 |
默认客户端 ID 限流 | 每下载一个文件吃一次 403,4~5 个/分钟 | 注册专属 OAuth 客户端 ID(本文第 3 步) |
平铺目录列不动 | rclone copy 开始前卡住 20~50 分钟 | lsjson 一次性导出 ID 清单,API 按 ID 下载 |
OAuth 测试模式 | "Google 尚未验证此应用"警告;令牌 7 天过期 | 点"继续"即可;到期重新授权一次 |
发布应用需验证域名 | Publish App 提示缺少网域 | 不用管,测试模式即可 |
断网/中断 | 下载进程被杀 | 脚本断点续传,重跑自动跳过已有文件 |
大小校验失败 | 极少数文件下载不完整 | 脚本自动重试并校验字节数 |
五、附:大体量数据的管理建议
如果是逐年的批量下载,推荐"中转站"工作流,避免本地磁盘被吃满:
对每一年 YYYY: 1. python download_mswep.py YYYY 8# 下载到本地中转目录 2. 校验文件数量和总大小 3. scp -r 上传到服务器 4. 确认服务器端数量一致后删除本地 5. 下一年
下载、校验、上传、删除一步一确认,任何环节出问题都能重跑补齐
中转盘只需容纳一年的量(V3 一年约 7GB),普通硬盘绰绰有余
重要数据至少保留两份(服务器 + 备份盘),RAID 不是备份
六、结语
总结一下提速的三个关键动作:
① 申请权限时,确保接受共享的 Google 账号和 rclone 绑定的一致
② 注册免费的专属 OAuth 客户端 ID,摆脱全球共享配额(4 → 40 个/分钟)
③ 导出文件 ID 清单,用 Drive API 多线程直连下载,跳过列目录
这套思路不仅适用于 MSWEP,任何托管在 Google Drive 上的大规模科研数据(如 GloH2O 的其他产品、各种共享数据集)都可以照搬。
推文太长?不想看?没关系。
直接把这篇推文复制、粘贴给 AI Agent,它就能替你执行后续的所有任务——安装配置、申请授权、注册客户端、批量下载,一条龙搞定。
这时候,你只需要打开抖音刷刷视频,或者干脆出门走走,看看月亮。毕竟中秋一年只有一次,而数据,让 AI 替你下就好。
参考文献
觉得有用的话,点赞、在看、转发给正在被下载速度折磨的同学吧!有问题欢迎留言讨论。