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

