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

使用R代码从指定网站自动下载PDF时未检测到链接的问题

解决R语言爬取https://register.awmf.org/de/start页面PDF无结果的问题

问题根源分析

你的代码没找到PDF链接主要有两个核心问题:

  • Base URL配置错误:代码里的base_url写的是https://example.com,并非目标网站域名,就算找到相对路径的PDF链接也无法拼接成有效URL
  • 首页无直接PDF链接:目标网站的PDF文件并不直接在首页的<a>标签里,首页链接都是子页面入口,PDF藏在子页面中,部分内容还可能是JavaScript动态加载的

修复后的基础静态爬取代码

先修正Base URL,同时增加爬取子页面的逻辑,先获取首页的子页面链接,再逐个进入子页面提取PDF:

library(rvest)
library(stringr)
library(downloader)

# 1. 配置正确的URL
main_page_url <- "https://register.awmf.org/de/start"
base_url <- "https://register.awmf.org" # 修正为目标网站的base URL

# 2. 读取首页内容
webpage <- tryCatch({
  read_html(main_page_url)
}, error = function(e) {
  cat("读取首页失败:", e$message, "\n")
  return(NULL)
})

if (is.null(webpage)) stop("无法访问首页,程序退出")

# 3. 提取首页的子页面链接(排除无效链接)
cat("提取子页面链接...\n")
subpage_links <- webpage %>%
  html_elements("a") %>%
  html_attr("href") %>%
  na.omit() %>%
  # 筛选可能包含内容的子页面链接,排除跳转至首页、登录页等无效链接
  str_subset("^/de/register/|^/de/leitlinien/") %>%
  # 拼接成完整URL
  sapply(function(link) {
    if (str_starts(link, "http")) link else paste0(base_url, link)
  })

# 4. 遍历子页面提取PDF链接
full_pdf_urls <- c()
for (sub_url in subpage_links) {
  cat("正在爬取子页面:", sub_url, "\n")
  sub_webpage <- tryCatch({
    read_html(sub_url)
  }, error = function(e) {
    cat("爬取子页面失败:", e$message, "\n")
    return(NULL)
  })
  
  if (!is.null(sub_webpage)) {
    # 提取子页面中的PDF链接
    pdf_links <- sub_webpage %>%
      html_elements("a") %>%
      html_attr("href") %>%
      na.omit() %>%
      str_subset("\\.pdf$") %>%
      sapply(function(link) {
        if (str_starts(link, "http")) link else paste0(base_url, link)
      })
    full_pdf_urls <- c(full_pdf_urls, pdf_links)
  }
}

# 去重PDF链接
full_pdf_urls <- unique(full_pdf_urls)

# 5. 下载PDF
if (length(full_pdf_urls) == 0) {
  cat("未找到任何PDF链接。\n")
} else {
  cat("找到", length(full_pdf_urls), "个PDF链接。\n")
  
  download_dir <- "downloaded_pdfs"
  if (!dir.exists(download_dir)) dir.create(download_dir)
  
  for (url in full_pdf_urls) {
    filename <- basename(url)
    destination_path <- file.path(download_dir, filename)
    
    cat("正在下载:", url, "到", destination_path, "\n")
    tryCatch({
      download(url, destination_path, mode = "wb")
      cat("  下载成功:", filename, "\n")
    }, error = function(e) {
      cat("  下载失败", filename, ":", e$message, "\n")
    })
  }
  cat("\n所有PDF下载尝试完成。\n")
}

处理动态加载内容的补充方案

如果上述代码还是无法找到PDF,说明部分内容是JavaScript动态渲染的,这时候需要用RSelenium模拟浏览器加载页面:

  • 安装RSelenium:install.packages("RSelenium")
  • 启动浏览器驱动(比如ChromeDriver),模拟访问页面后再提取内容,确保能获取到动态加载的链接

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 22:43:11