Python调用API批量下载Scopus/ScienceDirect论文PDF异常求助
问题根因
- 代码存在基础语法错误:headers字典中
'view' = 'FULL'写法错误,Python字典键值对需要用冒号分隔,正确写法为'view': 'FULL',该错误会直接导致接口参数不生效。 - 404错误核心原因:Elsevier文章检索接口仅覆盖Elsevier自有版权的出版物,你测试用的10.1038开头的DOI属于Nature出版集团,不属于Elsevier收录范围,必然返回404,和API密钥、权限无关。另外你测试用的EID为截断的无效值,合法Scopus EID为
2-s2.0-加11位数字的固定格式,长度不符合的EID请求自然返回404。 - 仅能下载第一页是接口的版权限制:非开放获取论文即便携带机构Token,普通接口也只会返回免费预览的第一页内容,并非代码逻辑问题。
解决方案
- 先做DOI范围过滤:仅保留10.1016前缀的Elsevier旗下期刊/图书DOI,其他出版社的DOI不要用该接口请求,必然报错。
- 替换为开通了文本挖掘(TDM)权限的机构Token:普通机构访问Token没有完整PDF的API拉取权限,需要机构管理员在Elsevier开发者后台为你的API Key开通TDM服务权限,才能拉取机构订阅范围内的非OA论文完整PDF。
- EID请求前先通过Scopus检索接口校验EID有效性,不要使用截断的短EID。
- 遵守Elsevier接口调用规则,请求频率不要超过每秒3次,避免被临时封禁。
注意:如果返回内容长度很短、或者文件开头不是
%PDF-标识,说明拿到的只是预览页,没有完整内容权限,不要尝试绕过限制爬取,违反平台使用条款会直接封禁API Key。
修正后的可运行代码
import requests # 请替换为自己的有效API Key和开通TDM权限的机构Token headers = { 'X-ELS-APIKEY': "替换为你的APIKEY", 'Accept': 'application/pdf', 'X-ELS-Insttoken': "替换为你的机构TDM Token", 'view': 'FULL' } _url_base = 'https://api.elsevier.com/content/article/' # 仅支持Elsevier自有版权DOI,非10.1016前缀的其他出版社DOI会返回404 doi_list = [ '10.1016/S1525-1578(10)60571-5', '10.1016/0038-1098(87)90044-5' ] for doi in doi_list: # 简单过滤非Elsevier DOI if not doi.startswith('10.1016/') and not doi.startswith('10.1016/j.'): print(f"DOI {doi} 不属于Elsevier出版,跳过") continue url = _url_base + 'doi/' + doi print(f"正在请求: {url}") res = requests.get(url, headers=headers) print(f"响应状态码: {res.status_code}") if res.status_code == 200: # 校验返回内容是否为完整PDF(PDF文件开头固定为%PDF-标识) if res.content[:5] == b'%PDF-': # 替换DOI中的斜杠避免文件名非法 filename = f"{doi.replace('/', '_')}.pdf" with open(filename, 'wb') as f: f.write(res.content) print(f"DOI {doi} 下载完成,保存为{filename}") else: print(f"DOI {doi} 仅返回预览页,当前账号无完整PDF下载权限") else: print(f"DOI {doi} 请求失败,错误信息: {res.text[:200]}")
补充说明
如果需要批量获取多出版社的开放获取论文,可以先通过OA聚合接口查找可合法下载的OA版本;非OA内容请通过机构订阅的官方渠道获取,不要通过接口强行爬取。
内容的提问来源于stack exchange,提问作者nphaibk
相关产品推荐
相关产品推荐

