如何使用RSelenium向下滚动页面,直至加载全部新记录的页面完全加载
RSelenium实现页面全量滚动加载的方案
实现逻辑
- 采用循环滚动检测机制:每次将页面滚动至可视区域最底端,预留动态加载等待时间,记录当前页面已加载的内容总量
- 重复执行滚动操作,当连续两次滚动后,已加载的内容数量没有发生变化时,判定页面已加载完全部记录,终止循环
适配原有脚本的完整可运行代码
library(RSelenium) rD <- RSelenium::rsDriver(browser = "firefox", check = FALSE) remDr <- rD[["client"]] # 原有页面操作流程 remDr$navigate("https://investmentpolicy.unctad.org/international-investment-agreements") remDr$findElement("link text", "Advanced Search")$clickElement() remDr$findElement("id", "search-button")$clickElement() # 新增全量滚动加载逻辑 last_loaded_count <- 0 load_wait_time <- 3 while (TRUE) { # 全局滚动到页面最底部 remDr$executeScript("window.scrollTo(0, document.body.scrollHeight);") # 等待页面动态加载新内容 Sys.sleep(load_wait_time) # 统计当前已加载的表格记录数,可根据实际页面DOM结构调整CSS选择器 loaded_rows <- remDr$findElements("css", "table tbody tr") current_loaded_count <- length(loaded_rows) # 连续两次加载数量无变化,说明已无新内容可加载 if (current_loaded_count == last_loaded_count) { message("页面已加载全部记录,总条数:", current_loaded_count) break } last_loaded_count <- current_loaded_count message("当前已加载记录数:", current_loaded_count) }
实操注意点
- 优先用实际条目数判断加载完成状态,相比通过页面总高度变化判断的方式,这种逻辑不会受页面悬浮元素、固定导航栏影响,准确率更高
- 加载等待时间可根据自身网络条件调整,网络较慢时可适当增大
load_wait_time的数值,避免新内容还没渲染完成就触发结束判定 - 如果列表区域是独立的固定高度滚动容器、而非绑定在全局页面滚动条上,需要调整滚动JS逻辑,定位到对应容器元素后执行容器内部的滚动操作,而非使用全局
window.scrollTo
内容的提问来源于stack exchange,提问作者Mohamed
相关产品推荐
相关产品推荐

