如何在循环迭代中创建对应年份的独立Data Frame?
解决Box Office Mojo逐年爬取并生成年份命名数据框的问题
原代码核心问题
- 循环变量与数据框变量重名(
pageresult),导致年份值被覆盖,无法区分不同年份的爬取目标 - 每次循环都覆盖同一个数据框对象,最终仅保留最后一次迭代(1997年)的结果
修正方案1:直接生成年份命名的独立数据框
将每个年份的数据存储为以df_年份命名的独立数据框,例如df_2021、df_2020:
# 遍历1997-2021年(逆序) for (year in seq(from = 2021, to = 1997, by = -1)) { # 构造目标URL url5 <- paste0("https://www.boxofficemojo.com/year/world/", year, "/") # 读取网页并解析表格数据 html <- rvest::read_html(url5) year_data <- as.data.frame(html %>% rvest::html_elements(css = "table") %>% .[[1]] %>% rvest::html_table()) # 重命名指定列 colnames(year_data)[1] <- "rank_WBO" colnames(year_data)[2] <- "name" colnames(year_data)[7] <- "percent2" # 将数据框以年份命名并存入全局环境 assign(paste0("df_", year), year_data) # 可选:添加延迟避免频繁请求被封禁 Sys.sleep(1) }
修正方案2:用列表统一管理(更推荐)
先将所有年份数据存入列表,后续可灵活提取或批量处理,比分散的独立数据框更易维护:
# 创建空列表存储所有年份数据 boxoffice_list <- list() for (year in seq(from = 2021, to = 1997, by = -1)) { url5 <- paste0("https://www.boxofficemojo.com/year/world/", year, "/") html <- rvest::read_html(url5) year_data <- as.data.frame(html %>% rvest::html_elements(css = "table") %>% .[[1]] %>% rvest::html_table()) colnames(year_data)[1] <- "rank_WBO" colnames(year_data)[2] <- "name" colnames(year_data)[7] <- "percent2" # 将数据添加到列表,以年份为索引名 boxoffice_list[[as.character(year)]] <- year_data Sys.sleep(1) } # 可选:提取单个年份的数据(例如2021年) df_2021 <- boxoffice_list[["2021"]] # 可选:合并所有数据为一个带年份标识的总数据框 library(dplyr) all_boxoffice <- bind_rows(boxoffice_list, .id = "year")
注意事项
- 爬取前请遵守网站
robots.txt规则,避免短时间内高频请求导致IP被封禁 - 若网页结构变更,需调整
css = "table"或表格索引.[[1]]的参数
内容的提问来源于stack exchange,提问作者Pyright 1212
相关产品推荐
相关产品推荐

