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

使用R爬取Forex Factory日历数据与网页显示不一致问题排查

问题分析与解决方案

核心问题根源

  1. 时区不匹配:Forex Factory通过Cookie识别用户时区并动态渲染时间,read_html默认发送的请求不带时区Cookie,因此爬取到的是服务器默认时区(通常为UTC)的时间,而非你设置的Europe/Madrid时区。
  2. 未清理冗余文本:爬取的原始文本包含大量换行(\n)和空格,导致输出格式混乱、内容错位。
  3. 静态HTML限制:部分页面内容可能通过JavaScript动态加载,rvest仅能获取初始静态HTML,可能导致数据错位或缺失。

修正后的代码

步骤1:带时区Cookie请求页面

使用httr包发送带时区Cookie的请求,确保服务器返回对应Europe/Madrid时区的内容:

library(rvest)
library(httr)

# 目标URL
url <- "https://www.forexfactory.com/calendar?day=apr3.2023"

# 发送带时区Cookie的请求(Europe/Madrid对应Cookie值需与网站实际设置一致)
response <- GET(url, set_cookies(timezone = "Europe/Madrid"))
page <- read_html(response)

步骤2:清理文本并提取数据

对爬取的文本进行清理,去除冗余换行和空格:

# 提取并清理时间
time <- page %>%
  html_nodes("td.calendar__time") %>%
  html_text() %>%
  trimws()

# 提取并清理货币
currency <- page %>%
  html_nodes("td.calendar__currency") %>%
  html_text() %>%
  trimws()

# 提取并清理事件名称
event <- page %>%
  html_nodes("td.calendar__event") %>%
  html_text() %>%
  trimws()

# 提取并清理实际值
actual <- page %>%
  html_nodes("td.calendar__actual") %>%
  html_text() %>%
  trimws()

# 提取并清理预测值
forecast <- page %>%
  html_nodes("td.calendar__forecast") %>%
  html_text() %>%
  trimws()

# 提取并清理前值
previous <- page %>%
  html_nodes("td.calendar__previous") %>%
  html_text() %>%
  trimws()

# 转换日期为标准格式
date <- sub(".*day=([[:alpha:]]{3}\\d{1,2})\\.(\\d{4})", "\\1 \\2", url)
date <- as.Date(date, format = "%b%d %Y")

# 构建数据框
calendar_df <- data.frame(date, time, currency, event, actual, forecast, previous, stringsAsFactors = FALSE)

# 查看前3行结果
head(calendar_df, 3)

步骤3:处理动态加载内容(可选)

如果上述方法仍存在数据错位,说明部分内容是JS动态加载的,需使用RSelenium模拟浏览器访问:

library(RSelenium)

# 启动Chrome浏览器驱动(需提前安装对应版本的ChromeDriver)
driver <- rsDriver(browser = "chrome")
remDr <- driver[["client"]]

# 访问目标页面
remDr$navigate(url)

# 模拟手动设置时区(需根据页面实际元素结构调整选择器)
# remDr$findElement(using = "css", value = ".header__settings")$clickElement()
# remDr$findElement(using = "css", value = "[data-timezone='Europe/Madrid']")$clickElement()
# remDr$findElement(using = "css", value = ".settings__save")$clickElement()

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

# 后续提取和清理步骤同前

# 关闭驱动
remDr$close()
driver$server$stop()

验证要点

  • 确认Cookie中的timezone值正确:可通过浏览器开发者工具查看Forex Factory网站的Cookie,复制timezone的实际值替换代码中的参数。
  • 检查文本清理效果:若仍有冗余空格,可追加gsub("\\s+", " ", x)将多个空格替换为单个空格。
  • 动态加载内容需模拟浏览器行为:静态请求无法获取正确数据时,RSelenium是最可靠的解决方案。

内容的提问来源于stack exchange,提问作者Roberto Emile Tello

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 03:25:01