使用pybliometrics获取共同作者时偶发Scopus500Error的原因及解决方法
Scopus500Error报错原因与解决方案
完整报错信息:
Traceback (most recent call last): File "G:\dissertationdatabase\iteration3\iteration3.py", line 16, in <module> coauthors = pd.DataFrame(au.get_coauthors()) File "C:\ProgramData\Miniconda3\lib\site-packages\pybliometrics\scopus\author_retrieval.py", line 289, in get_coauthors res = get_content(url, api="AuthorSearch") File "C:\ProgramData\Miniconda3\lib\site-packages\pybliometrics\scopus\utils\get_content.py", line 97, in get_content raise errors[resp.status_code](reason) Scopus500Error: Error calling Solr Search Service
报错原因
- 服务端临时异常:500级错误属于服务端内部错误,和本地代码逻辑无关,偶发的核心原因是Scopus服务器瞬时负载过高、接口内部调用超时、后台临时维护,所以会出现有时正常运行、有时报错的随机现象。
- 请求触发服务端隐性限制:如果查询的作者发文量极大、单次请求需要检索的数据量超过服务端内置阈值,就有可能触发Solr搜索服务的异常分支,返回该报错。
解决方案
- 新增异常重试逻辑:在调用
get_coauthors()的外层增加异常捕获和重试机制,设置合理的重试间隔和次数,参考代码如下:
import time import pandas as pd from pybliometrics.scopus.exception import Scopus500Error max_retry = 3 retry_count = 0 coauthors = None while retry_count < max_retry: try: coauthors = pd.DataFrame(au.get_coauthors()) break except Scopus500Error: retry_count += 1 time.sleep(3) # 每次重试间隔3秒,可自行调整 if retry_count == max_retry: raise
- 降低请求速率:如果是批量查询多名作者的共同作者,在两次请求之间加1-2秒的等待时间,避免短时间内请求量过大触发服务端负载过高。
- 拆分大数据量请求:如果查询的作者发文量超过1000篇,可以先按年份分段查询该作者的论文,再分段统计共同作者后合并,避免单次请求处理数据量过大触发报错。
- 更换运行时间段:如果工作日频繁报错,可以选择Scopus服务负载较低的时段(非工作日、欧美地区深夜时段)运行脚本,可大幅降低偶发服务端错误的概率。
内容的提问来源于stack exchange,提问作者Guiyu CHEN
相关产品推荐
相关产品推荐

