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

R语言如何循环遍历URL批量获取2021年F1车手积分榜数据

2021赛季F1车手积分榜数据批量获取实现方案

原代码存在的核心问题

  • 循环内直接修改baseurl变量,第一次请求后基础地址就被拼接上第一站的路径,后续循环生成的URL格式完全错误
  • 未初始化结果存储对象,每次请求拿到的数据没有追加保存,循环结束后只能拿到最后一次请求的结果
  • 缺少返回内容解析、请求状态校验、频率控制逻辑,很容易出现请求失败、数据丢失的问题
  • 2021赛季F1实际共22轮大奖赛,你设置的x取值范围1-22是正确的

可直接运行的实现代码(R语言,匹配你用的GET请求写法)

首次运行需要先安装依赖包:

install.packages(c("httr", "jsonlite", "dplyr"))

核心爬取逻辑:

library(httr)
library(jsonlite)
library(dplyr)

# 固定基础地址,循环内不要修改这个变量
baseurl <- "http://ergast.com/api/f1/2021/"
# 初始化列表存储每一轮的积分榜数据
all_standings <- list()
x <- 1

while (x <= 22) {
  # 每次循环单独拼接当前轮次的完整请求地址
  current_url <- paste0(baseurl, x, "/driverStandings.json")
  # 发送请求
  resp <- GET(current_url)
  # 校验请求状态,状态码200代表请求成功
  if (status_code(resp) == 200) {
    # 解析返回的JSON格式数据
    resp_content <- fromJSON(rawToChar(resp$content))
    # 提取当轮车手积分榜存入结果列表
    all_standings[[x]] <- resp_content$MRData$StandingsTable$StandingsLists[[1]]
    message(paste("第", x, "轮数据获取完成"))
  } else {
    warning(paste("第", x, "轮请求失败,状态码:", status_code(resp)))
    all_standings[[x]] <- NULL
  }
  x <- x + 1
  # 加1秒请求间隔,避免调用过于频繁被限制访问
  Sys.sleep(1)
}

# 将所有轮次的数据合并为结构化数据框
final_2021_standings <- bind_rows(all_standings)

实现说明

  • 在接口路径末尾加.json可以直接拿到JSON格式返回值,比接口默认返回的XML格式更容易解析处理
  • 每次循环单独生成当前轮次的请求URL,不改动原始基础地址,从根源避免URL拼接错误
  • 增加了请求状态校验,单轮请求失败不会中断整个爬取流程,会给出明确的失败提示
  • 1秒的请求间隔符合公开API的常规调用规则,不会给服务端造成额外压力
  • 最终生成的final_2021_standings是结构化表格,包含每轮的赛季、轮次、车手信息、所属车队、积分、排名等完整字段

内容的提问来源于stack exchange,提问作者Linda Sedlicka

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 11:06:33