解决R调用美国财政部API仅返回前100行数据的问题
解决美国财政部API分页获取全部数据问题
美国财政部的这个API默认采用分页机制,每次请求仅返回前100条数据(默认每页数量)。要获取全部数据,需要通过分页参数逐页请求并合并结果,具体步骤如下:
1. 先获取API元数据,确认总记录数
第一次请求后,返回的结果中包含meta字段,里面有总记录数total和每页默认条数per_page,用这个来计算需要请求的总页数。
2. 循环请求所有分页并合并数据
使用page[number]参数指定页码,逐页获取数据后合并为完整数据集。
完整代码示例
library(httr) library(jsonlite) library(dplyr) # 基础API地址 base_url <- "https://api.fiscaldata.treasury.gov/services/api/fiscal_service/v2/accounting/od/avg_interest_rates" # 获取元数据,确定总记录数与分页参数 initial_res <- GET(base_url) initial_json <- fromJSON(rawToChar(initial_res$content)) total_rows <- initial_json$meta$total per_page <- initial_json$meta$per_page # 默认每页100条 # 计算总页数 total_pages <- ceiling(total_rows / per_page) # 初始化列表存储每页数据 all_pages <- list() # 循环请求每一页 for(page in 1:total_pages) { # 构建带分页参数的请求URL req_url <- paste0(base_url, "?page[number]=", page, "&page[size]=", per_page) # 发送请求并解析数据 res <- GET(req_url) page_data <- fromJSON(rawToChar(res$content))$data # 将当前页数据加入列表 all_pages[[page]] <- page_data # 添加延迟,避免请求过于频繁触发限流 Sys.sleep(0.5) } # 合并所有页数据为一个数据框 full_dataset <- bind_rows(all_pages) # 查看完整数据结构 str(full_dataset)
关键说明
- 分页参数:API支持
page[number](页码)和page[size](每页条数)两个参数,你可以根据需求调整page[size]的数值(比如设为500),但建议不要过大,防止请求超时或被限流。 - 延迟处理:
Sys.sleep(0.5)是为了降低请求频率,避免触发API的访问限制,可根据实际情况调整时长。 - 数据合并:使用
dplyr::bind_rows可以高效合并多个数据框,也可以用do.call(rbind, all_pages)替代(但bind_rows对不同列结构的兼容性更好)。
内容的提问来源于stack exchange,提问作者trailblazer_1
相关产品推荐
相关产品推荐

