PyAlex Authors()是否支持多Author ID传入并返回多对象?批量查询优化求助
高效批量查询OpenAlex作者姓名的方法
我有一个包含400k个OpenAlex Author ID的DataFrame,想要获取每个ID对应的作者姓名(名和姓)。目前每次仅向Authors()类传入单个Author ID,从响应中提取display_name字段,但这种方式速度极慢、效率低下——毕竟要发起400k次请求。我想找更高效的批量查询方法,但官方README没给出有效帮助。当前实现代码如下:
pyalex.config.email = "my_email@gmail.com" pyalex.config.max_retries = 3 pyalex.config.retry_backoff_factor = 0.1 for row in range(len(data["openalex_id"])): name = Authors()[data.loc[row, "openalex_id"]]["display_name"] data.loc[row, "Name_Surname"] = name
优化方案
OpenAlex支持批量查询,结合pyalex的特性可以大幅减少请求次数,提升效率:
- 利用OpenAlex的批量筛选能力:OpenAlex允许通过
filter参数单次传入最多200个作者ID,将400k个ID按200个一组拆分,请求次数可从400k降至2000次。 - 使用pyalex的批量查询接口:pyalex的
Authors()类支持通过filter(id=批量ID列表)的方式发起查询,再通过.get()获取所有结果。
优化后的代码示例
import pyalex pyalex.config.email = "my_email@gmail.com" pyalex.config.max_retries = 3 pyalex.config.retry_backoff_factor = 0.1 # 单次批量查询的最大ID数量(OpenAlex限制) BATCH_SIZE = 200 # 获取所有作者ID列表 author_ids = data["openalex_id"].tolist() # 分批处理ID for idx in range(0, len(author_ids), BATCH_SIZE): # 截取当前批次的ID batch = author_ids[idx:idx+BATCH_SIZE] # 批量查询作者信息 author_results = pyalex.Authors().filter(id=batch).get() # 构建ID与姓名的映射字典 name_mapping = {item["id"]: item["display_name"] for item in author_results} # 批量更新DataFrame中的姓名字段 data.loc[data["openalex_id"].isin(batch), "Name_Surname"] = data["openalex_id"].map(name_mapping)
注意事项
- 遵守API配额:配置邮箱后OpenAlex会提供更高的请求配额,避免触发限流;如果遇到限流,可以适当调大
retry_backoff_factor的值。 - 处理无效ID:部分ID可能不存在于OpenAlex数据库中,可通过
fillna()方法为这些条目设置默认值(如data["Name_Surname"] = data["Name_Surname"].fillna("未知"))。 - 进度跟踪:可以引入
tqdm库为循环添加进度条,方便查看处理进度:from tqdm import tqdm for idx in tqdm(range(0, len(author_ids), BATCH_SIZE)): # 原有批量处理代码
内容的提问来源于stack exchange,提问作者Jay
相关产品推荐
相关产品推荐

