Python requests调用Elsevier SciVal接口报未授权错误解决求助
问题原因
该接口近期新增了请求合法性校验规则,仅携带API Key的简单请求会被判定为非法爬虫请求拦截,返回鉴权失败。浏览器访问时会自动携带完整的合规请求头,因此可以正常获取数据。
调整方案
- 调整API Key传递方式:官方推荐将API Key放在请求头字段
X-ELS-APIKey中传递,而非直接拼接在URL查询参数内,避免参数被中间链路拦截识别。 - 补充模拟浏览器的请求头,绕过服务端的爬虫拦截校验。
可用代码示例
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
相关产品推荐
相关产品推荐

