PDB文件获取方法:网站查询、FTP下载、RESTful API
搞结构生物信息,第一步就是拿到PDB文件。新手可能会觉得这事太简单了——“不就点个下载嘛?”嗯,真没那么简单。不同场景下,获取方式的选择直接影响你的工作效率和数据质量。这一章我把三种主流方法掰开揉碎了讲,每个我都踩过坑,你照着做就行。
1. 网站可视化查询——最简单,也最“笨”
我最开始接触PDB的时候,就是去RCSB官网(rcsb.org)一个结构一个结构地搜。输入4-letter code,进去看3D视图、看作者、看解析方法,然后点下载。优点是直观,还能顺便检查结构质量。缺点嘛……你要是做100个靶点的虚拟筛选,手点一天都得腱鞘炎。
我个人习惯把网站查询当成“预览+验证”环节。比如从文献里看到某个蛋白的PDB ID是1AKE,我会上网站看一眼R-free值高不高、有没有缺失残基。确认没问题了,再走后面的批量方式。
https://www.rcsb.org/structure/1AKE,改ID就能直达。这个技巧在与人协作时特别有用——发个链接比传个文件快多了。
| 可视化网站 | 特色功能 | 适用场景 |
|---|---|---|
| RCSB PDB | JSmol/NGL查看器,序列比对 | 日常浏览、教学演示 |
| PDBe | 欧洲镜像,支持PISA接口分析 | 侧重结构生物学研究 |
| PDBj | 日本镜像,中文/日文支持 | 亚洲用户,网络延迟低 |
2. FTP批量下载——数据管家的老派浪漫
你想一下,如果要做基于所有PDB结构的机器学习模型,一个一个下载现实吗?这时候就得靠FTP。PDB主站提供了完整的FTP镜像:ftp://ftp.wwpdb.org。登录用匿名即可,密码留空或填邮箱。
我当年做非冗余结构集合时,就是靠rsync同步整个PDB库的。命令很简单:
rsync -avz --progress rsync://rsync.wwpdb.org::pdb_data/structures/divided/pdb/ /local/pdb/divided/
这个命令会同步所有分块的pdb.gz文件。为什么用分块?因为整个PDB已经超过20万条了,用divided目录结构按四字母代码首两字符分文件夹,拉取更可控。嗯,你要注意网络消耗,第一次同步别在办公网高峰时段跑,小心IT找你喝茶。
不想全量同步?只拉特定列表也很简单。先准备一个ids.txt文件,每行一个PDB ID:
1AKE
2GB1
3PGK
4HHB
然后写个for循环拼接路径:
for id in $(cat ids.txt); do
wget ftp://ftp.wwpdb.org/pub/pdb/data/structures/divided/pdb/${id:1:2}/pdb${id}.ent.gz
done
pdb数据目录/structures/divided/pdb/{首两个小写字符}/pdb{ID}.ent.gz。注意ID是小写,文件前缀是"pdb",后缀是".ent.gz"。这个规律我背得滚瓜烂熟。
3. RESTful API编程——现代数据科学家的标配
网站和FTP都太“死”了。你想想,如果我想按“分辨率<2.0Å,且来自X射线衍射,且物种是Homo sapiens”的条件批量获取结构,怎么办?难道去网站筛选然后一个一个记ID?当然不。RESTful API就是干这个的。
PDB官方提供了统一的REST API,端点一般是:https://data.rcsb.org/rest/v1/。最常用的是两个接口:
- 查询接口:通过GraphQL或简单的URL参数搜索PDB条目
- 获取接口:直接通过PDB ID拉取元数据或文件
拿Python举例,获取一个结构的完整元数据:
import requests
import json
pdb_id = "1AKE"
url = f"https://data.rcsb.org/rest/v1/core/entry/{pdb_id}"
response = requests.get(url)
data = response.json()
print(data["struct"]["title"]) # 打印结构标题
print(data["rcsb_entry_info"]["resolution_combined"]) # 打印分辨率
想要更复杂的筛选?用GraphQL接口:
url = "https://data.rcsb.org/graphql"
query = """
{
entries(entry_ids: ["1AKE", "2GB1"]) {
rcsb_id
struct {
title
}
exptl {
method
}
}
}
"""
r = requests.post(url, json={"query": query})
print(r.json())
curl https://data.rcsb.org/rest/v1/core/entry/1AKE | python -m json.tool查看字段全貌。或者用在线工具(比如postman)慢慢探索。
如果要直接下载PDB文件本体,不需要走FTP了,API也能干:
pdb_id = "1AKE"
url = f"https://files.rcsb.org/download/{pdb_id}.pdb"
response = requests.get(url)
with open(f"{pdb_id}.pdb", "w") as f:
f.write(response.text)
三种方法的对比选择
| 方法 | 优点 | 缺点 | 最佳实践场景 |
|---|---|---|---|
| 网站查询 | 可视化、即时交互、无需编程 | 手动操作,无法批量 | 预览单个结构、教学、快速验证 |
| FTP下载 | 完整镜像、断点续传、适合全量同步 | 需要配置客户端、查询不便 | 离线数据库、定期镜像、大规模训练集 |
| RESTful API | 程序化、可查询筛选、返回JSON | 需编程、有速率限制 | 自动化流水线、动态筛选、元数据聚合 |
我个人的工作流是:用网站做“侦察”(看这个结构值不值得留),用RESTful API做“精准抓捕”(按条件自动下载),用FTP做“全库备案”(每月同步一次)。三种武器配合着用,才叫数据获取的老司机。