R语言如何从指定URL筛选下载符合命名与年份要求的文件
R语言定向筛选下载NOAA VCI数据方案
全程不需要全量拉取140G目录内容,先拉取文件列表本地完成规则过滤,仅下载符合要求的目标文件,具体实现步骤如下:
前置依赖安装
用到的工具包均为CRAN官方源可直接安装的通用包,无特殊依赖:
# 首次运行执行安装,已装过可跳过 install.packages(c("rvest", "curl", "stringr")) # 加载包 library(rvest) library(curl) library(stringr)
拉取远程目录文件清单
仅读取目录页的文件名列表,不下载任何实体数据,几秒即可完成:
# 配置数据源根地址 base_url <- "https://www.star.nesdis.noaa.gov/pub/corp/scsb/wguo/data/Blended_VH_4km/geo_TIFF/" # 提取目录下所有tif格式文件名 dir_page <- read_html(base_url) all_tif_files <- dir_page %>% html_elements("a") %>% html_attr("href") %>% str_subset("\\.tif$")
按自定义规则过滤目标文件
严格匹配两个筛选条件:文件名包含VCI.tif、文件对应年份在1981-2011区间:
# 第一层筛选:保留文件名带VCI.tif的文件 vci_files <- all_tif_files[str_detect(all_tif_files, "VCI\\.tif$")] # 第二层筛选:从文件名提取4位年份,筛选1981-2011区间文件 # 适配该数据集命名规则:文件名格式为 VH_YYYYMM_XXX.tif file_year <- as.integer(str_extract(vci_files, "(?<=_)\\d{4}(?=\\d{2}_)")) target_files <- vci_files[!is.na(file_year) & file_year >= 1981 & file_year <= 2011] # 打印筛选结果核对数量 cat("筛选完成,待下载文件共", length(target_files), "个\n")
过滤逻辑完全在本地内存运行,不会提前下载文件实体,筛选完成后再发起下载请求,完全避免无效流量和空间浪费
批量下载(带容错、断点续跳)
下载时自动跳过本地已存在的文件,中途断网重跑不会重复下载,单个文件下载失败不中断整体任务:
# 配置本地存储路径,可自行修改 local_save_path <- "./noaa_vci_1981_2011/" dir.create(local_save_path, showWarnings = F, recursive = T) # 遍历下载 for (file in target_files) { local_file <- paste0(local_save_path, file) remote_file <- paste0(base_url, file) # 跳过已下载完成的文件 if (file.exists(local_file)) { message("跳过已下载:", file) next } # 捕获下载错误,避免中断 tryCatch({ curl_download(remote_file, local_file, quiet = F) message("下载完成:", file) }, error = function(e) { message("下载失败:", file, " 原因:", e$message) }) }
实用优化提示
- 网络不稳定时可以在
curl_download里加超时配置,比如传入参数handle = new_handle(timeout = 600)把单文件超时设为10分钟 - 需要提速可以开3-5个并行线程下载,不要开太高并发避免给源站造成压力
- 下载前可以提前请求每个文件的头信息拿到文件大小,累加算总容量,提前预留磁盘空间
- 后续要调整筛选规则(比如换指数、换年份区间)直接修改过滤段的逻辑即可,比写bash正则适配wget灵活很多
内容的提问来源于stack exchange,提问作者Shunrei
相关产品推荐
相关产品推荐

