01 说明

1.1 网站和GPP数据集的基本信息

中国科学院地球大数据科学数据中心-网址:https://data.casearth.cn

本博客下载VPM-GPP的网址:https://data.casearth.cn/dataset/5c19a5660600cf2a3c557ad3

2000-2016年全球0.05°基于VPM模型的GPP数据集-产品信息:

1.2 API说明

网站所给API如下:

本博客主要基于通过ID获取文件列表单文件下载进行VPM-GPP的批量下载,对于元数据信息没有进行获取,但代码可以作为参考。

1.2.1 通过ID获取文件列表

这个Url是不完整的,是相对路径,结合前面的网站地址https://data.casearth.cn和此处的/api/dataset/getAllFileListBySdoId?sdoId=5c19a5660600cf2a3c557ad3拼接得到的网址https://data.casearth.cn/api/dataset/getAllFileListBySdoId?sdoId=5c19a5660600cf2a3c557ad3(通过浏览器即可打开)就是一个文件列表。

结果如下:

但是这里我们不直接下载,我们通过Python直接读取成json文件对这个文件列表进一步处理.(如果想要直接下载直接复制放到文本文件里改个后缀的事情)。

1.2.2 单文件下载

对于单文件下载,这里需要使用到前面获取得到的文件列表的信息补全这里的Url/api/file/downloadOneFile?fileId=文件Id&username=用户名

例如取文件列表data中一个文件:{"size":18485479,"file_name":"GPP.VPM.2000321.v20.CMG.tif","id":2148752},需要将id2148752替换上面Url中的文件Id

此外还有一个关键点,将用户名替换为登录中国科学院地球大数据科学数据中心后(https://data.casearth.cn)的用户名,注意不是登录时输入的用户名账号,而是登录之后显示的用户名(如下)。



补全之后的Url和之前的网站网址拼接即可得到该文件的下载链接(所以网站为什么索性不直接给一个含下载txt文件让我们自己做,当然现在也还好只是对于不熟悉下载的同学不是很友好)。

最终就是,按照上述的拼接就可以得到指定文件的下载链接例如:https://data.casearth.cn/api/file/downloadOneFile?fileId=2148752&username=何泽煌,现在代码的目标就是一直重复上述操作执行下载。

02 代码说明

完整代码:

# @Author  : ChaoQiezi
# @Time : 2025/7/17 上午11:09
# @Email : chaoqiezi.one@qq.com
# @Wechat : GIS茄子
# @FileName: download_VPM_GPP """
This script is used to 批量下载VPM-GPP
""" import requests
import os
import time # 网站根地址
base_url = "https://data.casearth.cn"
# id_url, 网站中<API:通过ID获取文件列表>所显示的Url
id_url = "/api/dataset/getAllFileListBySdoId?sdoId=5c19a5660600cf2a3c557ad3"
# 用户名, 登录后网站显示的名字就是你的用户名, 一般不是登录时的输入账户名
user_name = "何泽煌"
# 输出文件夹
out_dir = r"I:\DataHub\VPM_GPP" def get_files_info(base_url, id_url):
"""
调用API获取所有文件的信息列表
:param base_url: 根网址
:param id_url: 网站中<API:通过ID获取文件列表>所显示的Url
:return: 以字典形式返回{file_name: file_id, ···}
"""
"""
调用API获取所有文件的信息列表 (文件名 -> 文件ID 的映射)
""" # 文件列表的url
file_info_url = f"{base_url}{id_url}" # 获取文件列表的基本信息
response = requests.get(file_info_url, timeout=30, verify=False) # timeout=30表示超时30s没有链接上报错, verify是因为该网站SSL证书过期了这里不验证
response.raise_for_status() # 查询请求状态,若请求状态异常说明无法下载直接弹出报错
files_info = response.json()['data'] # [{'size': xxx, 'file_name': xxx, 'id': xxx}, {}, {}, ···] # 获取文件名和id
files_info = {file['file_name']: file['id'] for file in files_info}
print(f"成功获取 {len(files_info)} 个文件的信息。") return files_info def download_file(base_url, filename, file_id, username, save_dir):
"""
下载单个文件
:param base_url: 根网址
:param filename: 文件名(非自定义的输出, 基于api读取)
:param file_id: 文件id
:param username: 用户名(登录后网站显示的名字就是你的用户名, 一般非登录的账户名)
:param save_dir: 输出文件夹路径
:return: 成功返回True, 下载失败返回False
"""
"""
下载单个文件
""" api_url = f"{base_url}/api/file/downloadOneFile?fileId={file_id}&username={username}"
out_path = os.path.join(save_dir, filename) # 如果文件已经存在,则跳过
if os.path.exists(out_path):
print(f"文件存在: 文件名-{filename}")
return True print(f"正在下载: 文件名-{filename}, ID-{file_id})") try: # 可能由于网络等问题下载容易断开,这里try一下
with requests.get(api_url, timeout=60, verify=False) as r:
r.raise_for_status() # 查询请求状态,若请求状态异常说明无法下载报错
with open(out_path, 'wb') as f:
# 下方代码表示分块写入为防止下载文件过大而内存爆满, 如果执行这种流式传输,get方法需要设置stream=True
# for chunk in r.iter_content(chunk_size=8192):
# f.write(chunk)
# 一次性写入(确保单个文件大小小于当前可用内存)
f.write(r.content) time.sleep(0.01) # 友好请求,在每次下载后暂停一小段时间,防止因请求过快被服务器屏蔽
return True except Exception as e:
print(f"下载失败: 文件名-{filename}, 失败原因-{e}")
time.sleep(0.05) return False if __name__ == "__main__":
# 获取文件基本信息
files_info = get_files_info(base_url, id_url) # 遍历下载
success_count = 0
for file_name, file_id in files_info.items():
success_count += download_file(base_url, file_name, file_id, user_name, out_dir) print("\n下载完成: 成功-{}, 失败-{}".format(success_count, len(files_info) - success_count))

2.1 get_files_info函数说明

简而言之,按照之前的下载链接的拼接方式,我们最关键的是需要所有文件的id,但是由于输出文件时需要指定输出的文件名称,所以这里我还将file_name提取出来与id一一对应。因此这个函数的作用时将从读取的json文件中将file_nameid以字典dict形式返回。形如{文件名_1: 文件的id_1, 文件名_2: 文件的id_2···}

2.2 download_file函数说明

这个函数就是将之前的拼接方式以代码形式呈现得到当前所要下载文件的下载链接,接着通过request库进行进行即可。这里没有具体的说明是因为代码中有较为详细的注释供参考,且函数的参数和使用并不复杂,这里不展开说明,自行研究即可。

本文由博客一文多发平台 OpenWrite 发布!

Python:如何从地球大数据科学服务中心批量下载VPM-GPP?的更多相关文章

  1. python、Java、大数据和Android的薪资如何?

    莫名其妙,从去年年底开始,Python这个东西在中国,突然一下子就火起来了,直至现在,他的热度更是超越了java,成为软件工程师最为关注的话题.Python之所以能火起来,很大一方面是因为大数据.人工 ...

  2. 【python】-- Socket接收大数据

    Socket接收大数据 上一篇博客中的简单ssh实例,就是说当服务器发送至客户端的数据,大于客户端设置的数据,则就会把数据服务端发过来的数据剩余数据存在IO缓冲区中,这样就会造成我们想要获取数据的完整 ...

  3. 大数据之路day01_1--Java下载、安装等配置

    从今天开始,我就正式的走上大数据的道路了,如果说我为啥要去学习大数据,可能我的初衷是以后可以接触到人工智能方面的技术,后来在自学的过程中发现,学习人工智能,需要扎实的算法,以及对大量数据的处理,再者, ...

  4. [python] 溜了,溜了,七牛云图片资源批量下载 && 自建图床服务器

    故事背景: 七牛云最近一波测试域名操作真是把我坑死了!这简直和百度赠送你2T网盘,之后再限速一样骚操作.于是,痛定思痛自己买个云主机.自己搭图床应用! 1.七牛图片批量下载到本地 1.1 曲折尝试 当 ...

  5. Python socket ssh接收大数据

    通过socket连续接收返回数据 Server服务端 import socket,os server = socket.socket() server.bind(('localhost',9999)) ...

  6. Python编程快速上手(七)Unsplash批量下载器

    首发于个人博客:http://rhinoc.top/post/python_7.html 程序描述 V1.0输入关键字搜索图片,模拟页面下拉获取更多图片,页面加载完成后获取图片链接并下载至指定文件夹. ...

  7. 大数据,why python

    大数据,why python ps, 2015-12-4 20:47:46 python" title="大数据,why python">http://www.op ...

  8. 干货!小白入门Python数据科学全教程

    前言 本文讲解了从零开始学习Python数据科学的全过程,涵盖各种工具和方法 你将会学习到如何使用python做基本的数据分析 你还可以了解机器学习算法的原理和使用 说明 先说一段题外话.我是一名数据 ...

  9. 9 个鲜为人知的 Python 数据科学库

    除了 pandas.scikit-learn 和 matplotlib,还要学习一些用 Python 进行数据科学的新技巧. Python 是一种令人惊叹的语言.事实上,它是世界上增长最快的编程语言之 ...

  10. 【Python开发】Python 适合大数据量的处理吗?

    Python 适合大数据量的处理吗? python 能处理数据库中百万行级的数据吗? 处理大规模数据时有那些常用的python库,他们有什么优缺点?适用范围如何? 需要澄清两点之后才可以比较全面的看这 ...

随机推荐

  1. 异常分析 JedisConnectionException: java.net.SocketTimeoutException: Read timed out

    问题描述   测试Redis分布式锁的时候,如果一次执行大量数据,系统会报出如下异常: JedisConnectionException: java.net.SocketTimeoutExceptio ...

  2. 使用ajax来进行登录验证

    servlet: 1 @WebServlet("/login.do") 2 public class AjaxLoginServlet extends HttpServlet { ...

  3. ChatMoney让你变成HR高手!

    本文由 ChatMoney团队出品 在快节奏的现代职场中,招聘是每一个企业都绕不开的重要环节.然而,传统的招聘流程往往繁琐而低效,从海量简历的筛选,再到后续的评估与决策,每一个环节都耗费着HR人员大量 ...

  4. Swagger在线API测试文档

    Swagger API文档 前后端分离: 前端就负责展示数据,数据从哪来?后端提供的接口中得到 前端自己有一个叫伪造后端数据,json,这使得前端工程不需要后端仍可以跑起来 前后端的交互就是通过api ...

  5. 直播预约丨《袋鼠云大数据实操指南》No.1:从理论到实践,离线开发全流程解析

    近年来,新质生产力.数据要素及数据资产入表等新兴概念犹如一股强劲的浪潮,持续冲击并革新着企业数字化转型的观念视野,昭示着一个以数据为核心驱动力的新时代正稳步启幕. 面对这些引领经济转型的新兴概念,为了 ...

  6. 一次 .NET 性能优化之旅:将 GC 压力降低 99%

    字数 1128,阅读大约需 6 分钟 一次 .NET 性能优化之旅:将 GC 压力降低 99% 前言:问题的浮现 最近,我使用 ScottPlot 库开发一个频谱分析应用.应用的核心功能之一是实时显示 ...

  7. 逗号位置决定命运:CSS 选择器 `#id > a, b` 和 `#id > a, #id > b` 的致命差异

    引言:被忽视的逗号陷阱 在日常开发中,CSS 选择器的逗号,看似简单,但一个符号的位置差异就能导致样式作用范围天差地别.本文通过真实代码对比,揭示这个容易被忽视的关键细节. 核心结论(先看结果) 选择 ...

  8. MySQL 02 日志系统:一条SQL更新语句是如何执行的?

    比如执行一条更新语句: update T set c=c+1 where ID=2; 首先,更新语句也会走一遍查询语句的流程.除此以外,更新还涉及两个日志模块,分别是redo log和binlog. ...

  9. Luogu P10102 [GDKOI2023 提高组] 矩阵 题解

    P10102 [GDKOI2023 提高组] 矩阵 模拟赛题,场切了,似乎做法和全世界都不一样. 直接暴力矩阵乘法显然过不去,也没有什么前途.注意到只需要判定是否相等,考虑矩阵每一行的和.假设现在正在 ...

  10. 前端开发系列040-基础篇之TypeScript简单介绍

    一.TypeScript语言简单说明 简单说明 TypeScript 是微软2012年推出的一种编程语言,属于 JavaScript 的超集,可以编译为 JavaScript 执行.它最大特点是强大的 ...