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

如何使用R从文档搜索网页批量下载PDF并解决爬取报错?

批量爬取CanLII搜索结果PDF的问题定位与修复方案

现有代码的核心问题

你运行代码触发Error: scheme not supported in URL 'NA'报错,本质是4个逻辑漏洞叠加导致的:

  • 抓取逻辑不匹配页面特性:目标搜索页是前端JS渲染的单页应用,所有搜索结果都是页面加载完成后通过异步请求动态插入DOM的。直接用read_html读取静态源码,根本无法获取到包含PDF链接的搜索结果节点,后续匹配到的链接值全为NA,直接传入下载函数就会触发报错。
  • URL拼接规则完全错误:所有路径拼接都硬绑定了搜索页的固定路径片段,就算能抓取到PDF的相对路径,拼出来的地址也完全不符合网站的URL规则,即便没有空值也会访问失败。
  • 管道调用链路断裂:原代码在路径拼接完成后没有接续管道符%>%,直接把后续数据处理的返回值赋值给了raw_list,整个处理流程的逻辑完全错位。
  • 缺少前置校验:没有对抓取到的链接集合做空值、有效性检查,碰到NA值就直接调用下载函数,没有提前拦截异常。

可实现目标的修复方案

完全可以实现自动抓取搜索结果前10个PDF、本地按pdf1.pdf到pdf10.pdf命名存储的需求,调整后的可运行参考代码如下:

# 加载依赖工具包
library(tidyverse)
library(rvest)
library(stringr)
library(selenium)

# 启动支持JS渲染的浏览器服务,打开目标搜索页
driver <- chrome()
driver$navigate("https://www.canlii.org/en/#search/type=decision&text=dog%20toronto")
# 预留页面加载等待时间,确保异步请求返回的搜索结果完全渲染
Sys.sleep(6)

# 抓取渲染完成页面中的所有PDF链接
page_source <- read_html(driver$page_source)
pdf_url_list <- page_source %>%
  # 直接匹配所有href属性包含.pdf后缀的链接节点
  html_nodes("a[href*='.pdf']") %>%
  html_attr("href") %>%
  # 将相对路径拼接为完整可访问的URL
  str_replace("^/", "https://www.canlii.org/") %>%
  # 去除重复链接、空值,取前10个目标文档
  na.omit() %>%
  unique() %>%
  head(10)

# 批量下载文件,按指定规则命名
walk2(
  .x = pdf_url_list,
  .y = str_c("pdf", 1:10, ".pdf"),
  ~download.file(url = .x, destfile = .y, mode = "wb")
)

# 关闭浏览器服务,释放资源
driver$close()

运行注意事项

  • 不要使用纯静态rvest逻辑抓取这个搜索页,必须通过JS渲染工具获取动态加载的DOM节点,否则永远拿不到目标链接
  • 如果抓取到的链接数量不足10个,可适当延长页面等待时间,或调整节点选择器匹配规则
  • 下载过程中可适当增加请求间隔,避免触发网站的反爬拦截
  • 文件名完全按自定义规则生成,不需要依赖网站返回的原始文件名,匹配你要求的命名格式

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.26 05:45:05