BioPython Entrez获取PubMed文献ID受限问题求助
解决NCBI ESearch单次返回PMID数量限制的方法
NCBI ESearch目前对单次请求的返回结果上限调整为9999条,要获取全部PMID,需通过分页循环请求的方式,利用retstart参数指定每次请求的起始位置,分批获取后合并结果。
修改后的代码示例
from Bio import Entrez, __version__ import time print('Biopython version : ', __version__) def article_machine(t): Entrez.email = 'your_email@example.com' # 替换为你的有效邮箱,NCBI要求必填 # 先发起请求获取总结果数 handle = Entrez.esearch(db='pubmed', sort='relevance', retmax='0', # 仅获取总计数,不返回具体ID retmode='xml', term=t) search_result = Entrez.read(handle) total_count = int(search_result["Count"]) id_list = [] batch_size = 9999 # NCBI允许的单次最大返回数 # 循环分页获取所有结果 for retstart in range(0, total_count, batch_size): handle = Entrez.esearch(db='pubmed', sort='relevance', retmax=str(batch_size), retstart=str(retstart), retmode='xml', term=t) batch_result = Entrez.read(handle) id_list.extend(batch_result["IdList"]) time.sleep(1) # 遵守NCBI请求频率限制,避免IP被封禁 return id_list # 测试调用 pmids = article_machine('T cell') print(f"获取到的PMID总数: {len(pmids)}")
关键说明
- 先用
retmax='0'发起请求,仅获取总结果数Count,避免浪费请求额度 - 按
batch_size=9999分批次设置retstart,每次请求从指定位置开始返回结果 - 添加
time.sleep(1),遵守NCBI的请求频率规则(建议每秒不超过1次请求),防止IP被临时限制 - 必须替换代码中的邮箱为你自己的有效邮箱,NCBI要求提供邮箱用于追踪请求来源
内容的提问来源于stack exchange,提问作者Noamiz
相关产品推荐
相关产品推荐

