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

