R语言如何循环遍历数据框ID列表请求API并合并结果为数据框
R语言批量请求API并合并结果实现方案
核心逻辑为提取ID列表后逐个构造请求URL,增加错误捕获、限流等待机制避免请求中断,最后将所有返回结果统一合并为数据框。
方法1:基础R for循环实现(易调试、兼容性好)
优先推荐该写法,出问题时方便定位单个ID的请求错误,运行效率更高。
注意:你原有的单请求代码存在两处语法问题:
fromJSON(rawToChar(response$content)缺少右括号、add_headers('API_KEY')未按键值对格式传参,以下代码已做修正。
# 加载依赖包 require(httr) require(jsonlite) # 基础配置 base_url <- "https://api.WEBSITE.com/api/v1/" # 请按接口文档实际要求修改请求头,比如常见的APIKEY头格式为 `X-API-KEY` = "你的实际密钥值" req_headers <- add_headers(API_KEY = "替换为你的实际API密钥") # 替换为你自己存储ID的数据框变量名,假设ID存储在名为id的列中 id_df <- 你存储多个ID的dataframe # 初始化空列表存储请求结果,比循环中逐次rbind效率高10倍以上 result_list <- list() # 遍历所有ID发起请求 for (i in seq_along(id_df$id)) { current_id <- id_df$id[i] current_url <- paste0(base_url, current_id) # 错误捕获:单个ID请求失败不中断整体循环 tryCatch({ response <- VERB( "GET", current_url, req_headers, content_type("application/octet-stream"), accept("application/json") ) # 解析返回结果 current_data <- fromJSON(rawToChar(response$content)) result_list[[i]] <- current_data # 打印进度 cat("已完成第", i, "个ID,ID值:", current_id, "的请求\n") # 请求间隔,避免触发接口限流,可根据接口规则调整等待时长 Sys.sleep(0.5) }, error = function(e) { cat("第", i, "个ID(", current_id, ")请求失败,错误信息:", e$message, "\n") result_list[[i]] <- NULL }) } # 合并所有结果为统一数据框 final_df <- do.call(rbind, result_list)
方法2:purrr函数式写法(代码更简洁)
如果使用tidyverse生态,可以用map_dfr自动完成结果按行合并,代码更精简:
require(httr) require(jsonlite) require(purrr) base_url <- "https://api.WEBSITE.com/api/v1/" req_headers <- add_headers(API_KEY = "替换为你的实际API密钥") id_df <- 你存储多个ID的dataframe final_df <- map_dfr(id_df$id, function(current_id) { current_url <- paste0(base_url, current_id) # 安全请求封装 safe_req <- safely(~{ resp <- VERB( "GET", current_url, req_headers, content_type("application/octet-stream"), accept("application/json") ) Sys.sleep(0.5) fromJSON(rawToChar(resp$content)) }) res <- safe_req() if (!is.null(res$error)) { cat("ID", current_id, "请求失败:", res$error$message, "\n") return(NULL) } res$result })
注意事项
- 不要删除
Sys.sleep()请求间隔,短时间发起大量请求极易触发接口限流、IP封禁 - 如果部分ID返回异常结构(比如接口返回错误提示而非正常数据),可在解析结果后增加列数校验:
if(ncol(current_data)!=27) {cat("ID",current_id,"返回结构异常,已跳过\n"); return(NULL)},避免合并时报错 - 跑完后可通过
nrow(final_df)核对成功返回的条目数,确认数据无缺失
内容的提问来源于stack exchange,提问作者Soph2010
相关产品推荐
相关产品推荐

