使用R语言进行网页爬虫时无法获取目标页面的可下载链接
你遇到的是前端动态渲染类网站的共性问题:这类站点的核心内容不会内置在初始HTML源码中,需要浏览器加载完成后执行JS脚本从后端拉取数据再渲染到页面,所以仅支持静态HTML解析的rvest只能抓取到初始加载的页头、页脚内容。
解决方案
方案1:使用支持JS渲染的爬取工具
推荐用chromote包,无需手动配置驱动,仅依赖本地安装的Chrome/Edge浏览器即可实现页面完整渲染,示例代码如下:
library(chromote) library(rvest) # 启动浏览器会话 b <- ChromoteSession$new() # 跳转目标页面 b$Page$navigate("https://b2share.eudat.eu/records/8d47a255ba5749e3ac169527e22f0068") # 等待页面渲染完成(可根据网络情况调整等待时长,也可替换为等待指定元素加载的逻辑,稳定性更高) Sys.sleep(2) # 获取渲染后的完整HTML源码 full_html <- b$Runtime$evaluate("document.documentElement.outerHTML")$result$value # 关闭浏览器会话 b$close() # 用rvest正常解析渲染后的内容 read_html(full_html) %>% html_nodes("a")
方案2:直接调用后端数据接口(效率更高)
这类动态站点的内容都通过统一的后端接口返回,你可以通过浏览器开发者工具抓包获取接口地址:
- 打开目标页面,按F12调出开发者工具,切换到「网络」标签,筛选「XHR/ fetch」类型的请求
- 刷新页面后即可找到拉取记录元数据的接口,返回格式为JSON,你需要的
.xlsx文件下载链接一般在返回结果的files字段中 - 直接用
httr包请求该接口解析JSON即可,无需渲染页面,速度更快、稳定性更高
如果需要批量爬取多个记录的文件,方案2的接口调用方式效率远高于页面渲染方案。
内容的提问来源于stack exchange,提问作者FrsLry
相关产品推荐
相关产品推荐

