PDB文件获取方法:网站查询、FTP下载、RESTful API

搞结构生物信息,第一步就是拿到PDB文件。新手可能会觉得这事太简单了——“不就点个下载嘛?”嗯,真没那么简单。不同场景下,获取方式的选择直接影响你的工作效率和数据质量。这一章我把三种主流方法掰开揉碎了讲,每个我都踩过坑,你照着做就行。

PDB文件获取方法核心结构 PDB文件获取 网站可视化查询 FTP批量下载 RESTful API编程 浏览器交互式检索 查看结构/注释/序列 适合小批量探索 命令行/脚本批量拉取 定时同步完整PDB库 量大但格式固定 程序化精准获取 查询+下载一体 支持JSON/XML/PDB ⚠️ 选择建议 查几个结构用网站;做数据库/训练集用FTP;日常自动化流程用RESTful API

1. 网站可视化查询——最简单,也最“笨”

我最开始接触PDB的时候,就是去RCSB官网(rcsb.org)一个结构一个结构地搜。输入4-letter code,进去看3D视图、看作者、看解析方法,然后点下载。优点是直观,还能顺便检查结构质量。缺点嘛……你要是做100个靶点的虚拟筛选,手点一天都得腱鞘炎。

我个人习惯把网站查询当成“预览+验证”环节。比如从文献里看到某个蛋白的PDB ID是1AKE,我会上网站看一眼R-free值高不高、有没有缺失残基。确认没问题了,再走后面的批量方式。

实战技巧:在RCSB网站搜索框输入PDB ID后,直接按回车会跳到结构页面。URL格式是 https://www.rcsb.org/structure/1AKE,改ID就能直达。这个技巧在与人协作时特别有用——发个链接比传个文件快多了。
可视化网站特色功能适用场景
RCSB PDBJSmol/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找你喝茶。

我曾经遇到过:直接用wget递归下载,结果因为PDB服务器连接限制,半夜断连,第二天发现只下了不到10%。后来改用rsync + 断点续传,才彻底解决。rsync默认差量传输,第二次以后快得飞起。

不想全量同步?只拉特定列表也很简单。先准备一个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在FTP的路径规则是: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())
实战建议:API返回的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)
注意速率限制:PDB的REST API虽然没有明文限速,但高频请求会触发429 Too Many Requests。我在做全库元数据采集时,会在每个请求之间加0.2秒的sleep。要是跑大规模作业,最好先联系PDB团队获取专用访问权限。

三种方法的对比选择

方法优点缺点最佳实践场景
网站查询可视化、即时交互、无需编程手动操作,无法批量预览单个结构、教学、快速验证
FTP下载完整镜像、断点续传、适合全量同步需要配置客户端、查询不便离线数据库、定期镜像、大规模训练集
RESTful API程序化、可查询筛选、返回JSON需编程、有速率限制自动化流水线、动态筛选、元数据聚合

我个人的工作流是:用网站做“侦察”(看这个结构值不值得留),用RESTful API做“精准抓捕”(按条件自动下载),用FTP做“全库备案”(每月同步一次)。三种武器配合着用,才叫数据获取的老司机。