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

使用BioPython从PubMed批量提取6万篇文献摘要的代码问题求助

解决PubMed批量提取6万篇文献摘要的问题

一、原代码常见问题排查

导致仅获取部分摘要或空字典的核心原因通常包括:

  • 未配置NCBI要求的必填邮箱,触发API限流/拦截
  • 单次请求提交过多ID(NCBI限制单次最多200个ID)
  • PubMed ID格式不规范(含非数字字符、空值,或未转换为字符串)
  • 未处理无摘要的文献,解析逻辑直接报错中断
  • 未控制请求频率,触发NCBI反爬限制
  • XML解析逻辑错误,未正确定位<AbstractText>标签

二、修正后的完整代码

使用BioPython的Entrez库实现稳定批量提取,先安装依赖:

pip install biopython
from Bio import Entrez
import time
import csv

# 必须配置邮箱(NCBI API强制要求,否则会被限流)
Entrez.email = "your_work_email@domain.com"
Entrez.tool = "BatchPubMedAbstractExtractor"

def fetch_pubmed_abstracts(pmid_list, batch_size=200):
    abstract_dict = {}
    total_ids = len(pmid_list)

    # 拆分ID为批次,符合NCBI单次请求限制
    for idx in range(0, total_ids, batch_size):
        current_batch = pmid_list[idx:idx+batch_size]
        # 统一转换为字符串,避免格式解析错误
        batch_str = ",".join(map(str, current_batch))

        try:
            # 请求PubMed XML数据
            handle = Entrez.efetch(db="pubmed", id=batch_str, retmode="xml")
            records = Entrez.read(handle)
            handle.close()

            # 逐条解析摘要
            for record in records["PubmedArticle"]:
                pmid = record["MedlineCitation"]["PMID"]
                # 处理无摘要的文献
                if "Abstract" in record["MedlineCitation"]["Article"]:
                    abstract_content = record["MedlineCitation"]["Article"]["Abstract"]["AbstractText"]
                    # 合并多段落摘要(部分文献摘要分多个节点)
                    if isinstance(abstract_content, list):
                        abstract_content = " ".join([text for text in abstract_content])
                else:
                    abstract_content = ""
                abstract_dict[pmid] = abstract_content

            # 控制请求频率,避免触发限流
            time.sleep(1)
            # 打印进度
            print(f"已完成: {min(idx+batch_size, total_ids)}/{total_ids}")

        except Exception as e:
            print(f"批次 {idx}-{idx+batch_size} 处理失败: {str(e)}")
            time.sleep(5)  # 出错后延长等待时间,避免连续触发限制

    return abstract_dict

def export_to_tsv(abstract_dict, output_path):
    # 导出为制表符分隔文本文件
    with open(output_path, "w", encoding="utf-8", newline="") as f:
        writer = csv.writer(f, delimiter="\t")
        writer.writerow(["PubMed_ID", "Abstract"])  # 写入表头
        for pmid, abstract in abstract_dict.items():
            writer.writerow([pmid, abstract])

# 示例ID列表(替换为你的6万条ID)
sample_pmids = [31234567, 32345678, 33456789]

# 执行提取与导出
abstracts = fetch_pubmed_abstracts(sample_pmids)
export_to_tsv(abstracts, "pubmed_abstracts.tsv")

三、关键修正说明

  1. 强制邮箱配置:NCBI要求所有API请求必须提供有效邮箱,否则会直接拦截请求
  2. 批次拆分处理:将6万条ID拆分为每200条一批,符合NCBI API的单次请求上限
  3. 格式容错处理:统一转换ID为字符串,避免非数字ID导致的解析错误
  4. 摘要解析兼容:处理无摘要的文献,合并多段落摘要,避免解析中断
  5. 限流控制:每次请求后暂停1秒,出错时延长等待时间,降低被限流风险
  6. 异常捕获:捕获请求与解析过程中的错误,保证程序持续运行

四、使用注意事项

  • 6万条ID的提取耗时较长,建议在后台运行(如使用nohup),避免中断
  • 若出现持续限流提示,可适当延长time.sleep的时间
  • 提前校验ID列表,剔除无效值(如非数字、已被删除的ID)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 20:39:22