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

R语言html_table()仅返回100行数据,爬取雅虎财经历史股价遇阻

问题原因与解决方案

为什么只拿到100行数据?

  • Yahoo Finance的历史数据表格采用**懒加载(动态渲染)**机制:页面初始加载时仅显示最近100条记录,剩余数据需要用户滚动页面或点击「Show more」按钮,通过AJAX请求动态加载到页面中。
  • rvest::html_table()只能解析页面初始加载的静态HTML内容,无法获取JavaScript动态生成的后续数据。

解决办法

方案1:使用专门的Yahoo Finance API包(推荐)

直接调用官方API接口获取数据,比网页抓取更稳定高效,无需处理动态加载问题。可以用R的yfinance包:

library(yfinance)

# 提取BAC过去5年的日度历史数据
bac_data <- yf_get(
  tickers = "BAC",
  start = Sys.Date() - 365*5,  # 起始日期:5年前
  end = Sys.Date(),            # 结束日期:今天
  interval = "1d"              # 日度数据
)

方案2:模拟浏览器动态加载数据(网页抓取方式)

如果必须通过网页抓取,需要用浏览器自动化工具模拟用户操作,触发所有数据加载后再提取表格。这里用RSelenium为例:

library(RSelenium)
library(rvest)
library(dplyr)

# 启动Chrome浏览器驱动(需提前安装ChromeDriver并配置环境变量)
driver <- rsDriver(browser = "chrome", port = 4567L)
remDr <- driver$client

# 打开目标页面
url <- "https://finance.yahoo.com/quote/BAC/history?period1=1540512000&period2=1698278400&interval=1d&filter=history&frequency=1d&includeAdjustedClose=true"
remDr$navigate(url)

# 循环滚动页面+点击加载更多,直到所有数据加载完成
repeat {
  # 滚动到页面底部
  remDr$executeScript("window.scrollTo(0, document.body.scrollHeight);")
  Sys.sleep(2)  # 等待加载
  
  # 检查是否存在「Show more」按钮,存在则点击,不存在则退出循环
  show_more_btn <- tryCatch(
    remDr$findElement(using = "xpath", "//button[contains(text(), 'Show more')]"),
    error = function(e) NULL
  )
  if (is.null(show_more_btn)) break
  show_more_btn$clickElement()
  Sys.sleep(2)
}

# 提取加载完成后的表格数据
page_html <- read_html(remDr$getPageSource()[[1]])
full_data <- page_html %>% html_table(fill = TRUE)

# 关闭浏览器
remDr$close()
driver$server$stop()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 13:33:20