注意:本方法使用了python,下载速度一般,如果需要更快的大批量下载可以考虑使用其他方法,例如FTP
Alphafold数据库其实提供了许多物种的蛋白质组:
AlphaFold Protein Structure Database
但是如果你搜索的物种不在这个列表中,或者你想要根据关键词搜索一些内容,可以考虑本方法:
首先获取蛋白质ID列表,因为Uniprot数据库和AlphaFold数据库有联动,我们可以先在Uniprot上进行下载蛋白质的序列文件
然后下载fasta,将文件保存为xxxx_protein.fasta
运行以下代码,会生成这些蛋白质ID所对应的alphafold数据库pdb文件的下载连接,并将其保存到url_list.txt文件中:
with open("xxxx_protein.fasta","r") as fin:
with open("url_list.txt","w+") as fout:
lines = fin.readlines()
for line in lines:
if line.startswith(">"):
url = "https://alphafold.ebi.ac.uk/files/AF-"+line.split("|")[1]+"-F1-model_v4.pdb\n"
fout.write(url)
fout.close()
fin.close()
接着我们就可以使用selenium,逐一访问这些网址,就可以下载文件了
当然,运行下列代码的时候先需要pip install selenium:
(这里的webdriver可以选取你电脑上已经安装好的浏览器,selenium具体支持的浏览器可以在官方文档中查看:支持的浏览器列表 | Selenium)
from selenium import webdriver
with open('url_list.txt', 'r') as f:
urls = f.readlines()
driver = webdriver.Edge()
i=0
for url in urls:
i+=1
print(i)
result = driver.get(url)
但是仍然可能有一些蛋白质会因为网络问题下载失败,出现这种奇奇怪怪的名称:
这里提供了一个check代码,来继续把未完成下载的蛋白质下载完成:
import os
from selenium import webdriver
# 这里填写你的Edge浏览器的默认下载路径
dir_path = "C:\\Users\\用户名\\Downloads\\"
st = set()
with open('url_list.txt', 'r') as f:
file_list = os.listdir(dir_path)
for filename in file_list:
if filename.startswith("AF"):
st.add(filename.split("-")[1])
urls = f.readlines()
driver = webdriver.Edge()
for url in urls:
pid = url.split("/")[-1].split("-")[1]
if pid not in st:
print(pid)
result = driver.get(url)
当然,还有一些蛋白质在AlphaFold数据库中没有预测数据的,我们还可以对比一下Uniprot和AlphaFold两个数据库的区别,下面以Bacillus subtilis (strain 168)这个物种为例:
这种没有结构数据的蛋白处理方式很多,你可以直接不管,也可以用在线的AlphaFold跑一遍(如果你确实需要研究一个物种的完整蛋白质组的话)
虽然说用了Selenium,但许多Selenium的特性功能并没有用到,因为AlphaFold网站加载很慢,如果直接在AlphaFold网站上搜索,去爬取这些蛋白质ID,反而会变得很慢。所以索性直接通过Uniprot网站上的数据来获取到蛋白质ID。这样甚至连路径解析都不需要用到,直接通过访问资源网页就解决了。