一、Protein Data Bank
蛋白质数据库(Protein Data Bank,简称PDB)是一个专门收录蛋白质及核酸的三维构资料的数据库。由Worldwide Protein Data Bank监管。PDB可以经由网络免费访问,是结构生物学研究中的重要资源。为了确保PDB资料的完备与权威,各个主要的科学杂志、基金组织会要求科学家将自己的研究成果提交给PDB。在PDB的基础上,还发展出来若干依据不同原则对PDB结构数据进行分类的数据库,例如GO将PDB中的数据按基因进行了分类。这些资料和数据一般是世界各地的结构生物学家经由X射线晶体学或NMR光谱学验所得,并释放到公有领域供公众免费使用。
protein data bank将每一个结构信息保存为一个pdb文件,每个pdb文件有一个唯一的id号,由四位字母加数字组成,如1a1x.pdb,字母的大小写并不会影响最后的查询结果。目前为止,protein data bank收录了19万条结构信息,其中蛋白质结构信息17万条。由于实验手段的不同,同一个蛋白质会有多种不同的结构,换而言之,就是不同的pdb文件可能对应相同的蛋白质,经过筛选发现,无重复蛋白的结构信息为9万条。
以下是protein data bank的常用网站:
二、数据下载
RCSB 网站上查询下载,根据id号查询,选择下载格式即可。
根据需要还可选择下载其他格式的文件。
倘若下载大量的pdb文件,WWpdb 提供了完整的pdb的id信息,根据id信息去爬取pdb文件,PDBePISA 网站提供了爬取数据的一些规则说明。
例如爬取3gcb.pdb文件,访问的网址为:
http://www.ebi.ac.uk/pdbe/pisa/cgi-bin/multimer.pdb?3gcb:1,1
这里贴一下博主编写的爬取脚本,可能效率不太高,仅供参考:
# 创建logger对象
logger = logging.getLogger('test_logger')
# 设置日志等级
logger.setLevel(logging.DEBUG)
# 追加写入文件a ,设置utf-8编码防止中文写入乱码
test_log = logging.FileHandler('test.log', 'a', encoding='utf-8')
# 向文件输出的日志级别
test_log.setLevel(logging.DEBUG)
# 向文件输出的日志信息格式
formatter = logging.Formatter('%(asctime)s - %(filename)s - line:%(lineno)d - %(levelname)s - %(message)s -%(process)s')
test_log.setFormatter(formatter)
# 加载文件到logger对象中
logger.addHandler(test_log)
def craw_PDB(id):
url = "http://www.ebi.ac.uk/pdbe/pisa/cgi-bin/multimer.pdb?{}:1,1".format(id)
filename = filepath + "{}.pdb".format(id)
try:
logger.debug("开始爬取{}".format(id))
logger.debug(url)
response = requests.get(url, timeout=60)
# response = requests.post(url, data=url, timeout=60)
logger.info(response.status_code)
time.sleep(random.randint(1, 1)) # 暂停0~3秒的整数秒,时间区间:[0,3]
# if response.text[0] == " " or response.text[0] == "*":
# return 0
if response.status_code == 200:
with open(filename, "w") as f:
f.write(response.text)
# print("{}爬取成功".format(id))
return 1
else:
print("{}爬取失败".format(id))
logger.warning("{}出错".format(id))
return 0
except Exception as e:
logger.error("{}爬取失败".format(id))
print(e)
return 0
if __name__ == "__main__":
pis = pd.read_csv("pisces_base.csv") # 包含id信息
"""
多线程爬取pdb文件
"""
threads = []
for index, row in tqdm(pis.iterrows()):
id = row.values[0].lower()
# craw_PDB(id)
if not os.path.exists("../data/pdb/{}.pdb".format(id)):
th = threading.Thread(target=craw_PDB, args=(id,))
th.start()
threads.append(th)
if len(threads) > 10:
for th in threads:
th.join()
threads = []
需要注意的是从PDBePISA 网站上爬取的pdb文件存在无效文件,即不包含结构信息,经过统计发现, 无重复蛋白的9万条结构信息中成功爬取到结构信息的id只有5万个。
三、pdb文件格式
pdb文件的主体结构信息为:
另外更详细的格式解析可以参考如下链接:
有关PDB的文件格式,博主也还在学习过程中,有新的收获也会及时补充。