You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从指定网页下载特定扩展名文件?以nc4文件及Rcurl为例

批量下载网页中特定扩展名文件的R实现方法

刚好我之前处理过类似的批量下载需求,用R来搞定这个事儿其实挺直观的,下面我分两种方法给你演示,先讲你提到的RCurl方案,再给你推荐一个更现代简便的替代方案:

方法一:使用RCurl + XML包(你提到的方案)

首先得安装并加载需要的包,RCurl负责网络请求,XML用来解析HTML里的链接:

# 首次运行需要安装包
install.packages(c("RCurl", "XML"))

# 加载包
library(RCurl)
library(XML)

接下来一步步操作:

  • 抓取网页HTML内容:用getURL()获取目标网页的源码
base_url <- "https://data.giss.nasa.gov/impacts/agmipcf/agmerra/"
page_source <- getURL(base_url)
  • 解析并提取所有链接:用htmlParse()解析源码,再用getHTMLLinks()提取页面上的所有链接
parsed_page <- htmlParse(page_source)
all_links <- getHTMLLinks(parsed_page)
  • 筛选出.nc4格式的文件链接:用正则匹配筛选出后缀为.nc4的链接,排除目录类链接
nc4_links <- all_links[grepl("\\.nc4$", all_links)]
  • 拼接完整下载URL:页面里的链接大多是相对路径,需要和基础URL拼接成完整地址
full_nc4_urls <- paste0(base_url, nc4_links)
  • 批量下载文件:先创建保存目录,再循环下载每个文件(注意设置mode="wb",因为是二进制文件)
# 创建保存目录(如果不存在的话)
dest_dir <- "./nasa_nc4_files"
if (!dir.exists(dest_dir)) dir.create(dest_dir)

# 批量下载
for (url in full_nc4_urls) {
  # 提取文件名
  filename <- basename(url)
  dest_path <- file.path(dest_dir, filename)
  
  download.file(url, dest_path, mode = "wb")
  cat("已下载:", filename, "\n")
}

方法二:使用rvest + httr(更现代简便的方案)

RCurl和XML包相对老旧了,现在更推荐用rvest(专门做网页抓取)和httr(处理网络请求),代码更简洁易读:

首先安装加载包:

install.packages(c("rvest", "httr"))
library(rvest)
library(httr)

然后步骤更简洁:

base_url <- "https://data.giss.nasa.gov/impacts/agmipcf/agmerra/"

# 读取网页并提取所有链接
page <- read_html(base_url)
all_links <- page %>% html_elements("a") %>% html_attr("href")

# 筛选.nc4链接并拼接完整URL
nc4_links <- all_links[grepl("\\.nc4$", all_links)]
full_nc4_urls <- paste0(base_url, nc4_links)

# 创建保存目录并下载
dest_dir <- "./nasa_nc4_files"
if (!dir.exists(dest_dir)) dir.create(dest_dir)

for (url in full_nc4_urls) {
  filename <- basename(url)
  dest_path <- file.path(dest_dir, filename)
  
  # 用httr的GET请求下载二进制文件
  response <- GET(url)
  writeBin(content(response, "raw"), dest_path)
  cat("已下载:", filename, "\n")
}

额外注意事项

  • 下载大量文件时,建议在循环里加Sys.sleep(1)延迟,避免对服务器造成过大压力,也防止被封禁IP
  • 如果遇到个别文件下载失败,可以用tryCatch()包裹下载代码,跳过错误继续执行:
for (url in full_nc4_urls) {
  filename <- basename(url)
  dest_path <- file.path(dest_dir, filename)
  
  tryCatch({
    download.file(url, dest_path, mode = "wb")
    cat("已下载:", filename, "\n")
  }, error = function(e) {
    cat("下载失败:", filename, "错误信息:", e$message, "\n")
  })
}

内容的提问来源于stack exchange,提问作者89_Simple

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:53:35