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

如何循环从DataFrame的URL列下载PDF并跳过无效链接?

批量下载PDF并处理无效链接的R实现

需求说明

现有名为df的DataFrame,包含Name、Ticker、URL三列,需要:

  • 从URL列下载对应的PDF文件
  • 文件命名格式为Name_Ticker.pdf(例如Cran_CAR.pdf)
  • 自动跳过无效、无法访问的链接以及NA值的URL

用户现有单文件下载代码:

require(XML)
url <- ('https://cran.r-project.org/doc/manuals/R-intro.pdf')
download.file(url, 'Cran_CRA.pdf', mode="wb")

提供的DataFrame结构:

structure(list(Name = c("Cran", "Beginners", "Split"), Ticker = c("CAR", 
"BEG", "SPL"), URL = c("https://cran.r-project.org/doc/manuals/R-intro.pdf", 
"https://cran.r-project.org/doc/contrib/Paradis-rdebuts_en.pdf", 
"https://cran.r-project.org/web/packages/SPlit/SPlit.pdf")), class = "data.frame", row.names = c(NA, 
-3L))

实际DataFrame的head()结果:

Name                     Ticker URL                     
  <chr>                    <chr>  <chr>                   
1 Dash 2 Trade             D2T    https://dash2trade.com/assets/documents/Whitepaper.pdf
2 Calvaira                 RIA    https://whitepaper.calvaria.io/?utm_source=coincodex&utm_medium=referral
3 Flow                     FLOW   https://www.onflow.org/technical-paper?utm_source=coincodex&utm_medium=referral
4 Cosmos                   ATOM   https://cosmos.network/resources/whitepaper?utm_source=coincodex&utm_medium=referral
5 CUDOS Token              CUDOS  NA                      
6 P2P solutions foundation P2PS   https://www.p2psf.org//wp-content/uploads/2017/12/P2PS_Whitepaper_V1.1_English.pdf?utm_source=coincodex&utm_medium=referral

解决方案代码

# 加载必要包
require(httr)

# 过滤掉URL为NA的行
df_valid <- df[!is.na(df$URL), ]

# 循环处理每一行
for (i in 1:nrow(df_valid)) {
  name <- df_valid$Name[i]
  ticker <- df_valid$Ticker[i]
  url <- df_valid$URL[i]
  filename <- paste0(name, "_", ticker, ".pdf")
  
  # 检查链接有效性并下载
  tryCatch({
    resp <- HEAD(url)
    # 验证HTTP状态码及内容类型
    if (status_code(resp) == 200 && grepl("application/pdf", headers(resp)$`content-type`)) {
      download.file(url, filename, mode = "wb", quiet = TRUE)
      cat("成功下载:", filename, "\n")
    } else {
      cat("跳过无效PDF链接:", url, "\n")
    }
  }, error = function(e) {
    cat("链接访问失败,跳过:", url, "\n")
  })
}

代码说明

  • 过滤无效行:先移除URL列值为NA的行,避免无意义的循环操作
  • 高效链接检查:使用httr::HEAD()仅请求链接头部信息,不下载完整内容,提升处理效率
    • 校验HTTP状态码为200(请求成功)
    • 确认返回内容类型为application/pdf,确保目标文件是PDF格式
  • 异常捕获:通过tryCatch()处理链接超时、无法访问等异常,避免循环中断
  • 命名规则:用paste0()拼接Name与Ticker,生成指定格式的文件名
  • 下载配置:mode="wb"保证二进制文件下载完整性,quiet=TRUE减少冗余输出

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 12:17:53