You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用rvest进行网页抓取:提取图标内嵌链接并下载PDF文件

批量抓取网页中PDF图标对应的链接并自动下载

嗨,我来帮你搞定这个批量处理PDF抓取的需求!结合你已经有的单个下载代码,我们可以用R的rvestpurrr工具链来实现自动化,下面是完整的解决方案:

一、核心思路

  1. 定位PDF链接:通过网页的CSS选择器识别所有指向PDF文档的链接(对应你说的点击图标打开的PDF)
  2. 批量提取链接:把相对路径转换为绝对URL,避免下载失败
  3. 自动化下载:遍历所有链接,自动保存到指定目录,同时处理可能的错误

二、完整代码实现

首先确保安装并加载所需的包:

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

火山引擎 最新活动