R语言rvest爬取动态网页仅获部分内容的解决方法咨询
问题原因
rvest 本身不具备JavaScript执行能力,你调用read_html()拿到的只是服务器首次返回的静态HTML骨架,页面加载后通过JS/jQuery异步拉取填充的赛事数据,根本不在初始响应内容里,因此直接XPath匹配span标签只能拿到静态部分的文本,拿不到动态渲染的赛事名称。
可行解决方案
方案1:直接抓取数据接口(优先推荐,效率最高)
博彩类站点的动态赛事数据都是通过后端接口拉取的JSON格式数据,不需要解析HTML,稳定性更高:
- 打开目标页面,按F12调出浏览器开发者工具,切换到「网络」面板,筛选
XHR/ Fetch类型的请求 - 刷新页面,逐个查看请求的响应内容,定位到返回赛事列表的接口
- 直接用
httr包构造请求调用该接口,再用jsonlite包解析返回的JSON数据,就能直接拿到结构化的赛事名称等信息,不受前端页面结构变动影响。
方案2:调用带JS渲染能力的工具抓取
如果接口有加密、签名校验难以复现,可以通过工具驱动真实浏览器加载页面,等JS执行完成、数据全部渲染后再提取内容:
常用的R端实现是chromote包,它可以直接调用本地安装的Chrome/Edge内核完成页面渲染,最简实现代码如下:
library(chromote) library(rvest) library(dplyr) # 启动浏览器会话 chrome_session <- ChromoteSession$new() # 跳转至目标页面 chrome_session$Page$navigate("https://www.supermatch.com.uy/live#/5009370062") # 等待页面完成JS加载、数据渲染,可根据网络情况调整等待时长 Sys.sleep(5) # 提取渲染完成后的完整HTML源码 rendered_html <- chrome_session$Runtime$evaluate( "document.documentElement.outerHTML" )$result$value # 后续解析逻辑和原rvest写法一致 page <- read_html(rendered_html) event_names <- page %>% html_nodes(xpath = "//span") %>% html_text() # 操作完成后关闭浏览器会话 chrome_session$close()
注意事项
- 爬取前请确认目标站点的服务条款与爬取相关规则,控制请求频率,避免对站点正常服务造成影响
- 若使用浏览器渲染方案,不建议写死等待时长,可以增加DOM节点存在性判断,等目标赛事对应的span标签加载完成后再提取内容,避免网络波动导致抓取不全。
内容的提问来源于stack exchange,提问作者Emiliano Barone
相关产品推荐
相关产品推荐

