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

自学R网页爬取:如何批量下载HTML页面中的多个PDF文件?

解决方案:批量下载目标页面的PDF文件

问题根源

你复用的代码是针对GitHub仓库的PDF链接结构(需要跳转至raw-url获取真实下载地址),但目标网站的PDF是直接在详情页提供下载链接,不需要额外跳转,所以原代码逻辑不适用。

分步实现代码

以下是适配目标网站结构的完整代码,每一步都做了注释:

# 加载所需包
library(rvest)
library(purrr)
library(stringr)

# 1. 获取目标页面的HTML内容
base_url <- "https://osse.dc.gov/page/2022-23-lea-continuous-education-plans"
main_page <- read_html(base_url)

# 2. 提取所有详情页链接(过滤出指向LEA计划的链接,排除导航/无关链接)
detail_links <- main_page %>%
  html_elements("a") %>%  # 抓取页面所有<a>标签
  html_attr("href") %>%   # 提取链接地址
  str_subset("/node/") %>%  # 目标详情页链接都包含/node/,以此过滤
  str_c("https://osse.dc.gov", .)  # 拼接成完整URL

# 3. 遍历每个详情页,提取PDF下载链接
pdf_links <- map_chr(detail_links, function(link) {
  # 读取详情页HTML
  detail_page <- read_html(link)
  # 抓取页面中的PDF链接(过滤带.pdf的地址)
  pdf_href <- detail_page %>%
    html_elements("a") %>%
    html_attr("href") %>%
    str_subset("\\.pdf") %>%
    first()  # 每个详情页只有一个PDF,取第一个结果
  # 拼接完整PDF下载URL
  str_c("https://osse.dc.gov", pdf_href)
})

# 4. 批量下载PDF到本地(当前工作目录)
walk2(pdf_links, basename(pdf_links), function(url, filename) {
  download.file(url, destfile = filename, mode = "wb")
  cat("已下载:", filename, "\n")  # 打印下载进度
})

关键注意事项

  • 页面结构验证:使用浏览器F12开发者工具,查看元素的class/id或链接特征(比如目标详情页链接都包含/node/),这是爬取静态页面的核心技巧。
  • 异常处理:如果部分详情页没有PDF,可在map_chr中加入tryCatch避免报错中断,比如:
    pdf_href <- tryCatch({
      detail_page %>% html_elements("a") %>% html_attr("href") %>% str_subset("\\.pdf") %>% first()
    }, error = function(e) NA)
    
  • 动态内容处理:如果后续遇到需要点击加载的动态内容,再考虑用RSelenium,当前目标网站是静态渲染,rvest完全够用。

实用学习建议

  • 先掌握rvest核心函数:read_html()、html_elements()、html_attr(),这三个是静态页面爬取的基础。
  • 练习用浏览器开发者工具分析页面结构,学会定位目标元素的CSS选择器或XPath。

内容的提问来源于stack exchange,提问作者Nick D

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 14:45:33