R语言实现定时网页抓取并追加至同一DataFrame的方法求助
解决R语言定时抓取网页数据并追加到DataFrame的问题
嗨,作为R新手能尝试网页抓取已经很棒啦!你的问题核心有两个:一是每次运行代码时没有保留之前的数据(因为你每次都把dfNEW初始化为空数据框),二是缺少定时重复执行的逻辑。下面给你两种常见场景的解决方案:
场景1:让脚本持续运行,自动每5分钟抓取一次
这种适合你希望打开R后让程序一直后台跑的情况,代码逻辑是:先初始化总数据框,然后用循环不断抓取、追加、等待。
library(rvest) library(plyr) # 1. 初始化总数据框(放在循环外面,只执行一次) total_df <- data.frame() url <- "myurl" # 2. 设置循环(这里用while TRUE会无限运行,你可以加终止条件,比如运行10次) run_times <- 0 max_runs <- 10 # 比如最多抓10次,不想限制就去掉这个条件,用while(TRUE) while(run_times < max_runs) { # 3. 抓取网页数据 content <- read_html(url) Result <- content %>% html_node("#gauge") %>% html_attrs() %>% `[`(c("dataA1", "dataA2")) df <- as.data.frame(t(Result)) rownames(df) <- c() df$Time <- Sys.time() # 4. 追加到总数据框 total_df <- rbind.fill(total_df, df) # 5. 打印进度(可选,方便看运行情况) run_times <- run_times + 1 cat(sprintf("完成第%d次抓取,当前总数据行数:%d\n", run_times, nrow(total_df))) # 6. 等待5分钟(300秒),如果是最后一次就不用等了 if(run_times < max_runs) { Sys.sleep(300) } } # 最后可以把数据保存到本地,防止丢失 saveRDS(total_df, "production_data.rds") # 后续读取可以用:total_df <- readRDS("production_data.rds")
场景2:手动/系统定时任务(比如Windows任务计划、Linux Cron)每次运行脚本
如果是通过系统定时任务每隔5分钟跑一次脚本,那每次运行时需要先读取之前保存的总数据,追加新数据后再保存回去:
library(rvest) library(plyr) url <- "myurl" data_file <- "production_data.rds" # 1. 读取已有的总数据(如果文件不存在就初始化空数据框) if(file.exists(data_file)) { total_df <- readRDS(data_file) } else { total_df <- data.frame() } # 2. 抓取新数据 content <- read_html(url) Result <- content %>% html_node("#gauge") %>% html_attrs() %>% `[`(c("dataA1", "dataA2")) df <- as.data.frame(t(Result)) rownames(df) <- c() df$Time <- Sys.time() # 3. 追加数据并保存 total_df <- rbind.fill(total_df, df) saveRDS(total_df, data_file) cat(sprintf("本次抓取完成,当前总数据行数:%d\n", nrow(total_df)))
为什么你原来的代码会覆盖数据?
你原来每次运行都把dfNEW设为空数据框,total <- rbind.fill(dfNEW, df)自然就只有本次的新数据。不管用哪种方案,核心都是要把总数据存储在循环/脚本运行之外的地方:要么是持续运行时的全局变量,要么是本地文件。
内容的提问来源于stack exchange,提问作者JaneJane
相关产品推荐
相关产品推荐

