提取基因对应的蛋白质官方名
最开始,是需要将基因跟其编码的蛋白质对应起来,找遍了各种数据库都没发现有相关的注释文件,Uniprot作为处理蛋白质的大佬,结果里都有,肯定有办法能够满足需求。
所幸的是,我完全没想用爬虫直接爬人家,而是戳了一下FAQ
发现人家有官方API,可以供我们胡作非为
Uniprot官方提供了各种API来满足各种稀奇古怪的需求
Uniprot API的使用
ID信息转换
满足我需求的最重要的部分就是各种ID信息的转换和提取
ID转换相关的页面里包含了所有的能够互相转换的各种ID
相应的,人家提供了多种不同代码的示例,以python为例:
python的示例基于python2
# 导入urllib和urllib2两个模块,用来处理各种网络请求
import urllib,urllib2
# uniprot的api端口
url = 'http://www.uniprot.org/uploadlists/'
# 提交的参数
params = {
# 将什么ID转化成什么ID, from to
# 目前没发现能够转换成多种不同的ID,只能一一转化
'from':'ACC',
'to':'P_REFSEQ_AC',
# 返回结果的格式
'format':'tab',
# 要转换的ID
'query':'P13368 P20806 Q9UM73 P97793 Q17192'
}
# 因为http传输的是bytes等,因此需要将参数转码
data = urllib.urlencode(params)
# 通过Request指定获取哪台服务器的什么信息
request = urllib2.Request(url, data)
# 你自己的邮箱,如果有问题,人家好联系(比如API使用的频率太高,人家服务器受不了)
contact = "" # Please set your email address here to help us debug in case of problems.
# 添加相应的标准提取头,不是这个信息,应该就提取不到任何信息了
request.add_header('User-Agent', 'Python %s' % contact)
# 打开url,获取服务器返回的信息
response = urllib2.urlopen(request)
# 就只读取前多少个字符
page = response.read(200000)
由于我是python3的使用者,所以,没法拿来主义,经过简单修改就正常使用了
经过对众多ID的测试之后发现,其他ID转化成ACC的时候,包含的信息量格外的多,其中就有我急需的蛋白质名称,因此,通过将一个基因名转化成ACC来测试一下看看,能不能提取到该基因编码蛋白的所有名称
#!/usr/bin/python3
# python3将urllib2拆分了,因此,从urllib里分别导入
from urllib.parse import urlencode
from urllib.request import urlopen, Request
def test(query=['TP53']):
# 依然是这个接口
url = 'http://www.uniprot.org/uploadlists/'
params = {
# 针对我最初的需求,from暂时改成gene name
'from': 'GENENAME',
# 是的,我在ACC里发现,protein name了,虽然只有推荐名,其他的名字统统没有
'to': 'ACC',
'format': 'tab',
# 以list的形式传递基因名啥的,通过join就修成需要的字符串了
'query': ' '.join(query)
}
# urlencode只是将字典形式的参数转换成字符串而已,并不能转成bytes,因此,需要多一层encode
data = urlencode(params).encode()
# 同上
request = Request(url, data)
# Please set your email address here to help us debug in case of problems.
contact = "xxxxx@gmail.com"
request.add_header('User-Agent', 'Python %s' % contact)
response = urlopen(request)
page = response.read(200000)
# 获取到的信息是bytes编码的,需要以utf-8等解码才正常读取
print(page.decode('utf-8'))
但是,解码出来的是一个以\n \t分隔的完整字符串,为了能够正常提取所需信息,需要对其进行分割
# 将API返回的结果,调用函数进行有效分割,我的用法如下
split_(page.decode('utf-8')) # 上边最后的那一行print(),就改成这么用就好了
def split_(data):
# 按行分割,如同打开一个文件按行读取
data = data.split('\n')
resutls = set()
for line in data:
# 我只要人体的
if 'Homo sapiens' in line:
# 将每一行,按照\t来分割,原因很明显,按空白符分割就分割的太碎,不利于各种信息的提取
# 数一数,就会发现,蛋白名称是每行的倒数第四列
protein_name = line.split('\t')[-4]
# 每个蛋白编码名称后边都会有一个括号的注释,比较烦,就通过分割去掉
protein_name = protein_name.split(' (')[0]
# 然后加到set里边,去除重复
results.add(protein_name)
return results
# 嫌上边的写法麻烦就改成一行实现上边的功能
def split_(data):
reutrn set(line.split('\t')[-4].split(' (')[0] for line in data if 'Homo sapiens' in line)
最终,我们就能获取到TP53基因对应的蛋白质名称了
然后通过反复的爬取,将结果储存为json,或者直接存到数据库中,方便以后的取用都方便的很
如果要用模糊匹配来验证某些东西,推荐使用fuzzyfinder和fuzzywuzzy这两个python模块
其次,还有一个mygene的模块用来提取各种基因的信息也是极妙的,配合上这个API可以做很多幺蛾子。