Scopus API Toolkit
把 dev.elsevier.com 官方 API 封装成一条命令就能跑通的本地工具链。
特点:零依赖(只用 Python 标准库,不用装 requests/pybliometrics)、自动分页、自动处理配额与 429、输出直接可用。
何时使用
- 「帮我检索某个主题的 Scopus 文献,导出 Excel/CSV」
- 「查这篇论文的参考文献列表 / 被引次数」
- 「这个作者的 H-index 和发文数」「机构发文量」「期刊 CiteScore」
- 「按年份/学科/期刊统计某个领域的分布」(分面 facets)
- 为 bibliometrix(R)、VOSviewer、CiteSpace 准备数据
环境
- 脚本:
scripts\scopus_client.py - 解释器:
python(本机自动解析) - 凭据:本机提前配置,自动从
C:\Users\{当前用户名}\.env(变量名类似Scopus_Api_Key)读取,如果没有凭据(key),需要中断过程,提示用户自行到Scopus.com官网注册获取api key, 不要把它写进任何 skill 文件或命令里。详见references/credentials.md
> 路径含空格/中文,命令里一律用英文引号包住。输出目录建议用 -o "D:\...\文件名.csv" 而非 /tmp(Git Bash 的 /tmp 与 Windows Python 看到的路径不一致)。
输出文件夹规范(按数据源分文件夹,务必遵守)
同一工作区可能同时用 Scopus / OpenAlex 等多个数据源导出,所有导出和派生产物必须按数据源分文件夹存放:
<工作目录>/ # 默认当前工作区根目录,或用户指定的目录
├── scopus/ # Scopus 检索导出的原始数据(CSV/JSON)← 本技能的 -o 默认落位
├── openalex/ # OpenAlex 导出的原始数据
├── vosviewer/
│ ├── scopus/ # 基于 Scopus 数据生成的 map/network/截图
│ └── openalex/ # 基于 OpenAlex 数据生成的 map/network/截图
└── scripts/ # 一次性转换脚本(可选)
- 用户没给输出路径时,
search/export的-o默认写到当前工作目录的scopus/子文件夹;用户显式给了路径以用户为准。 - 排序提示:
--sort=-citedby-count可按被引次数降序取 Top N(「导出被引最高的前 N 条」场景),--sort=-pubyear按出版年降序;--sort citedby-count为升序。
快速上手
S=".\scripts\scopus_client.py"
# 1) 先验配额与连通性(任何任务的第一步,只耗 1 次额度)
python "$S" quota
# 2) 先看规模再决定拉多少(1 次额度拿到命中总数)
python "$S" total -q 'TITLE-ABS-KEY("solid state battery") AND PUBYEAR > 2020'
# 3) 检索导出
python "$S" search -q 'TITLE-ABS-KEY("solid state battery") AND PUBYEAR > 2020' \
-n 500 -f csv -o "D:\lit\battery.csv"
命令一览
| 命令 | 用途 | 关键参数 |
|---|---|---|
quota |
连通性 + 配额余额 | — |
total |
只查命中总数(探查用,最省) | -q --date |
search |
检索并导出 CSV/JSON | -q --view --sort --date --facets --cursor -n -o |
export |
按 Scopus 网页 Export 导出:43 列 CSV(含参考文献),或 -f bib 出 bibliometrix 直读的 BibTeX |
-q -n -o -f csv\|bib --sort --date --from-json --no-refs --refs-cap --cache |
abstract |
单篇详情 | --doi/--scopus-id/--eid/--pii/--pubmed-id/--pui,--view FULL,--refs,--xml |
author-search |
按姓名查作者档案 | -q 'authlast(smith) AND affil(massachusetts)' |
author |
作者档案:H-index、发文数、被引数 | --author-id,--view METRICS\|ENHANCED\|LIGHT |
affiliation-search |
查机构 ID | -q 'affil(Peking University)' |
affiliation |
机构档案 | --aff-id,--view STANDARD\|LIGHT |
serial-title |
期刊指标 CiteScore/SJR/SNIP | --issn,--view ENHANCED |
citation-count |
被引计数 metadata | 本机 key 返回 403,改用检索结果里的 citedby_count 字段 |
citation-overview |
逐年被引 | 需向 Elsevier 申请开通,本 key 403 |
subject |
ASJC 学科分类码表 | — |
raw |
直连任意官方端点 | raw 'serial/title' -p issn=... -p view=... |
全局参数(可放在任意位置):--api-key --insttoken --env-file --timeout --min-interval --max-retries -v
导出「和 Scopus 网页一模一样」的 CSV(含参考文献)
当需求是「格式要和 Scopus 导出的结果一致」「要包含参考文献」(导师要附件、投稿附件、复现别人的处理流程、喂 bibliometrix::convert2df),
用 export 而不是 search:search 的 CSV 是给 VOSviewer/分析用的精简拍平表,列名称与列数都不同。
# 200 条,被引降序,含全部参考文献(默认行为)
python "$S" export -q 'TITLE-ABS-KEY(electrochem*) AND PUBYEAR > 2021' \
-n 200 --sort -citedby-count -o "D:\lit\electrochem_200.csv"
# 只要元数据不要参考文献:不耗 abstract 配额,速度快 100 倍
python "$S" export -q '...' -n 200 --no-refs -o quick.csv
# 参考文献超长的综述:每篇只留前 50 条,避免撑爆 Excel 单元格
python "$S" export -q '...' -n 200 --refs-cap 50 -o capped.csv
# 不联网重建:复用上次存下的检索结果(0 次请求,改列/改截断都不必重新检索)
python "$S" export --from-json raw_search.json -n 200 -o same.csv
43 列、列序与列名完全对齐 Scopus 官网 Export → CSV:
Authors / Author full names / Author(s) ID / Title / Year / Source title / Volume / Issue / Art. No. /
Page start / Page end / Page count / Cited by / DOI / Link / Affiliations / Authors with affiliations /
Abstract / Author Keywords / Index Keywords / Molecular Sequence Numbers / Chemicals/CAS / Tradenames /
Manufacturers / Funding Details / Funding Text 1–3 / References / Correspondence Address /
Editors / Publisher / ISSN / ISBN / CODEN / PubMed ID / Language of Original Document /
Abbreviated Source Title / Document Type / Publication Stage / Open Access / Source / EID
字段来源分两层(这也是为什么不能只用一次 search):
| 层 | 来源 | 一次请求拿到 |
|---|---|---|
| 检索层 | search --view COMPLETE |
标题/作者全名+ID/机构/摘要/作者关键词/被引/卷期页/DOI/基金编号,每页 25 条 |
| 详情层 | abstract --view FULL |
参考文献全文、Publisher、通讯地址、Funding Text、索引关键词,1 篇 1 次 |
配额估算:导出 200 条 ≈ ceil(200/25)=8 次 search + 200 次 abstract-retrieval(weekly 配额各自独立计)。
几个实测细节,直接影响成品质量:
- FULL view 一次就带回全部参考文献(
item.bibrecord.tail.bibliography.reference[]的ce:source-text正是网页上显示的那串著录文本)。不需要走 REF view 的 40 条分页,也就绕开了「末尾一条取不到 / startref 越界报 400」的老坑。 - References 单元格按 Scopus 写法拼:
1) 著录文本; 2) 著录文本; ...,分号分隔、不换行。 - Link 列用的是
scopus.com/inward/record.uri?eid=...&partnerID=40(网页导出的形式),不是 API 地址。 - ISSN 补连字符(
00280836→0028-0836);Page count由起止页相减得出;文章号型文献(无页码)页留空、Art. No.有值 —— 与网页导出一致。 - 详情缓存写
<输出名>.fullcache.jsonl,中断后重跑同命令会跳过已抓的篇目(--cache可指定)。这是 200 条以上批量导出的关键,别删。 --from-json可直接吃search -f json的产物(也兼容原始响应体),跳过检索层;配合上面的详情缓存,常见场景(改--refs-cap、重出表)0 次请求即可完成。
> ⚠️ Excel 单元格上限 32767 字符。综述类文献的 References 可能 4–5 万字符,CSV 里数据完整,但 Excel 打开会截断显示。要进 Excel 就加 --refs-cap,或改用「一条参考文献一行」的长表结构。
导出 bibliometrix 直读的 BibTeX(-f bib)
背景:Scopus 的 API 没有 BibTeX 端点(网页上的 Export→BibTeX 是前端转换),而 bibliometrix 5.x 的 convert2df(dbsource="scopus") 只吃 BibTeX、不认 CSV。所以脚本按 Scopus BibTeX 规范自己生成,字段名逐条对齐 bibliometrix 的 data/bibtag.rda 映射。
# 一步生成 .bib
python "$S" export -q 'TITLE-ABS-KEY(bibliometric*)' -n 200 -f bib -o "D:\lit\biblio\scopus_200.bib"
# 接着就能直接进 bibliometrix
Rscript -e "M <- bibliometrix::convert2df('D:/lit/biblio/scopus_200.bib', dbsource='scopus', format='bibtex'); print(dim(M))"
| BibTeX 字段 | bibliometrix 标签 | 说明 |
|---|---|---|
author |
AU | 必须同一行内用 and 分隔、Last, First 形式 |
journal |
SO | 期刊名;abbrev_source_title → JI |
year volume number pages |
PY VL PN PP | 期号走 number,页码范围走 pages |
doi issn publisher language |
DI SN PU LA | |
abstract |
AB | |
author_keywords / keywords |
DE / ID | 作者关键词 / 索引关键词(Keywords Plus) |
affiliation |
C1 | [作者1; 作者2] 机构, 城市, 国家,bibliometrix 靠它抽 AU_UN / AU_CO |
correspondence_address1 |
RP | 通讯作者地址 |
references |
CR | 参考文献,见下方注意 |
note |
TC | 写成 Cited by: N——TC 只从这个字段取,别放别处 |
source |
DB | 写 Scopus |
document_type art_number funding_details funding_text pubmed_id |
DT AR FU FX PM |
四个坑(都是实测):
- 与 CSV 共用详情缓存(默认
<输出>.fullcache.jsonl):默认按输出文件名走,所以「CSV 和 .bib 输出到不同文件名」时要显式--cache指定同一个文件。实测复用后 3 条记录只发 2 次请求(1 次检索 + 1 页),不复用是 5 次。 references末尾必须留一个字符:bibliometrix 解析时无条件截掉最后一个字符,所以脚本在最后补一个.;不补就会吃掉最后一条引文。- Scopus 的参考文献是自由文本(
作者, 题名, 刊名, 年, 卷, 页),bibliometrix 的共被引解析对 WoS 式作者, 年, 刊名更友好。要做共被引网络,最好同时有一份 WoS 导出,或接受 Scopus 原样的解析效果。 -f bib同样支持--no-refs(跳过 FULL view,快 100 倍但 CR 为空)、--refs-cap、--from-json、--cache,语义与 CSV 完全一致。
本机实证的能力边界(2026-10-26 实测)
| 能力 | 状态 | 备注 |
|---|---|---|
| Scopus Search STANDARD view | ✅ | 配额 20000/周,每次最多 200 条 |
| Scopus Search COMPLETE view | ✅ | 含完整作者列表、摘要、关键词、基金;每次最多 25 条 |
| 参考文献列表(REF view) | ✅ | 自动翻页,实测 67 条取回 66 条(见下方坑 #2) |
| 参考文献(FULL view 内联) | ✅ | 批量导出首选:export 走这条路,1 篇 1 次请求即拿全,无分页截断 |
| Abstract Retrieval FULL/META_ABS | ✅ | 配额 10000/周 |
| Author Retrieval METRICS/ENHANCED/LIGHT | ✅ | 5000/周 |
| Affiliation Retrieval STANDARD/LIGHT | ✅ | 5000/周 |
| Serial Title ENHANCED(CiteScore/SJR/SNIP) | ✅ | 20000/周 |
| Author/Affiliation Search | ✅ | 结果体是 search-results.entry(不是 *-search-results) |
| 分面 facets | ✅ | JSON 里字段名叫 facet,不是 facetCategories |
| Citations Count Metadata | ❌ 403 | "Requestor configuration settings insufficient",换 DOI / Scopus ID / EID 三条路径都一样;用 search 结果里的 citedby_count 列替代 |
| Citation Overview(逐年被引) | ❌ 403 | 属 access-controlled API,需致信 API Support 开通 |
| Author Retrieval DOCUMENTS / BASIC / CITEDBY | ❌ 400 | 本机未开通,不要用这几个 view |
配额与限流(重要)
- 配额按单个 API分别计算,每周重置一次;
quota命令可读当前剩余。 - 各搜索类 API 限速 2–10 次/秒。脚本默认最小间隔 0.15s(
--min-interval),撞到 429 会自动退避重试。 - 省额度的最佳实践:先用
total看规模 → 用--view COMPLETE一次拿全字段,别为每篇再单独请求摘要 → 需要摘要时优先从 COMPLETE 检索结果里取(dc:description)。 - 一次 200 条的检索 ≠ 200 次额度消耗:
count=200的 STANDARD 检索只算 1 次。
已踩过的坑(须避免)
- 端点必须带
/content:正确根是https://api.elsevier.com/content/search/scopus,漏了就是 404。 - REF view 只返回前 40 条参考文献,会静默截断;且
startref + refcount越过@total-references时不返回空列表,而是直接 400 INVALID_INPUT。脚本已按total - startref保守分页(所以 67 条只能取到 66 条,末尾那条通常不可解析)。 - start/count 分页上限累计 5000 条,再多必须
--cursor(cursor 模式下每页强制 25)。单次查询上限约 20000 条,超了要按年份切片。 - STANDARD 与 COMPLETE 字段差异大:STANDARD 没有摘要/关键词/完整作者名单,只有第一作者和第一单位;要这些必须
--view COMPLETE(代价:每页最多 25 条)。 - 斜杠要编码:DOI 里的
/在 URL 中要写%2F,脚本已处理,但raw手写路径时需留意。 - stdout 别被污染:不带
-v时脚本不打印配额,保证| python -c管道能直接json.loads。 search的 CSV ≠ Scopus 网页导出的 CSV:前者是 34 列的精简拍平表(列名小写、无 References/Funding Text/Correspondence),后者是 43 列官方格式。用户说「要和 Scopus 导出一致」时一律用export,别拿search的 CSV 交差。- FULL view 的响应外面包了一层
abstracts-retrieval-response:解析时先下钻这一层,否则取到的全是空值(parse_full_record已兼容两种入参)。 --sort -citedby-count的短横线:argparse 会把-citedby-count当成新选项而报expected one argument;脚本已做--sort=-citedby-count的等价改写,两种写法都能用。- 给 bibliometrix 用必须
-f bib:convert2df(dbsource="scopus")只认 BibTeX,喂 CSV 会报列错或字段全空(bibliometrix 5.x 的明确变更)。API 取数链路是export -f bib→convert2df(..., format="bibtex")。 - 不传
--sort拿到的不是"最相关",是"最新":Scopus API 缺省按coverDate倒序返回。要按相关度取前 N 条必须显式--sort relevancy。已实测:同一检索式,不带sort的前 3 条是 2027 年 12 月、被引 0 的新论文;带relevancy的前 3 条才是被引较高的主题核心文献。凡用户说"最相关/highest relevance/top N by relevance",一律加这个参数。 export的速度瓶颈在逐篇 FULL 详情:约 0.25–0.5 条/秒,1000 条约 15–35 分钟。详情缓存<输出>.fullcache.jsonl让 CSV 与 BibTeX 共用,中途断了直接重跑同一条命令即可续上(已缓存的不会再扣配额)。
更多
references/query-syntax.md—— 检索式语法与全字段码(TITLE-ABS-KEY、AFFILCOUNTRY、SRCTYPE、DOCTYPE、OPENACCESS…)references/api-reference.md—— 端点/参数/view 字段清单/配额表/错误码references/recipes.md—— 典型工作流:年度趋势、作者画像、参考文献网络、对接 VOSviewer/bibliometrixreferences/credentials.md—— 凭据、校外访问 insttoken、合规与署名要求