使用rvest爬取JHU新冠日度数据仅返回占位符的问题咨询
问题根源
这是动态渲染页面爬取的典型问题:JHU官网的新冠统计数据并未嵌入在初始静态HTML中,而是页面加载完成后由JavaScript异步请求后台数据、再渲染到对应DOM节点的。rvest的read_html()只会请求并解析初始静态HTML,不会执行页面的JS逻辑,因此只能拿到预先生成的Loading...占位符。
解决方案1:使用RSelenium模拟浏览器动态渲染
RSelenium可以调用本地浏览器驱动,模拟真实用户访问页面的行为,等待JS执行完成、数据渲染完毕后再提取节点内容,具体操作如下:
- 前置准备:
- 安装RSelenium包:运行
install.packages("RSelenium") - 下载与本地Chrome浏览器版本匹配的ChromeDriver,放置到系统可识别的路径中
- 安装RSelenium包:运行
- 参考爬取代码:
library(RSelenium) library(rvest) # 启动Chrome驱动,chromever参数替换为你下载的ChromeDriver对应版本号 driver <- rsDriver(browser = "chrome", chromever = "xxx", port = 4545L) remDr <- driver$client # 访问目标页面 remDr$navigate("https://coronavirus.jhu.edu/") # 等待页面数据渲染完成,可根据网络情况调整等待时长 Sys.sleep(3) # 获取渲染后的完整页面源码 page_source <- remDr$getPageSource()[[1]] website <- read_html(page_source) # 提取目标figure节点的统计数据 cases <- website %>% html_nodes(css = "figure") cases # 爬取完成后关闭驱动释放资源 remDr$close() driver$server$stop()
- 优化建议:如果固定等待时长仍无法拿到数据,可改用显式等待逻辑,判断目标统计数值节点完成渲染后再执行提取操作。
解决方案2:直接请求数据接口
你可以通过浏览器开发者工具的网络面板,筛选出页面请求统计数据的后端接口,直接调用接口获取结构化的JSON数据,不需要解析HTML,爬取效率更高,也不易受前端页面结构调整影响。
内容的提问来源于stack exchange,提问作者daikaku
相关产品推荐
相关产品推荐

