如何循环从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
相关产品推荐
相关产品推荐

