在R中按日期迭代API GET请求并合并数据集的问题
解决批量API拉取与数据合并的问题
看起来你已经迈出了生成请求URL的第一步,但当前的URL生成逻辑会导致大量重复数据(比如第一个URL拉取27-30号,第二个拉28-30号,数据会严重重叠),而且还没把拉取逻辑自动化。我来帮你一步步优化整个流程:
1. 修正日期范围生成逻辑
首先我们需要生成不重叠的日期区间(比如按天拆分,或者按周/小批次,根据单批次数据量调整),避免重复拉取。这里先以按天拉取为例:
# 定义时间范围 end_date <- Sys.Date() start_date <- as.Date("2020-01-27") # 生成所有需要拉取的日期(每天一个独立区间) date_sequence <- seq(start_date, end_date, by = "day") # 生成每个日期对应的API URL(每个URL仅拉取当天的数据) api_urls <- sapply(date_sequence, function(date) { paste0("https://website.com/api/?action=search_pcrs&e1=eTimes.03&o1=between&v1=", date, "^", date, "&e2=eMedications.03&o2=in&v2type=id&v2=14731^14730^14729^3864&col...") })
如果单天数据量超过2500条,可以改成按半天/按周拆分,只需要调整seq的by参数(比如by = "3 days"),然后每个URL的v1设为该批次的起始和结束日期即可。
2. 封装API拉取函数
把你手动拉取数据的代码封装成可复用的函数,处理单个URL并返回结构化数据框:
library(XML) library(httr) fetch_pcr_data <- function(url) { # 发送API请求 api_get <- GET(url) # 检查请求是否成功,避免无效数据中断流程 if (http_status(api_get)$category != "Success") { warning(paste("请求失败,URL:", url)) return(NULL) } # 解析XML并转为数据框 api_raw <- rawToChar(api_get$content) api_tree <- xmlTreeParse(api_raw, useInternalNodes = TRUE) api_df <- xmlToDataFrame(api_tree, nodes = getNodeSet(api_tree, "//pcr")) return(api_df) }
这个函数会自动跳过请求失败的URL,避免整个批量任务中断。
3. 批量拉取并合并数据
用lapply遍历所有URL,调用上面的函数,最后合并所有有效数据:
# 批量拉取所有数据 all_data_list <- lapply(api_urls, fetch_pcr_data) # 过滤掉请求失败返回的NULL值 all_data_list <- Filter(Negate(is.null), all_data_list) # 合并所有数据框为最终数据集 final_data <- do.call(rbind, all_data_list)
如果你习惯用dplyr,可以用bind_rows替代do.call(rbind, ...),代码更简洁:
library(dplyr) final_data <- bind_rows(all_data_list)
4. 进阶优化(可选)
- 添加请求延迟:如果API有频率限制,可以在
fetch_pcr_data函数里加入Sys.sleep(1)(暂停1秒),避免被限流。 - 并行拉取:如果数据量极大,可以用
parallel或furrr包实现并行请求,大幅提升拉取速度。 - 日志记录:可以在函数里添加打印语句,记录每个URL的拉取状态,方便后续排查问题。
这样你就完全不需要手动重复拉取操作,整个流程实现自动化啦!
内容的提问来源于stack exchange,提问作者Marshall
相关产品推荐
相关产品推荐

