无法获取网页完整源码,如何用R提取目标网页PDF链接?
解决动态页面的PDF链接提取问题
我之前也踩过这个坑!这个网站的PDF链接是通过JavaScript动态渲染出来的——你在Chrome开发者工具里看到的内容,是浏览器执行页面JS后生成的最终结果,但rvest、RCurl这类工具默认只会抓取服务器返回的原始静态HTML,不会执行任何JavaScript,所以自然拿不到那些隐藏的PDF链接。
下面给你两种可行的解决方案,优先推荐第一种,操作更直观:
方法1:用RSelenium模拟真实浏览器加载
RSelenium能模拟Chrome、Firefox等浏览器的完整行为,让页面把所有动态内容都加载出来,之后再抓取源码就和你在开发者工具里看到的一样了。
步骤:
- 先安装并加载RSelenium包:
install.packages("RSelenium") library(RSelenium)
- 启动Chrome浏览器驱动(注意:你需要先下载和自己Chrome版本匹配的ChromeDriver,并且配置好环境变量,或者在启动时指定驱动路径):
# 启动Chrome驱动,端口可以自己选一个未被占用的 driver <- rsDriver(browser = "chrome", port = 4567L, chromever = "匹配你的Chrome版本号") remDr <- driver[["client"]]
- 访问目标页面,给页面留一点加载时间,确保JS执行完毕:
remDr$navigate("http://www.oabmg.org.br/examedeordem/home/index") # 等待3秒,根据网络情况可以调整时间 Sys.sleep(3)
- 获取完整的页面源码,再用rvest解析提取PDF链接:
# 获取渲染后的完整页面源码 page_source <- remDr$getPageSource()[[1]] library(rvest) page <- read_html(page_source) # 提取所有指向PDF的链接 pdf_links <- page %>% html_elements("a[href$='.pdf']") %>% html_attr("href") # 把相对链接补全成完整URL pdf_links <- paste0("http://www.oabmg.org.br", pdf_links) # 查看结果 print(pdf_links)
- 用完记得关闭浏览器和驱动,避免占用资源:
remDr$close() driver$server$stop()
方法2:用V8引擎直接执行页面JS(进阶)
如果不想依赖浏览器驱动,也可以尝试用V8引擎直接运行页面中的JavaScript代码,生成动态内容。不过这个方法需要你分析页面的JS逻辑,找到生成PDF链接的代码段,门槛稍高:
- 安装并加载V8包:
install.packages("V8") library(V8)
- 先抓取原始静态HTML,提取页面中的JS脚本:
library(httr) response <- GET("http://www.oabmg.org.br/examedeordem/home/index") html_content <- content(response, "text") # 提取页面中所有的JS脚本 js_scripts <- read_html(html_content) %>% html_elements("script") %>% html_text()
- 找到生成PDF链接的JS代码段,用V8执行并提取数据:
# 初始化V8上下文 ctx <- v8() # 把找到的目标JS代码传入上下文执行(需要你自己定位对应的脚本) ctx$eval(js_scripts[你找到的脚本索引]) # 从V8上下文中提取生成的链接数据(这一步需要分析JS变量名) pdf_links <- ctx$get("存储链接的变量名")
这个方法适合JS逻辑比较简单的场景,如果网站的JS做了混淆或者加密,就很难生效,所以还是更推荐RSelenium的方案。
注意事项:
- ChromeDriver的版本必须和你的Chrome浏览器版本完全匹配,不然会启动失败,你可以在Chrome的「关于」页面查看版本,然后去官方下载对应版本的驱动。
- 如果网站有反爬机制,可以尝试给请求添加自定义请求头,或者延长等待时间,模拟真实用户的访问节奏。
内容的提问来源于stack exchange,提问作者Felipe Alvarenga
相关产品推荐
相关产品推荐

