如何使用R从动态URL提取信息?解决rvest提取失败问题
问题原因
Yahoo财经的财报日历页面是JavaScript动态渲染的。read_html()只能获取服务器返回的初始静态HTML,而你在浏览器检查元素中看到的内容是浏览器执行JS后生成的DOM结构,两者不一致,所以直接爬取实时URL时找不到目标元素。
解决方案
方案1:用RSelenium模拟浏览器渲染页面
RSelenium可以模拟真实浏览器加载页面,等待JS执行完成后再获取完整的DOM内容,这样就能正常提取数据。
library(RSelenium) library(rvest) library(tidyverse) # 启动Chrome浏览器驱动(需提前安装对应版本的ChromeDriver) driver <- rsDriver(browser = "chrome", chromever = "匹配你的Chrome版本号") remDr <- driver[["client"]] # 访问目标页面 url_live <- "https://finance.yahoo.com/calendar/earnings?from=2023-07-30&to=2023-08-05&day=2023-08-03" remDr$navigate(url_live) # 等待页面加载完成(根据网络情况调整等待时间) Sys.sleep(3) # 获取渲染后的完整HTML page_source <- remDr$getPageSource()[[1]] webpage <- read_html(page_source) # 提取目标数值 value <- webpage %>% html_node(xpath = '//span[contains(@class, "Mstart") and contains(@class, "Fw") and contains(@class, "Fz")]/span') %>% html_text() numeric_value <- as.numeric(str_extract(value, "\\d+(?= results)")) print(numeric_value) # 关闭浏览器和驱动 remDr$close() driver$server$stop()
方案2:直接请求后端API接口(更高效)
动态页面通常会通过AJAX请求后端API获取数据,你可以在浏览器开发者工具的「Network」标签中找到对应接口,直接请求接口获取数据,无需渲染页面。
library(httr) library(jsonlite) library(tidyverse) # 替换为从浏览器中获取的有效API链接(需包含合法的crumb和Cookie参数) api_url <- "https://query1.finance.yahoo.com/v7/finance/calendar/earnings?formatted=true&crumb=你的crumb值&day=2023-08-03&from=2023-07-30&to=2023-08-05&lang=en-US®ion=US&corsDomain=finance.yahoo.com" # 发送请求,需携带浏览器的User-Agent和Cookie response <- GET(api_url, add_headers( "User-Agent" = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36", "Cookie" = "你的浏览器Cookie内容" )) # 解析JSON数据,直接获取总结果数 data <- fromJSON(content(response, "text")) total_results <- data$calendar$earnings$meta$total print(total_results)
注意:Yahoo会验证
crumb和Cookie参数,需要从浏览器访问页面时实时获取,且参数可能定期失效。
内容的提问来源于stack exchange,提问作者user22322433
相关产品推荐
相关产品推荐

