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
相关产品推荐
相关产品推荐

