使用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
相关产品推荐
相关产品推荐

