如何批量下载DWD网站按年/月目录索引存储的多份气候数据集?
你要下载的DWD德国月均气温格点数据存储地址:https://opendata.dwd.de/climate_environment/CDC/grids_germany/monthly/air_temperature_mean/
目录页结构参考:
以下是Windows 10系统下可直接落地的3种批量下载方案,覆盖全量下载、按年份筛选下载的需求,从无代码到代码方案都有:
方案1:FTP挂载可视化操作(零代码,新手首选)
不需要装任何额外软件,用系统自带功能就能像操作本地文件一样选文件下载:
- 打开「此电脑」,在空白处右键选择「添加一个网络位置」,连续点2次「下一步」
- 在「Internet地址或网络地址」输入框填:
ftp://opendata.dwd.de/climate_environment/CDC/grids_germany/monthly/air_temperature_mean/,点下一步 - 勾选「匿名登录」,点下一步,给这个网络位置随便起个名字(比如DWD月气温数据),点完成
- 打开刚建好的网络位置,就能看到所有数据文件:要下全部文件直接按Ctrl+A全选,复制粘贴到本地文件夹即可;要下特定年份的文件,按住Ctrl点选对应年份命名的文件,再复制粘贴到本地就行,和本地拷文件操作完全一致。
方案2:命令行批量下载(轻量高效,支持规则筛选)
用wget工具可以一条命令完成批量下载,支持按文件名规则筛选指定年份的文件:
- 搜索下载Windows版本的wget单exe程序,放到
C:\Windows\System32路径下,就能全局调用 - 打开你打算存数据的本地文件夹,按住Shift右键空白处,选择「在此处打开PowerShell窗口」/「在终端中打开」
- 全量下载所有文件,直接输入以下命令回车即可:
wget -r -np -nH --cut-dirs=6 -R .html,.gif https://opendata.dwd.de/climate_environment/CDC/grids_germany/monthly/air_temperature_mean/
参数说明:
-r递归抓取目录下所有文件,-np不爬取上级目录内容,-nH不自动创建域名同名文件夹,--cut-dirs=6忽略URL前6层目录结构,直接把数据存在当前打开的本地文件夹,-R过滤掉网页索引、图标这类无用文件
- 如果要筛选指定年份下载,比如只下2000-2020年的文件,替换成以下命令即可,通配符规则可以自己调整:
wget -r -np -nH --cut-dirs=6 -R .html,.gif -A "*200[0-9]*.gz","*201[0-9]*.gz","*2020*.gz" https://opendata.dwd.de/climate_environment/CDC/grids_germany/monthly/air_temperature_mean/
方案3:RStudio代码下载(适合后续直接用R处理数据的场景)
代码自带断点续传、重复运行不重复下载的逻辑,自定义筛选规则更灵活:
- 打开RStudio,先运行以下命令安装依赖包:
install.packages(c("rvest", "curl")) - 复制以下代码到脚本区,修改2处配置参数后直接运行即可:
library(rvest) library(curl) # ==== 按需修改以下2个参数 ==== # 本地存数据的路径,注意路径里的斜杠用/不要用\ save_dir <- "D:/dwd_climate/temp_monthly/" # 要下载的年份范围,比如要下1985-2023就写1985:2023,要全量下载就设为NULL target_years <- 1985:2023 # ========================== dir.create(save_dir, recursive = TRUE, showWarnings = FALSE) base_url <- "https://opendata.dwd.de/climate_environment/CDC/grids_germany/monthly/air_temperature_mean/" # 抓取目录下所有数据文件链接 page_content <- read_html(base_url) all_files <- page_content |> html_elements("a") |> html_attr("href") |> grep("\\.gz$|\\.asc$", x = _, value = TRUE) # 按年份筛选文件 if (!is.null(target_years)) { match_pattern <- paste0("*", target_years, "*", collapse = "|") all_files <- grep(match_pattern, all_files, value = TRUE) } # 批量下载,已存在的文件自动跳过 for (file_name in all_files) { local_path <- paste0(save_dir, file_name) if (!file.exists(local_path)) { curl_download( url = paste0(base_url, file_name), destfile = local_path, mode = "wb" ) cat("下载完成:", file_name, "\n") } }
内容的提问来源于stack exchange,提问作者maycca
相关产品推荐
相关产品推荐

