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

如何在循环迭代中创建对应年份的独立Data Frame?

解决Box Office Mojo逐年爬取并生成年份命名数据框的问题

原代码核心问题

  1. 循环变量与数据框变量重名(pageresult),导致年份值被覆盖,无法区分不同年份的爬取目标
  2. 每次循环都覆盖同一个数据框对象,最终仅保留最后一次迭代(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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 17:07:41