You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 03:36:16