如何基于API配额使用rscopus::scopus_search分块获取并合并文献记录?
在API配额限制下使用rscopus的scopus_search完成检索并分块合并结果
核心思路:利用分页参数规避配额限制
Scopus API存在两类常见限制:单次请求最多返回200条结果,以及每日请求次数配额。rscopus的scopus_search函数通过start(起始偏移量)和count(单次请求数量)参数支持分页检索,这是绕开配额限制、获取全部结果的核心方法。同时,分块获取后合并结果完全可行,以下是具体实现步骤和注意事项。
1. 完整检索流程实现
步骤1:获取总结果数
先发起一次小批量请求,获取检索式对应的总命中数,以此确定需要分多少批次请求:
library(rscopus) # 提前配置API密钥(可通过set_api_key("your_key")设置) search_query <- "TITLE(\"natural language processing\") AND YEAR = 2023" # 初始请求仅获取1条结果,目的是拿到总结果数 initial_response <- scopus_search(search_query, count = 1, start = 0) total_hits <- initial_response$total_results
步骤2:分批次请求并收集结果
根据总结果数和单次最大请求量(200)计算批次数量,循环发起请求并收集每一批的结果:
batch_size <- 200 # Scopus允许的单次最大返回数 num_batches <- ceiling(total_hits / batch_size) all_entries <- list() for (batch_idx in 0:(num_batches - 1)) { start_pos <- batch_idx * batch_size # 最后一批可能不足batch_size,按需调整 current_count <- min(batch_size, total_hits - start_pos) # 发起当前批次请求 batch_response <- scopus_search( query = search_query, count = current_count, start = start_pos ) # 将当前批次的条目存入列表 all_entries[[batch_idx + 1]] <- batch_response$entries # 可选:添加延迟避免触发速率限制 Sys.sleep(0.5) } # 合并所有批次的结果为数据框 combined_results <- do.call(rbind, all_entries)
2. 适配API配额的额外注意事项
- 每日请求配额控制:如果你的API每日请求次数有限,需要确保总请求数(即批次数量)不超过配额。比如每日配额为500次,总结果数为100000的话,需要分2天完成检索(100000/200=500次请求)。
- 错误处理:网络波动或API临时限制可能导致请求失败,建议添加
tryCatch捕获异常:
batch_response <- tryCatch( scopus_search(search_query, count = current_count, start = start_pos), error = function(e) { message(paste("批次", batch_idx + 1, "请求失败:", e$message)) return(NULL) } ) if (!is.null(batch_response)) { all_entries[[batch_idx + 1]] <- batch_response$entries }
关于API配额参数的说明
rscopus的scopus_search函数没有直接接收“配额”的参数,但通过上述分页逻辑,结合控制请求频率、单次请求数量,完全可以适配API的配额限制。分块获取后合并结果是官方支持的常规操作,合并后的结果与单次获取(无配额限制时)的结构完全一致。
内容的提问来源于stack exchange,提问作者Pablo Bernabeu
相关产品推荐
相关产品推荐

