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

RSelenium无法滚动到页面底部问题求助

修复动态滚动加载数据的问题

针对你用RSelenium抓取Yahoo财经道指历史数据时滚动加载失效的问题,可从以下几个方向修复:

1. 滚动到表格容器底部而非页面整体底部

Yahoo财经的历史数据表格放在特定容器内,直接滚动页面底部可能无法触发表格的加载逻辑。可以定位到表格元素,滚动到表格的最后一行:

for (i in 1:40){
  # 定位历史数据表格的最后一行
  last_row <- rd$findElement(using = 'css selector', value = 'table[data-test="historical-prices"] tr:last-child')
  # 滚动到最后一行的位置
  rd$executeScript("arguments[0].scrollIntoView();", list(last_row))
  Sys.sleep(2)
}

2. 使用显式等待替代固定休眠

固定休眠时间不稳定,改用显式等待,等待新的数据行加载完成后再继续滚动,能更精准地触发加载:

library(RSelenium)
library(netstat)
library(tidyverse)

remote_driver <- rsDriver(browser = 'firefox', verbose= FALSE, port = free_port())
rd <- remote_driver$client
rd$open()
rd$navigate('https://finance.yahoo.com/quote/%5EDJI/history?period1=915408000&period2=1396396800&interval=1d&filter=history&frequency=1d&includeAdjustedClose=true')
rd$maxWindowSize()

# 初始获取行数
prev_row_count <- length(rd$findElements(using = 'css selector', value = 'table[data-test="historical-prices"] tr'))

for (i in 1:40){
  # 滚动到表格底部
  rd$executeScript("document.querySelector('table[data-test=\"historical-prices\"]').scrollTop = document.querySelector('table[data-test=\"historical-prices\"]').scrollHeight;")
  # 等待新行加载,最多等待5秒
  wait_result <- rd$waitFor(
    function(){
      current_row_count <- length(rd$findElements(using = 'css selector', value = 'table[data-test=\"historical-prices\"] tr'))
      current_row_count > prev_row_count
    },
    timeout = 5000
  )
  # 更新行数
  prev_row_count <- length(rd$findElements(using = 'css selector', value = 'table[data-test=\"historical-prices\"] tr'))
}

3. 处理加载状态

Yahoo财经加载数据时会有加载图标,可等待加载图标消失后再继续操作:

for (i in 1:40){
  rd$executeScript("document.querySelector('table[data-test=\"historical-prices\"]').scrollTop = document.querySelector('table[data-test=\"historical-prices\"]').scrollHeight;")
  # 等待加载图标消失(实际选择器需根据页面调整,示例为常见加载类名)
  rd$waitForElementNotPresent(using = 'css selector', value = '.loading-spinner', timeout = 5000)
}

额外提示

  • 检查页面是否有隐私条款弹窗,若有需先添加点击同意的代码:
    # 等待同意按钮出现并点击
    rd$waitForElementPresent(using = 'css selector', value = 'button[value="agree"]', timeout = 10000)
    rd$findElement(using = 'css selector', value = 'button[value="agree"]')$clickElement()
    
  • 若40次滚动仍未加载完所有数据,可根据页面显示的总数据量动态调整循环次数,避免无效滚动。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 20:06:23