Rvest爬取网页表格仅返回首行其余内容全为NA该如何解决?
问题原因
目标页面的表格数据为前端动态渲染生成,rvest仅能读取首次请求返回的静态HTML源码,该源码中对应表格仅包含空的结构框架,所有持仓数据是页面加载完成后通过JavaScript异步请求后台接口后才填充到页面中的,因此直接用html_table解析只能拿到空值与大量NA。
解决方案
有两种常用的解决路径,可根据需求选择:
- 方案1:使用支持动态渲染的爬虫工具模拟浏览器加载页面,等待数据填充完成后再提取表格,这里以
chromote包为例,代码示例如下:
# 先安装依赖包 # install.packages(c("chromote", "rvest", "dplyr")) library(chromote) library(rvest) library(dplyr) # 启动浏览器实例,加载目标页面 b <- ChromoteSession$new() b$Page$navigate("https://www.viewbase.com/bitfinex_long_short_position") # 等待2秒让页面完成数据加载,可根据网络情况调整时长 Sys.sleep(2) # 获取渲染完成后的页面源码 html <- b$Runtime$evaluate('document.documentElement.outerHTML')$result$value # 关闭浏览器实例 b$close() # 用rvest正常解析表格 Longs <- read_html(html) %>% html_node(xpath='/html/body/div[1]/div[3]/div[2]/div[2]/div[2]/div/div[2]/div/div[2]/table') %>% html_table(fill=TRUE) %>% as.data.frame() # 输出结果验证 head(Longs)
注:使用chromote需要本地已安装Chrome、Edge等Chromium内核浏览器,运行时会自动调用。
- 方案2:直接抓取页面异步请求的数据接口,跳过页面渲染步骤直接拿到结构化数据。你可以通过浏览器开发者工具的「网络」面板,筛选Fetch/XHR类型的请求,找到返回持仓数据的接口,用
httr包直接发起请求解析返回的JSON数据即可,这种方法性能更高、速度更快。
内容的提问来源于stack exchange,提问作者Harry
相关产品推荐
相关产品推荐

