恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
NCBI数据库使用全攻略:从Entrez检索到SRA数据下载与上传找回
首页
资讯中心
/
NCBI数据库使用全攻略:从Entrez检索到SRA数据下载与上传找回
NCBI数据库使用全攻略:从Entrez检索到SRA数据下载与上传找回
发布时间:2026/9/27 1:18:37
生物医学领域的数据库不少但真正称得上“绕不开”的NCBI美国国家生物技术信息中心一定排在前列。不管你是做序列比对、查基因信息、下载高通量测序数据还是投稿前核对 accession number最终大概率都要回到 NCBI 这一套体系里来。我见过太多人第一次打开 NCBI 首页时一脸茫然——页面密密麻麻的链接Entrez、BLAST、SRA、GEO、PubMed 各管一摊不知道从哪下手。这篇内容就是把我这些年反复使用 NCBI 的经验整理出来从账号体系、数据检索、批量下载到上传数据后怎么找回、常见报错怎么处理尽量讲透。适合刚接触生物信息的学生、需要下载公共数据的实验人员以及想系统梳理 NCBI 使用流程的从业者。1. 先把 NCBI 这套体系的地图搞清楚很多人用 NCBI 效率低根本原因不是操作不熟而是没搞清楚它内部各个模块的分工。NCBI 不是一个单一数据库而是一组相互关联的资源集合每个子库解决一类问题。你如果把它当成“一个网站”来用就会在页面之间反复迷路。1.1 Entrez 检索系统是整个 NCBI 的入口骨架Entrez 是 NCBI 的跨库检索系统它把核酸序列、蛋白序列、基因组、文献、结构、表达数据等几十个子库统一到一套检索语法下。你在首页搜索框里输入关键词默认走的就是 Entrez 的全局检索。理解 Entrez 的关键在于两点一是它支持统一的布尔逻辑AND、OR、NOT二是它支持字段限定比如[Gene]、[Organism]、[Accession]。举个例子你想找人类 TP53 基因的参考序列直接搜TP53会返回一大堆结果混杂着文献、蛋白、变异信息。更精准的写法是TP53[Gene] AND human[Organism] AND RefSeq[Filter]这样出来的结果基本就是你要的参考序列记录。字段限定是 Entrez 最实用的技巧没有之一。常见的字段标签包括字段标签含义使用场景[Gene]基因名按基因符号检索[Organism]物种限定物种范围[Accession]登录号已知编号精确查找[Title]标题限定标题关键词[Journal]期刊文献检索[Filter]过滤器RefSeq 等子集我个人的习惯是凡是已知 accession number 的一律用[Accession]直接定位不要用关键词去猜因为关键词检索的召回率太高反而浪费时间筛选。1.2 各子库的分工与典型用途NCBI 下面常用的子库有这么几个各自定位差别很大Nucleotide核酸序列库包含 GenBank、RefSeq、EMBL、DDBJ 的数据是最常用的序列来源。Protein蛋白序列库同样整合了多个来源。Gene基因中心库把某个基因的序列、位置、表达、同源信息聚合到一个页面。Genome基因组组装数据做比较基因组、找参考基因组必用。SRASequence Read Archive原始测序读长数据高通量测序数据下载的主战场。GEO基因表达数据库芯片和 RNA-seq 的表达谱数据。PubMed文献库做文献调研绕不开。BLAST序列比对工具严格说不是数据库但和上述库深度联动。理解这些分工之后你的检索路径就清晰了找基因信息去 Gene找序列去 Nucleotide找原始数据去 SRA找表达数据去 GEO找文献去 PubMed。不要在一个库里死磕跨库跳转才是正确姿势。1.3 账号体系与 API key 的必要性NCBI 的很多操作不登录也能做但一旦涉及批量下载、高频请求、数据上传就必须有账号。注册账号本身很简单关键是申请一个API key。NCBI 对匿名请求有速率限制大约每秒 3 次而带上 API key 之后可以提升到每秒 10 次。对于需要批量抓取几百上千条记录的场景这个差别是决定性的。申请路径在账号设置里的 “API Key Management”生成后是一串字母数字组合。使用的时候在请求 URL 里加上api_key你的key即可。我强烈建议把 API key 存在环境变量里而不是硬编码在脚本中避免泄露export NCBI_API_KEY你的key然后在 Python 脚本里用os.environ.get(NCBI_API_KEY)读取。这个习惯在多人协作或者代码上传到仓库时尤其重要。2. 检索与下载从单条记录到批量抓取检索和下载是 NCBI 使用频率最高的操作但也是最容易出问题的环节。单条下载谁都会点批量下载才是真正拉开效率差距的地方。2.1 单条记录的精准定位与格式选择当你通过 Entrez 找到目标记录后页面上通常有 “Send to” 按钮可以选择下载格式。这里有个细节很多人忽略不同用途要选不同格式。只要序列本身选 FASTA。要序列加注释信息选 GenBank 或 GFF3。要结构化元数据选 XML 或 JSON。我见过有人为了做进化树下载了 GenBank 格式结果还要自己写脚本提取序列纯属多此一举。做序列比对和建树FASTA 就够了做基因结构分析才需要 GFF3 或 GenBank。另外下载 FASTA 时注意选择 “FASTA (text)” 而不是压缩包除非你一次下很多条。单条记录下压缩包反而麻烦。2.2 用 Entrez Direct 命令行工具做批量检索批量操作的核心工具是Entrez DirectEDirect这是 NCBI 官方提供的一套命令行工具包含esearch、efetch、elink、esummary等命令。它把 Entrez 的检索能力搬到了终端配合管道可以做出非常灵活的流程。安装方式以 Linux/macOS 为例sh -c $(curl -fsSL https://ftp.ncbi.nlm.nih.gov/entrez/entrezdirect/install-edirect.sh)安装完成后一个典型的批量下载流程是这样的先用esearch拿到符合条件的 ID 列表再用efetch批量取序列。esearch -db nucleotide -query TP53[Gene] AND human[Organism] AND RefSeq[Filter] \ | efetch -format fasta tp53_refseq.fasta这条命令做的事情是在 nucleotide 库里检索人类 TP53 的 RefSeq 序列然后以 FASTA 格式输出。整个过程不需要打开浏览器非常适合写进自动化脚本。如果你要下载的是特定 accession 列表可以这样cat accession_list.txt | efetch -db nucleotide -format fasta batch.fastaefetch支持从标准输入读取 accession这一点在批量处理时极其方便。2.3 用 Python 调用 Entrez API 的实操细节如果你更习惯 PythonBiopython 的Bio.Entrez模块是标准选择。基本用法from Bio import Entrez import os Entrez.email your_emailexample.com Entrez.api_key os.environ.get(NCBI_API_KEY) handle Entrez.esearch(dbnucleotide, termTP53[Gene] AND human[Organism], retmax100) record Entrez.read(handle) handle.close() id_list record[IdList] print(f找到 {len(id_list)} 条记录)这里有几个坑必须提醒第一Entrez.email必须填真实邮箱NCBI 在请求异常时会通过邮件联系你不填可能被限流甚至封禁。第二retmax默认是 20如果你要拿全部结果要么设大一点要么用retstart分页。但retmax设太大比如几十万会导致请求超时合理做法是分批取每批 500 到 1000 条。第三拿到 ID 列表后取序列要用efetch并且注意rettype和retmode的组合。比如取 FASTAhandle Entrez.efetch(dbnucleotide, idid_list, rettypefasta, retmodetext) sequences handle.read() handle.close()rettypefasta配retmodetext是取序列的标准组合别搞混。2.4 SRA 数据下载prefetch 与 fasterq-dump 的配合SRA 数据的下载逻辑和普通序列不一样因为原始测序数据体积大NCBI 提供了专门的工具链。核心是两个命令prefetch负责下载.sra文件fasterq-dump负责把.sra转成 FASTQ。prefetch SRR12345678 fasterq-dump SRR12345678 --split-files --threads 8--split-files用于双端数据会输出_1.fastq和_2.fastq两个文件。--threads指定线程数实测下来 8 线程是比较平衡的选择再往上提升有限。这里有个经验prefetch下载的.sra文件默认存在~/ncbi/public/sra/下如果你磁盘空间紧张可以用--output-directory指定到其他盘。另外fasterq-dump转换过程中会临时占用大量磁盘空间大约是最终 FASTQ 的两倍转换前务必确认空间充足否则中途失败会留下残缺文件。3. 上传数据后怎么找回账号、BioProject 与 BioSample 的关联这是很多人真正会卡住的地方——数据传上去了过段时间想下载回来却不知道怎么定位。NCBI 的数据上传不是“传个文件”那么简单它涉及一套层级结构BioProject 管项目BioSample 管样本SRA 管测序数据三者通过编号关联。3.1 上传前必须建立的三个编号在提交数据之前你需要先在 NCBI 的 Submission Portal 里创建 BioProject 和 BioSample拿到对应的 accession number然后才能提交 SRA 数据。BioProject以PRJNA开头代表一个研究项目。BioSample以SAMN开头代表一个样本。SRA accession以SRR、SRX、SRP等开头分别对应 run、experiment、study。这三者的关系是一个 BioProject 下可以有多个 BioSample一个 BioSample 可以对应多个 SRA run。理解这个层级你才能在上传后准确找回数据。3.2 通过账号后台定位自己上传的数据登录 NCBI 账号后进入 “My NCBI” 或者 Submission Portal可以看到自己提交过的所有项目。但更可靠的方式是直接记住你的 BioProject 编号然后在搜索框里用[BioProject]字段检索PRJNA123456[BioProject]这样能一次性列出该项目下所有的样本和测序数据。如果你只记得样本编号用SAMN12345678[BioSample]也能定位。我个人的习惯是每次提交完数据后把 BioProject、BioSample、SRA 三组编号记在一个单独的表格里标注清楚对应的实验内容。这个习惯在数据量大了之后能救命因为 NCBI 后台的界面并不总是直观。3.3 用 SRA Run Selector 批量导出元数据SRA Run Selector 是一个被低估的工具。当你打开一个 BioProject 页面时右上角通常有 “SRA Run Selector” 的链接。点进去之后你可以看到该项目下所有 run 的列表并且可以筛选特定条件的 run导出元数据表格CSV直接获取所有 run 的 accession 列表生成批量下载的脚本导出元数据这个功能特别实用。做荟萃分析或者需要整理样本信息时手动一个个抄 accession 效率极低用 Run Selector 导出 CSV几秒钟搞定。3.4 数据找回时的常见障碍实际操作中找回数据常遇到几个问题第一编号记混。BioProject 和 BioSample 的编号前缀相似容易搞混。记住PRJNA是项目SAMN是样本SRR是测序 run就不会错。第二数据尚未释放。如果你提交时设置了 hold until date在释放日期之前数据只有你自己能通过账号看到公开检索是搜不到的。这时候要用账号登录后从 Submission Portal 进入。第三项目被合并或拆分。偶尔会遇到 BioProject 被管理员调整的情况这时候原编号可能失效需要通过账号后台的提交记录追溯。4. 高频报错与性能问题的排查思路NCBI 用久了一定会遇到各种报错。有些是网络问题有些是请求参数问题有些是账号权限问题。这一节我把常见的几类问题整理出来给出排查路径。4.1 请求被限流429 Too Many Requests这是最常见的报错。NCBI 对请求频率有硬性限制匿名请求大约每秒 3 次带 API key 大约每秒 10 次。一旦超限服务器会返回 429 状态码。排查思路确认是否带了 API key。检查脚本里是否有循环内高频请求没有加延时。如果是批量任务加入重试机制和指数退避。一个简单的重试逻辑import time from Bio import Entrez def safe_efetch(db, id_list, retries3): for i in range(retries): try: handle Entrez.efetch(dbdb, idid_list, rettypefasta, retmodetext) return handle.read() except Exception as e: wait 2 ** i print(f请求失败{wait} 秒后重试{e}) time.sleep(wait) raise RuntimeError(重试多次仍失败)指数退避的核心是每次失败后等待时间翻倍给服务器喘息空间也避免自己的请求雪崩。4.2 efetch 返回空结果或截断有时候efetch返回的内容不完整或者干脆是空的。常见原因有几个ID 列表里有无效 accession只要有一个 ID 无效整批请求可能失败。解决办法是先验证 ID 有效性或者分批请求。rettype 和 retmode 组合不对比如取 FASTA 时用了retmodexml结果自然不对。请求量过大一次取几千条序列服务器可能截断。分批处理是王道。我的做法是每批不超过 500 条并且在解析结果时检查序列条数是否和请求的 ID 数量一致不一致就报警。4.3 SRA 下载中断与断点续传SRA 文件动辄几个 GB下载中断是家常便饭。prefetch本身支持断点续传重新运行同样的命令即可它会检查已下载的部分。但如果中断发生在fasterq-dump阶段就需要重新转换。一个实用技巧是先用prefetch把.sra文件完整下载到本地确认文件大小正常后再跑fasterq-dump。这样即使转换失败也不用重新下载。另外prefetch支持--max-size参数限制单文件大小对于超大 run 可以分块处理。不过这个参数用得不多大多数情况下直接下就行。4.4 磁盘空间与临时文件管理做生信的人对磁盘空间都有切肤之痛。NCBI 相关操作中最占空间的是 SRA 数据。一个建议是把prefetch的下载目录和fasterq-dump的临时目录分开设置并且定期清理。prefetch SRR12345678 --output-directory /data/sra fasterq-dump /data/sra/SRR12345678.sra --temp /tmp/fasterq --outdir /data/fastq--temp指定临时目录转换完成后临时文件会自动清理。但如果你中途 CtrlC临时文件可能残留需要手动清理/tmp/fasterq。5. 把 NCBI 用顺手的几个进阶习惯前面讲的都是具体操作这一节聊几个能让你长期受益的习惯。这些不是教程里会写的而是踩过坑之后总结出来的。5.1 建立自己的 accession 索引表不管你做什么方向只要频繁用 NCBI就会积累一堆常用的 accession。我的做法是维护一个 Markdown 表格记录每个 accession 对应的物种、基因、用途、下载日期。看起来笨但当你半年后想找回某个序列时这个表能省下大量检索时间。表格大概长这样Accession类型物种用途备注NM_000546RefSeq mRNAhumanTP53 参考序列建树用PRJNA123456BioProjectmouse某项目测序数据2024年提交SRR12345678SRA runhumanRNA-seq双端这个习惯的价值随时间增长而放大。5.2 用脚本封装重复操作如果你发现自己反复做同样的检索和下载就该把它脚本化了。比如“下载某物种某基因的所有 RefSeq 序列”这个操作写成一个带参数的 Python 脚本以后只需要改基因名和物种名就能复用。脚本化的另一个好处是版本可追溯。你今天怎么下的数据三个月后还能复现这在写论文方法部分时特别重要。5.3 关注数据版本与更新NCBI 的数据是动态更新的。同一个基因的 RefSeq 序列可能因为注释更新而发生变化你半年前下载的序列和现在下载的可能不一样。做正式分析时务必记录下载日期和 accession 版本号比如NM_000546.6后面的.6就是版本号。如果分析对可复现性要求高建议把下载的原始文件存档而不是每次重新下载。存档时连同下载命令一起保存这样别人能完全复现你的数据获取过程。5.4 善用 NCBI 的帮助文档和邮件支持NCBI 的官方文档其实写得相当详细尤其是 EDirect 和 Entrez API 部分很多问题在文档里都有答案。遇到实在解决不了的可以发邮件给 NCBI 的支持团队他们回复虽然慢但通常很专业。发邮件时注意把问题描述清楚用的什么工具、什么命令、完整的报错信息、你的 accession 或请求 URL。信息越全回复越快。5.5 关于数据合规的提醒最后说一点容易被忽略的从 NCBI 下载的数据尤其是涉及人类样本的要注意使用条款。有些数据是受控访问的controlled access需要申请授权才能下载和使用。公开数据open access虽然可以直接下但使用时也要遵守相应的引用规范。这个不是技术问题但作为从业者必须心里有数。我个人在实际操作中的体会是NCBI 这套体系乍看复杂但一旦把 Entrez 检索语法、EDirect 工具链、SRA 下载流程这三块打通剩下的都是细节问题。真正拉开效率差距的不是你会不会用某个功能而是你有没有把重复操作脚本化、把关键信息索引化。这两件事做到了NCBI 就从“不得不用的网站”变成了“顺手的工作台”。