You need to enable JavaScript to run this app. Rvest爬取网页返回空表格问题:如何判断目标表格是否为JS动态加载
优惠活动
大模型
产品
解决方案
定价
更多

Rvest爬取网页返回空表格问题:如何判断目标表格是否为JS动态加载

动态表格爬取排查与解决思路

验证是否为动态加载的方法

  • 禁用浏览器JavaScript测试:打开Chrome访问目标页面,按F12调出开发者工具,点击右上角设置图标,在「Debugger」分类下勾选「禁用JavaScript」,刷新页面后如果表格区域消失或无数据,即可确认内容为JS动态渲染生成,静态HTTP请求只能拿到初始HTML骨架,无法获取渲染后的表格节点。
  • 对比静态源码与渲染后源码:右键页面点击「查看网页源代码」,在源码中搜索表格内的任意文本、或你之前用到的表格id __BVID__78,如果搜索不到对应内容,即可证明表格是JS运行后才插入DOM结构的,rvest、httr这类仅发送静态请求的工具无法直接抓取。

当前代码失效的核心原因

你从Chrome开发者工具复制的XPath、表格id都是JS渲染完成后生成的属性:

  1. __BVID__78属于前端框架自动生成的随机id,每次页面加载都可能变化,本身不具备定位稳定性;
  2. 静态请求返回的初始HTML中不存在对应的表格节点,直接用选择器定位必然返回空结果。

可行的解决思路

方法1:抓取后台数据接口(优先推荐)

动态表格的数据几乎都是前端调用后台接口获取JSON后渲染的,直接调用接口拿数据的效率远高于解析HTML:

  • 操作步骤:打开开发者工具的「网络」面板,筛选「Fetch/XHR」类型的请求,刷新页面后逐个查看请求的响应内容,找到返回表格JSON数据的接口,直接用httr模拟该请求即可拿到结构化数据,无需解析HTML。
  • 注意事项:调用接口时需携带和浏览器请求一致的User-Agent、Referer等请求头参数,避免被反爬策略拦截。

方法2:使用无头浏览器渲染页面

如果接口加密难以分析,可以使用支持模拟浏览器运行JS的工具,等待页面渲染完成后再提取节点,R生态下可使用RSelenium实现,示例代码如下:

library(RSelenium)
library(rvest)

# 启动Chrome无头驱动,chromever参数需和本地安装的Chrome版本号匹配
driver <- rsDriver(browser = "chrome", chromever = "匹配本地Chrome版本", verbose = FALSE)
remDr <- driver$client

# 访问目标页面
remDr$navigate("https://covid19.humportal.org/activities?display=table&summary=disbursements&breakdown=country")
# 等待3秒确保JS执行完成、表格渲染完毕
Sys.sleep(3)

# 获取渲染后的完整页面源码
page_source <- remDr$getPageSource()[[1]]

# 用稳定的类名组合定位表格,不要使用随机生成的动态id
table_data <- read_html(page_source) %>% 
  html_nodes("table.b-table.table-bordered") %>%
  html_table()

# 资源释放:用完记得关闭驱动
remDr$close()
driver$server$stop()

内容的提问来源于stack exchange,提问作者CT_codes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 14:54:05