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

Python requests调用Elsevier SciVal接口报未授权错误解决求助

问题原因

该接口近期新增了请求合法性校验规则,仅携带API Key的简单请求会被判定为非法爬虫请求拦截,返回鉴权失败。浏览器访问时会自动携带完整的合规请求头,因此可以正常获取数据。

调整方案
  1. 调整API Key传递方式:官方推荐将API Key放在请求头字段X-ELS-APIKey中传递,而非直接拼接在URL查询参数内,避免参数被中间链路拦截识别。
  2. 补充模拟浏览器的请求头,绕过服务端的爬虫拦截校验。
可用代码示例
import requests

# 替换为你自己申请的有效API_KEY
API_KEY = "你的API Key"
# 如有申请到的access_token,解开下方注释并填入值
# ACCESS_TOKEN = "你的access_token"

BASE_URL = "https://api.elsevier.com/analytics/scival/institution/metrics"

# 请求参数单独配置,不包含apiKey
request_params = {
    "metricTypes": "ScholarlyOutput",
    "institutionIds": "508175,508076",
    "yearRange": "5yrs",
    "includeSelfCitations": "true",
    "byYear": "true",
    "includedDocs": "AllPublicationTypes",
    "journalImpactType": "CiteScore",
    "showAsFieldWeighted": "false"
}

# 请求头配置,核心校验字段为X-ELS-APIKey和User-Agent
request_headers = {
    "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36",
    "Accept": "application/json",
    "X-ELS-APIKey": API_KEY
    # 如有access_token,添加下方字段
    # "X-ELS-AuthenticationToken": ACCESS_TOKEN
}

with requests.Session() as session:
    resp = session.get(
        url=BASE_URL,
        params=request_params,
        headers=request_headers
    )
    if resp.status_code == 200:
        data = resp.json()
        # 后续处理数据逻辑
        print(data)
    else:
        print(f"请求异常,状态码:{resp.status_code},返回内容:{resp.text}")
异常排查点
  • 确认你申请的API Key已经开通SciVal Institution API的访问权限,默认申请的API Key可能仅开放了文献检索类接口权限
  • 若你的API Key配置了IP白名单,确认当前运行代码的设备公网IP在白名单范围内
  • 若以上配置依然报错,可以打开浏览器开发者工具的网络面板,找到直接访问接口时的请求,将所有请求头字段复制到代码的request_headers中逐一测试,即可定位缺失的校验字段

内容的提问来源于stack exchange,提问作者NaejF

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 16:24:05