如何从指定网页下载特定扩展名文件?以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
相关产品推荐
相关产品推荐

