Scopus Serial Search API中subjArea与subjCode检索结果为何不同?
问题根因
两个参数返回结果不一致、拉取数量达不到网页端显示的13477本,是Scopus接口本身的规则导致的,和pybliometrics包的实现无关:
subjCode='2700'和subjArea='MEDI'的匹配逻辑不同:前者仅匹配把Medicine作为唯一主分类的期刊,后者会匹配所有学科标签中包含Medicine的期刊(含主分类、副分类标注为Medicine的期刊),两者覆盖范围本来就存在差异。- SerialTitle接口对不同查询参数设置了硬返回上限:
subjCode单条件最多返回5000条结果,subj(即subjArea参数对应的查询字段)单条件最多返回10000条结果,超过阈值后接口直接返回500错误,不会返回剩余数据,和网页端无数量限制的检索逻辑不通用。
可行方案
直接用顶层大类代码查询必然触发上限,需要拆分查询粒度绕开限制,最终去重得到全量数据:
- 先获取Medicine大类下所有细分二级子学科的代码,不要直接用顶层大类代码做查询条件
- 遍历每个二级子学科代码,单独用
subjCode参数拉取对应分类下的期刊,单个二级子学科下的期刊量远低于5000的接口上限,不会触发结果截断 - 所有子学科数据拉完后,用期刊唯一标识(Scopus来源ID、ISSN均可)去重,得到的结果和网页端检索的13477本数量一致
可直接运行的参考代码:
import time import pandas as pd from pybliometrics.scopus import SerialSearch, SubjectClassifications # 拉取Medicine大类下所有二级子学科代码 medi_subjects = SubjectClassifications(subj_area="MEDI") # 排除顶层大类代码2700,仅保留二级子类 subj_code_list = [sub.code for sub in medi_subjects if sub.code != "2700"] all_journal_df = pd.DataFrame() for code in subj_code_list: print(f"拉取子学科 {code} 期刊数据中...") start = 0 while True: search_res = SerialSearch( query={"subjCode": code}, start=str(start), refresh=True ) page_size = search_res.get_results_size() if page_size == 0: break start += page_size page_df = pd.DataFrame(search_res.results) all_journal_df = pd.concat([all_journal_df, page_df], ignore_index=True) # 加1秒休眠避免触发接口频率限制 time.sleep(1) # 按Scopus唯一source_id去重,剔除跨子学科重复收录的期刊 all_journal_df = all_journal_df.drop_duplicates(subset="source_id").reset_index(drop=True) print(f"拉取完成,共获取Medicine领域期刊 {len(all_journal_df)} 本")
小提示:如果拉取过程中出现500错误,可以适当调大休眠间隔,一般是接口频率限制导致的,重试即可。
内容的提问来源于stack exchange,提问作者stackersTech101
相关产品推荐
相关产品推荐

