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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 16:20:42