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

使用rvest和httr爬取Benzinga财报日历遇问题求助

如何爬取Benzinga财报日历数据?

问题背景

我使用XML包的readHTMLTable成功爬取了Yahoo财报日历:

url <- "https://finance.yahoo.com/calendar/earnings?from=2022-12-04&to=2022-12-10&day=2022-12-06"

download_table <- function(url) {
  url_file <- GET(url)
  web_page_parsed <- htmlParse(url_file)
  tables <- readHTMLTable(web_page_parsed)
}

url_file <- GET(url)
web_page_parsed <- htmlParse(url_file)
tables <- readHTMLTable(web_page_parsed)
print(head(tables))

但将代码修改为爬取Benzinga财报日历(链接:https://www.benzinga.com/calendars/earnings)时:

url <- "https://www.benzinga.com/calendars/earnings"

download_table <- function(url) {
  url_file <- GET(url)
  web_page_parsed <- htmlParse(url_file)
  tables <- readHTMLTable(web_page_parsed)
}

url_file <- GET(url)
web_page_parsed <- htmlParse(url_file)
tables <- readHTMLTable(web_page_parsed)
print(head(tables))
tables$`NULL`

仅得到无效结果,只能提取表头,页面源码中也找不到股票代码等实际数据:

> print(head(tables))
$`NULL`
  Date time ticker Quarter Prior EPS Est EPS Actual EPS EPS Surprise
1 Date time ticker Quarter Prior EPS Est EPS Actual EPS EPS Surprise
  Prior Rev Est Rev Actual Rev Rev Surprise Get Alert
1 Prior Rev Est Rev Actual Rev Rev Surprise Get Alert

$`NULL`
  V1   V2   V3   V4   V5   V6   V7   V8   V9  V10  V11  V12  V13
1                                                               
2    &lt;NA&gt; &lt;NA&gt; &lt;NA&gt; &lt;NA&gt; &lt;NA&gt; &lt;NA&gt; &lt;NA&gt; &lt;NA&gt; &lt;NA&gt; &lt;NA&gt; &lt;NA&gt; &lt;NA&gt; &lt;NA&gt;

> tables$`NULL`
  Date time ticker Quarter Prior EPS Est EPS Actual EPS EPS Surprise
1 Date time ticker Quarter Prior EPS Est EPS Actual EPS EPS Surprise
  Prior Rev Est Rev Actual Rev Rev Surprise Get Alert
1 Prior Rev Est Rev Actual Rev Rev Surprise Get Alert
> 

解决方案

Benzinga的财报日历数据是通过JavaScript动态渲染的,直接请求静态HTML无法获取实际内容,以下两种方法可以解决:

方法1:使用RSelenium模拟浏览器加载页面

通过模拟真实浏览器的行为,等待页面完全渲染后提取数据:

# 安装依赖包
install.packages(c("RSelenium", "rvest"))
library(RSelenium)
library(rvest)

# 启动Chrome浏览器会话(需确保ChromeDriver已正确配置)
driver <- rsDriver(browser = "chrome", port = 4567L)
remDr <- driver[["client"]]

# 访问目标页面
remDr$navigate("https://www.benzinga.com/calendars/earnings")

# 等待页面加载完成(根据网络情况调整等待时间)
Sys.sleep(5)

# 获取渲染后的页面源码并解析
page_source <- remDr$getPageSource()[[1]]
page <- read_html(page_source)

# 提取表格数据(需根据页面实际HTML结构调整CSS选择器)
earnings_table <- page %>%
  html_element("table") %>%
  html_table()

# 查看结果
head(earnings_table)

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

方法2:直接调用Benzinga的API接口

通过浏览器开发者工具找到后台API接口,直接请求JSON格式的数据:

  1. 打开浏览器开发者工具(F12),切换到「Network」标签
  2. 刷新页面,筛选「XHR/fetch」请求,找到返回财报数据的API端点
  3. 复制请求URL和必要的请求头(如User-Agent)

示例代码:

# 安装依赖包
install.packages(c("httr", "jsonlite"))
library(httr)
library(jsonlite)

# 替换为实际找到的API接口URL
api_url <- "https://api.benzinga.com/api/v2/calendars/earnings"

# 设置请求头,模拟浏览器请求
headers <- add_headers(
  "User-Agent" = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"
)

# 发送请求并解析JSON数据
response <- GET(api_url, headers)
data <- fromJSON(content(response, "text"))

# 转换为数据框
earnings_df <- as.data.frame(data$results)

# 查看结果
head(earnings_df)

注意事项

  • API接口可能随网站更新而变化,需定期验证接口有效性
  • 部分API需要开发者密钥,需注册Benzinga开发者账号获取
  • 遵守网站的robots.txt规则和使用条款,避免高频请求导致IP被封禁

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 12:20:36