使用R爬取Forex Factory日历数据与网页显示不一致问题排查
问题分析与解决方案
核心问题根源
- 时区不匹配:Forex Factory通过Cookie识别用户时区并动态渲染时间,
read_html默认发送的请求不带时区Cookie,因此爬取到的是服务器默认时区(通常为UTC)的时间,而非你设置的Europe/Madrid时区。 - 未清理冗余文本:爬取的原始文本包含大量换行(
\n)和空格,导致输出格式混乱、内容错位。 - 静态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
相关产品推荐
相关产品推荐

