使用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")
三、关键修正说明
- 强制邮箱配置:NCBI要求所有API请求必须提供有效邮箱,否则会直接拦截请求
- 批次拆分处理:将6万条ID拆分为每200条一批,符合NCBI API的单次请求上限
- 格式容错处理:统一转换ID为字符串,避免非数字ID导致的解析错误
- 摘要解析兼容:处理无摘要的文献,合并多段落摘要,避免解析中断
- 限流控制:每次请求后暂停1秒,出错时延长等待时间,降低被限流风险
- 异常捕获:捕获请求与解析过程中的错误,保证程序持续运行
四、使用注意事项
- 6万条ID的提取耗时较长,建议在后台运行(如使用nohup),避免中断
- 若出现持续限流提示,可适当延长
time.sleep的时间 - 提前校验ID列表,剔除无效值(如非数字、已被删除的ID)
内容的提问来源于stack exchange,提问作者Thulasi R
相关产品推荐
相关产品推荐

