使用rscopus调用Scopus API遇5000条限制及HTTP400错误如何解决?
解决Scopus API超过5000条结果的获取问题
错误原因
你遇到的HTTP 400错误主要源于两点:
- Scopus API单次请求的
max_count上限为5000,你设置的max_count=10000超出了这个硬性限制。 - Scopus的
start参数采用0索引规则(第一条结果对应start=0,第5000条对应start=4999),你用start=5001会导致请求范围无效。
解决方案:分页循环获取结果
必须拆分请求,分批次获取每5000条结果,最后合并所有批次的数据。以下是具体实现代码:
# 1. 先查询总结果数(用STANDARD视图更快,降低API负载) total_results <- scopus_search( query = "TITLE-ABS-KEY(Radiotherapy) AND PUBYEAR = 2022", view = 'STANDARD', max_count = 1, headers = insttoken )$total_results # 2. 初始化存储所有结果的列表 all_data <- list() # 3. 分页循环请求,每次取5000条 for (start_val in seq(0, total_results - 1, by = 5000)) { # 计算当前批次的请求数量(最后一批可能不足5000) current_count <- min(5000, total_results - start_val) # 发送请求 batch_result <- scopus_search( query = "TITLE-ABS-KEY(Radiotherapy) AND PUBYEAR = 2022", view = 'COMPLETE', start = start_val, max_count = current_count, headers = insttoken ) # 将当前批次结果加入列表 all_data[[length(all_data) + 1]] <- batch_result$results # 可选:添加1秒延迟,避免触发API频率限制 Sys.sleep(1) } # 4. 合并所有批次的结果 final_results <- do.call(rbind, all_data)
关键注意事项
- 严格遵守单次请求
max_count ≤ 5000的规则,这是Scopus API的强制限制。 start参数必须从0开始,每次递增5000(如0、5000、10000...),确保请求范围连续且有效。- 添加延迟是为了避免触发Scopus的请求频率限制,若你的机构授权有更高的频率配额,可适当调整或移除延迟。
- 确认你的机构令牌(insttoken)有权限获取超过5000条结果,部分机构的API授权可能有结果数量限制。
内容的提问来源于stack exchange,提问作者kim0323
相关产品推荐
相关产品推荐

