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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 23:54:22