R语言中使用rscopus包循环遍历ID列表批量获取Scopus作者数据
Scopus作者数据批量拉取通用实现
你只需要把所有待查询的作者ID统一维护在一个独立的列表里,后续新增查询对象时,只需要往这个列表里补ID,完全不需要修改后面的查询、合并逻辑,就能替代之前手动逐行写df1、df2的冗余操作。
基础固定配置
先把不变的前置配置写好,和你之前手动跑的逻辑完全兼容:
# 加载依赖包 library(rscopus) library(dplyr) # 替换为你自己的专属Scopus API密钥 Elsevier_API = "你的专属API密钥" set_api_key(Elsevier_API) # 所有待查询的作者ID统一存在这个向量中,后续新增ID直接按格式追加即可 au_id_list <- c( "35392031000", "35418453700", "后续新增的作者ID直接加在这个向量里,不用改动其他代码" )
带容错的批量查询逻辑
新手写循环最容易碰到的问题是:某一个ID查询失败(比如ID无效、临时网络波动、API调用频率超限)会直接中断整个脚本,导致之前已经拉取的有效数据全部丢失。下面的写法做了基础的异常捕获,单条查询出错不会拖垮整个流程:
# 遍历ID列表执行查询,单条结果存入列表 all_author_data <- lapply(au_id_list, function(current_id) { # 单条查询包裹异常捕获逻辑 tryCatch( # 和你之前单独调用的author_df参数完全一致,没有修改原逻辑 author_df(au_id = current_id, verbose = FALSE, general = FALSE), # 查询出错时打印提示,返回空数据框,不中断流程 error = function(err) { message(paste("ID为", current_id, "的作者数据拉取失败,错误原因:", err$message)) data.frame() } ) }) # 纵向合并所有结果,生成最终的结构化数据框 df_final <- bind_rows(all_author_data)
可选优化:避免触发API频率限制
如果单次查询的ID数量比较多,可以在每次查询之间加个短延时,降低触发Scopus接口限流的概率,只需要在查询逻辑里加一行Sys.sleep()即可:
all_author_data <- lapply(au_id_list, function(current_id) { tryCatch({ query_res <- author_df(au_id = current_id, verbose = FALSE, general = FALSE) Sys.sleep(0.5) # 每次查询完成后等待0.5秒 query_res }, error = function(err) { message(paste("ID为", current_id, "的作者数据拉取失败,错误原因:", err$message)) data.frame() }) })
日常使用注意事项
- 后续要新增查询的研究者ID,只需要追加到
au_id_list向量中即可,不需要修改后面的查询、合并代码,真正实现通用逻辑 - 由于Scopus接口需要绑定有效专属密钥,无有效密钥的环境运行代码会触发权限类报错,属于正常情况
- 合并数据时如果不同作者的数据存在列名差异,
bind_rows会自动对齐列、给缺失的位置补空值,不需要手动调整
内容的提问来源于stack exchange,提问作者littletimmy
相关产品推荐
相关产品推荐

