R语言for循环下载PDF时如何按id列条件命名并指定保存路径
R批量下载PDF文件解决方案
前置准备:创建存储目录
首先确保本地pdfs子文件夹存在,避免下载时报路径不存在的错误:
dir.create("pdfs", showWarnings = FALSE, recursive = TRUE)
showWarnings = FALSE表示如果文件夹已存在也不会抛出警告,recursive = TRUE支持创建多级嵌套目录。
方案1:基础for循环写法(和原写法逻辑最接近)
原代码只遍历了url_pdf列,没有关联对应行的id值,修改为按行遍历数据框即可:
# 遍历数据框每一行 for (i in seq_len(nrow(head_data))) { # 提取当前行的PDF链接和对应ID cur_url <- head_data$url_pdf[i] cur_id <- head_data$id[i] # 拼接目标存储路径:pdfs目录下,以ID为文件名,保留.pdf后缀 save_path <- file.path("pdfs", paste0(cur_id, ".pdf")) # 执行下载 download.file(cur_url, destfile = save_path, mode = "wb") # 批量下载建议加0.3-1秒的停顿,避免请求过快被网站反爬拦截 Sys.sleep(0.5) }
方案2:purrr批量迭代写法(更简洁,适合tidyverse技术栈)
如果习惯用tidyverse系列包,也可以用purrr::pwalk批量处理,代码更简洁:
library(purrr) pwalk(head_data, \(url_pdf, id) { save_path <- file.path("pdfs", paste0(id, ".pdf")) download.file(url_pdf, destfile = save_path, mode = "wb") Sys.sleep(0.5) })
优化提示
如果要避免个别链接失效导致整个下载任务中断,可以给下载语句套上异常捕获:
tryCatch( download.file(cur_url, destfile = save_path, mode = "wb"), error = function(e) message("下载失败,链接:", cur_url, ",错误:", e$message) )
内容的提问来源于stack exchange,提问作者T. C. Nobel
相关产品推荐
相关产品推荐

