在R中构建自动增长数据帧实现网页爬取股票数据的增量追加
自动爬取并追加股票数据的实现方案
1. 封装单次爬取逻辑为可复用函数
将你已完成的单次爬取、数据清洗逻辑打包成独立函数,同时增加异常捕获逻辑,避免单次爬取失败导致整个脚本终止,同时新增爬取时间戳字段方便后续数据溯源。
library(tidyverse) library(rvest) # 封装单次爬取西班牙35指数成分股涨跌幅的函数 fetch_spain35_pct <- function() { tryCatch({ web <- read_html("https://uk.investing.com/indices/spain-35-components") tables <- web %>% html_table() res <- tables[[2]] %>% select(where(~sum(!is.na(.x)) > 0)) %>% rename(Var_pct = `Chg. %`) %>% select(-High, -Low, -Chg., -Vol., -Last, -Time) %>% pivot_wider(names_from = Name, values_from = Var_pct) %>% # 新增爬取时间戳,作为每行数据的时间标识 mutate(fetch_time = Sys.time(), .before = 1) return(res) }, error = function(e) { message("本次爬取失败:", e$message) return(NULL) }) }
2. 数据追加逻辑实现
使用tidyverse提供的bind_rows函数完成新数据追加,比基础包的rbind兼容性更强,同时增加本地持久化逻辑,避免脚本意外终止导致数据丢失。
# 初始化存储数据集:如果本地有历史数据直接读取,没有则首次爬取生成初始数据集 if (file.exists("spain35_historical.csv")) { live_var <- read_csv("spain35_historical.csv", show_col_types = FALSE) } else { live_var <- fetch_spain35_pct() write_csv(live_var, "spain35_historical.csv") }
3. 定时自动爬取设置
如果需要按固定间隔自动爬取追加数据,可以用简单的循环+等待逻辑实现:
# 爬取间隔设置,单位为秒,示例为300秒=5分钟,可根据需求调整,不要设置过短给目标站点造成压力 fetch_interval <- 300 while(TRUE) { new_data <- fetch_spain35_pct() # 仅爬取成功时执行追加操作 if (!is.null(new_data)) { live_var <- bind_rows(live_var, new_data) # 同步写入本地文件持久化 write_csv(live_var, "spain35_historical.csv") message(Sys.time(), " 数据追加成功,当前累计行数:", nrow(live_var)) } # 等待到下一次爬取时间 Sys.sleep(fetch_interval) }
注意事项
- 需要终止脚本运行时,直接在R控制台按ESC键即可
- 如果你不需要全自动定时运行,仅需要每次手动执行追加,只需要调用
new_data <- fetch_spain35_pct()后执行live_var <- bind_rows(live_var, new_data)即可 - 涨跌幅字段默认是带百分号的字符格式,后续做数值分析时可以用
str_remove(Var_pct, "%") %>% as.numeric()转换为数值格式
内容的提问来源于stack exchange,提问作者thomas
相关产品推荐
相关产品推荐

