
经常来问我“序列不会下载”的人十有八九都被“写脚本”这三个字吓住了。实验出身的朋友一听要敲代码就觉得自己不行但你在NCBI、Ensembl、UniProt上翻来翻去拉数据拉得多了就会明白所谓“生信数据库检索脚本”本质就是把你在网页上点的那些按钮翻译成一条条网址请求。网页能做的事脚本只是把它们批量执行、保存结果而已。这篇文章就是给完全没代码基础的人准备的核心讲三件事怎么理解检索逻辑、怎么不写代码也能批量拿数据、以及一个复制粘贴就能跑的模板。看完你会发现写检索脚本真没那么玄。1. 先想清楚检索脚本的本质是“地址构造”1.1 一个网址就是一次数据库查询绝大多数主流生信数据库都提供REST接口这个词听着很唬人拆开看特别简单数据在数据库里存着你往一个固定的网址上附加参数服务器就把对应的内容返回给你。比如UniProt你在浏览器地址栏输入 https://rest.uniprot.org/uniprotkb/P04637.fasta回车页面直接显示一条FASTA格式的蛋白序列。注意你刚才没打开任何检索框没写任何代码只是输对了一个地址这就完成了一次查询。用图书馆借书来打比方你要找某本书图书馆有一套编号规则你把编号报给管理员管理员去书库把书拿给你。网址里固定的那部分比如 eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi是管理员的位置后面跟的参数db、id、rettype就是你要的书名、版本以及你要平装本还是精装本。这个概念通了生信数据库检索的原理你已经掌握了一大半。1.2 所有检索任务都能拆成四个问题动手之前先别急着打开Python或下载工具先用一句话把需求说清楚。我习惯用四问拆解查哪个数据库、目标记录有哪些、要哪些字段、输出什么格式。“我要从NCBI下载20条蛋白序列建树”拆出来就是库选protein记录是那20个accession号字段是序列格式是FASTA。“我要给50个基因补上官方全名和染色体位置”拆出来就是库选gene记录是基因名列表字段是gene name加chromosome location格式是TSV表格。这一步是整篇内容里最值钱的部分。很多人在脚本里反复报错不是语法不过关而是压根没想清楚自己要去哪个库、拿什么字段。把四问写在纸上比背十条代码语法管用得多。下面是我工作中常用的拆解示例可以直接套实际需求数据库关键命令或路径输出格式按基因名批量取RefSeq序列NCBIesearch 转 efetchFASTA给定UniProt ID取蛋白序列UniProt REST/uniprotkb/{id}.fastaFASTA批量查基因注释和位置EnsemblBioMart 或 lookup 端点TSV查某基因在数据库里有多少文献NCBIesearch 的 count 字段单个数字1.3 “先测一条”永远是最重要的习惯我见过太多人一上来就写好几十行的循环一次性跑几百个ID结果第一个ID就是错的报错信息被淹没在一大片输出里。零基础阶段请把“先测一条”当铁律先用一个确定的ID、最简单的URL在浏览器里执行一次确认返回内容确实是你要的再放到大批量环境里去跑。这条习惯能帮你省掉至少一半的排查时间后面介绍的每一种方法我都会反复强调它。2. 动手第一步数据库自带的“免代码下载入口”很多人不知道NCBI、Ensembl、UniProt这些大数据库早就给不会写代码的人准备了批量下载入口根本不用自己拼URL。第一步先学会用它们很多需求当场就解决了。2.1 NCBI的Batch Entrez粘贴ID列表就能取序列NCBI有个免代码批量下载工具叫Batch Entrez直接访问 https://www.ncbi.nlm.nih.gov/sites/batchentrez 。用法简单到令人感动选择数据库比如protein或nucleotide把你的accession号或GI号列表粘贴进去点检索NCBI会按你的ID列表逐个返回记录最后你可以把结果整体导出为FASTA或GenBank格式。列表数量大时NCBI还会把结果发到你的邮箱留一个下载链接。这个工具的适用场景是你已经有一份ID列表只想把它们对应的序列或注释批量导出来。它不需要任何脚本知识连URL长什么样都不用知道。唯一的限制是它的“一次性”每次操作都是手工粘贴、手工点导出如果这个任务你一个月做一次完全够用如果一天做五次就该看后面章节的半自动方案了。2.2 Ensembl BioMart点鼠标完成基因注释检索如果你要批量查基因注释Ensembl的BioMart是我见过最友好的免代码入口。打开 https://www.ensembl.org/biomart/martview/ 左边是数据集选择选物种比如人类基因中间是过滤条件比如输入你的基因稳定ID列表右边是输出字段外部基因名、描述、染色体位置、基因类型勾选你需要的最后点Export直接得到一个TSV文件。整个过程零代码全鼠标操作。BioMart之所以推荐给零基础的人是因为它把“四问拆解”变成了四个可视化区块你点出来的每一个选择后台都会拼成一个查询请求。这等于在帮你练“怎么把需求翻译成参数”用两三次之后你会开始理解接口的思路再去看真正的API文档一点障碍都没有。2.3 UniProt的搜索页面向导也能批量导出UniProt同理在官网的检索框里直接粘贴一串accession号比如 P04637 P69905 Q15796它会把它们识别成ID列表然后在结果页点Download选择格式和自定义字段。更隐蔽但非常好用的功能是UniProt的“Download”按钮会显示一个链接那是它自己生成的REST地址。你复制出来看看会发现其实就是 https://rest.uniprot.org/uniprotkb/stream?queryaccession:P04637ORaccession:P69905formatfasta 这样的模样。这个链接本身就是一条“脚本命令”你把它存下来以后用同样的ID格式换一批号就行。2.4 什么时候必须切换到脚本图形工具再好也有天花板每次手工重复操作、无法定时执行、结果格式不够灵活、网络环境不稳定时无法自动重试。当你发现自己每天都在重复同一套点击动作或者ID列表从几十条涨到几百条、几千条就该考虑上一套半自动或自动方案了。记住一个判断标准如果一次任务需要你手工重复操作超过半小时或者一周要重复三次以上自动化就值得做。3. 半自动Excel 浏览器就够用的“伪脚本”不急着碰Python先用你电脑上现成的工具把检索流程半自动化。这个阶段的核心思路是让Excel帮你批量生成URL让浏览器帮你验证结果再用命令行工具批量下载。3.1 用Excel把ID批量变成URL假设你在Excel的A列有一串UniProt accession号比如A2是P04637A3是P69905你想批量构造它们的FASTA下载地址。在B2单元格输入这个公式https://rest.uniprot.org/uniprotkb/A2.fasta往下拖拽填充B列立刻生成一批完整的URL。同样道理NCBI的efetch地址也可以这样拼https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?dbproteinidA2rettypefastaretmodetext这一步的意义在于你已经完成了“脚本”里最核心的循环逻辑——对每一个ID生成一条对应的请求。区别只是你用了Excel公式而不是编程语言。拿到这批URL之后复制整列到一个文本文件比如 urls.txt存好备用。几十条ID的检索工作到这里已经完成一半了。3.2 看懂返回结果JSON和XML没那么可怕你会经常看到接口返回JSON或XML格式第一次见的人容易懵。JSON长这样{count:1,idlist:[7157]}它的可读性其实很高无非是“键: 值”的集合。想看得舒服最简单的办法是安装一个浏览器JSON格式化插件或者在返回页面里按CtrlF直接搜你想要的关键字。比如用NCBI的esearch接口查TP53的gene编号https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?dbgenetermTP53[GeneName]ANDHomosapiens[Organism]retmodejson在浏览器里打开你就能在返回内容里找到 7157 这个数字这就是TP53在NCBI的gene ID。看到这里你已经理解“检索脚本”最常用的套路了先用esearch把名字变成ID再用efetch把ID变成序列。3.3 批量下载用一行命令搞定拿到 urls.txt 之后在Windows的PowerShell、macOS或Linux的终端里用wget就能批量下载wget -i urls.txt这条命令会逐个下载文件里的所有URL保存成对应的文件。Windows系统如果没装wget可以用PowerShell的循环代替或者直接安装一个图形下载工具粘贴URL列表。这一步开始接触命令行但不需要理解编程语法会复制粘贴、回车就够了。实测下来几百条以内这个方案完全轻松唯一的毛病是输出文件的命名比较难控制wget可能会按URL自动命名看起来乱但数据本身没毛病。4. 复制粘贴级Python模板不学语法也能跑如果批量下载是你的常态前面的人工方案就显得笨重了。但别怕下面这个Python模板是“复制粘贴级别”的你完全不用理解Python语法只要改开头被尖括号标出来的几处就能跑通一个从文件读ID、逐个下载序列、保存到结果文件的最小流程。4.1 环境准备十几分钟的事先到 python.org 下载Python 3安装时记得勾选“Add Python to PATH”。装完打开终端Windows就打开PowerShell确认命令能识别python --version然后安装一个用于发请求的库requests。一行命令pip install requests看到提示安装成功环境就准备好了。你不需要知道requests是什么把它理解成“帮你的Python程序发网址请求的工具包”即可。这一步看着像在写代码实际只是按说明装个软件跟装微信没有本质区别。4.2 完整模板只改三处# -*- coding: utf-8 -*- # 生信数据库批量下载模板复制粘贴版 # 你只需要修改下面尖括号里的内容 import time import requests # 你要改的地方 id_list_file ids.txt # 放ID的txt文件每行一个 output_file results.fasta # 保存结果的文件名 db_name protein # 数据库protein / nucleotide / gene # base_url https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi ids [] with open(id_list_file, r, encodingutf-8) as f: for line in f: i line.strip() if i: ids.append(i) with open(output_file, w, encodingutf-8) as out: for one_id in ids: params { db: db_name, id: one_id, rettype: fasta, retmode: text, } try: r requests.get(base_url, paramsparams, timeout30) if r.status_code 200: out.write(r.text) out.write(\n) print(完成, one_id) else: print(失败, one_id, r.status_code) except Exception as e: print(出错, one_id, e) time.sleep(0.34) # NCBI限制每秒3次请求别删这行用的时候先在ids.txt里按行写入你的accession号再把上面的代码保存成 download.py在终端里运行python download.py跑完后results.fasta里就是你批量下载的序列。模板里每一行的作用都标了中文注释你不需要理解逻辑只要知道id_list_file是输入、output_file是输出、db_name是数据库类型。剩下的都是固定套路。4.3 模板的几种实战扩展这个模板改几个地方就能衍生出一堆用法。想把多条ID合并成一次请求、减少请求次数NCBI的efetch支持用逗号分隔一批ID最多能一次传几百个把循环改成先把所有ID用逗号拼起来再发一次请求速度会快很多。想加自己的API Key、提高频率限制在params字典里加一项 api_key: 你的key。想下载的不是FASTA而是GenBank格式把rettype改成 gb 就行。想从UniProt而不是NCBI下载把base_url换成 https://rest.uniprot.org/uniprotkb/one_id.fasta连params都不用传。这些改法不需要编程基础本质就是“换数据库地址、换参数值”跟你换一个网页的搜索关键词一样。把模板文件复制几份每份对应一个常用场景以后要用直接拿出来改一行参数就能跑这就是你个人的“脚本工具箱”雏形。5. 常见错误与排查速查表跑脚本和做实验一样第一次不顺利是常态。下面是我这么多年帮人排错时遇到最多的问题整理成表直接对照排查。现象可能原因解决办法保存的文件内容全是HTML标签URL路径写错返回了错误页面先复制URL到浏览器打开确认返回内容是不是数据HTTP 429或403请求太频繁被服务器限流把time.sleep改大比如1秒有API Key就加上超时或连接中断单次请求数据量太大或网络波动把大任务拆小批一次几百条替代几千条加异常重试返回说找不到该IDaccession号写错或数据库选错去官网检索框先验证这个ID存在性注意编号版本号中文注释或文件名乱码文件编码问题确保ID文件是UTF-8编码Excel另存时选“CSV UTF-8”下载到一半中断文件缺失网络不稳定模板按ID逐个写入文件重跑一次会跳过已完成的重跑即可JSON解析报错返回内容不是JSON而是错误页面先打印r.text前500个字符看看服务器到底回了什么5.1 “返回HTML”是新手第一大坑最典型的情况是你明明用的是一条API地址保存下来却发现是一大段网页源代码里面写着类似“An error occurred while processing your request”之类的话。原因通常是端点路径写错、缺少必需参数或者老版本接口已经被迁移。排查思路只有一个把这条URL原封不动贴回浏览器地址栏看它返回的到底是什么。如果你的URL在浏览器里正常、在脚本里不对那问题一定出在脚本请求里多带或漏带了某个参数比如headers或者data。5.2 频率限制数据库也是要面子的NCBI的E-utilities在无API Key的情况下要求每秒最多3次请求Ensembl大约每秒15次UniProt相对宽松但也不是无限。别小看这些限制我见过有人写了个循环0.01秒发一次跑两分钟账号IP就被临时封了。处理办法很简单请求之间加sleep模板里的time.sleep(0.34)就是为这个准备的。如果你要做大量的合法请求去NCBI官网免费申请一个API Key不仅频率上限提高到每秒10次还附带了更好的优先级。5.3 ID体系混淆为什么明明“有”却说“没有”这类错误最隐蔽。NCBI的accession号、UniProt的accession号、Ensembl的stable ID是三个完全不同的编号体系互相之间不能直接替换。曾经有人拿着Ensembl基因号ENSG00000141510去NCBI的protein库里查当然查到404。面对这种情况先把ID放进官网自带的检索框里试一下确认它在哪个数据库里存在再回到模板里改db_name或base_url。ID后面有时还带版本号比如P04637.2旧版本没有收录也是很常见的事。5.4 数据完整性检查拿到文件不等于拿到全部数据批量下载完成后我强烈建议做两件收尾检查第一统计结果文件里的序列条数和输入的ID数量是否一致第二抽查几条序列的头部看看是不是你想要的物种和类型。一个脚本跑完就认定“结果正确”是新手最常见的误区。更稳妥的做法是在脚本里直接输出一个完成列表把失败的ID单独存到一个文件里这样下次重跑只补缺失的就好。这个习惯能帮你省去大量的回头路。6. 一些个人经验与偷懒技巧多做了几年生信支持我自己最大的体会是能跑通比跑得优雅重要一万倍。现在网上教程都喜欢把脚本写得花里胡哨但对实验出身的人来说第一步永远是“让一个最简单的东西先跑起来”。先用Batch Entrez手点一次再想办法用Excel批量拼URL最后觉得真的需要自动化再碰那个Python模板——循序渐进每一步都建立在前面已经验证过的结果上心理负担小得多。另外建议每个常用需求固定成一个模板文件文件名写清楚用途比如“NCBI_protein_fetch.py”“Ensembl_annotation_download.py”。脚本这东西三个星期不看再回来就要重新理解一遍写清楚注释、写清楚怎么改参数其实是在给未来的自己省时间。我自己的习惯是不管多简单的脚本开头必须写三行注释说明它干什么、输入什么、输出什么这个习惯救过我很多次。最后分享一个小技巧如果你只是偶尔批量下载又不想装Python可以回到第2章的BioMart和Batch Entrez再配置一个浏览器书签文件夹把常用的检索URL全部存进去。所谓“写脚本”很多时候真的就是“把常用的URL整理好、保存好、批量执行”这三件事而已。等你哪天发现这些不够用了再回头看这篇文章的模板你会发现自己早就懂了。