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
相关产品推荐
相关产品推荐

