使用rvest进行网页抓取:提取图标内嵌链接并下载PDF文件
批量抓取网页中PDF图标对应的链接并自动下载
嗨,我来帮你搞定这个批量处理PDF抓取的需求!结合你已经有的单个下载代码,我们可以用R的rvest和purrr工具链来实现自动化,下面是完整的解决方案:
一、核心思路
- 定位PDF链接:通过网页的CSS选择器识别所有指向PDF文档的链接(对应你说的点击图标打开的PDF)
- 批量提取链接:把相对路径转换为绝对URL,避免下载失败
- 自动化下载:遍历所有链接,自动保存到指定目录,同时处理可能的错误
二、完整代码实现
首先确保安装并加载所需的包:
install.packages(c("rvest", "httr", "purrr")) library(rvest) library(httr) library(purrr)
1. 编写获取PDF链接的函数
这个函数会自动抓取目标网页中所有PDF相关的链接,你可以根据目标网页的结构调整CSS选择器:
get_pdf_links <- function(page_url) { # 设置浏览器UA,避免被网站反爬拦截 user_agent_str <- "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" # 读取网页内容 page <- read_html(page_url, user_agent = user_agent_str) # 提取PDF链接:这里用通用选择器(href以.pdf结尾的a标签) # 如果目标网页的PDF图标有特定标识,比如img的alt包含"PDF",可以换成:"a:has(img[alt*='PDF'])" pdf_links <- page %>% html_elements("a[href$='.pdf']") %>% html_attr("href") %>% # 把相对链接转换为绝对URL(关键!不然可能下载失败) url_absolute(page_url) return(pdf_links) }
2. 编写批量下载函数
这个函数会把所有PDF保存到指定文件夹,还包含错误处理,避免单个链接失败导致整个流程中断:
batch_download_pdfs <- function(pdf_links, save_dir = "downloaded_pdfs") { # 创建保存目录(如果不存在) if (!dir.exists(save_dir)) { dir.create(save_dir, recursive = TRUE) } # 遍历所有链接下载 walk(pdf_links, function(link) { tryCatch({ # 从链接中提取文件名 file_name <- basename(link) save_path <- file.path(save_dir, file_name) # 下载PDF(mode="wb"是二进制文件下载的关键,必须加!) download.file(link, save_path, mode = "wb", quiet = FALSE) cat("✅ 已成功下载:", file_name, "\n") }, error = function(e) { cat("❌ 下载失败:", link, ",错误信息:", e$message, "\n") }) }) }
3. 调用函数执行任务
只需要替换成你的目标网页URL,剩下的交给代码:
# 替换成你要处理的目标网页URL target_page <- "https://example.com/your-target-page" # 获取所有PDF链接 pdf_links <- get_pdf_links(target_page) cat("共找到", length(pdf_links), "个PDF链接\n") # 批量下载 batch_download_pdfs(pdf_links)
三、特殊情况处理
如果你的目标网页是动态渲染的(比如需要滚动或点击才加载PDF图标),静态的rvest可能抓不到链接,这时候可以用playwright包(R版本)来模拟浏览器行为:
install.packages("playwright") library(playwright) # 初始化浏览器(无头模式,不弹出窗口) pw <- playwright$chromium$launch(headless = TRUE) page <- pw$new_page() # 访问目标网页 page$goto(target_page, wait_until = "networkidle") # 提取PDF链接(同样可以调整选择器) pdf_links <- page$eval_handle("document.querySelectorAll('a[href$=\".pdf\"]')")$evaluate_all("el => el.href") # 关闭浏览器 pw$close() # 然后继续用上面的batch_download_pdfs函数下载
内容的提问来源于stack exchange,提问作者Carolin




