提取基因?qū)牡鞍踪|(zhì)官方名
最開始泊藕,是需要將基因跟其編碼的蛋白質(zhì)對應起來载佳,找遍了各種數(shù)據(jù)庫都沒發(fā)現(xiàn)有相關的注釋文件炒事,Uniprot作為處理蛋白質(zhì)的大佬,結(jié)果里都有刚盈,肯定有辦法能夠滿足需求羡洛。
搜索TP53得到的結(jié)果頁面,明顯有各種p53的蛋白質(zhì)名稱
所幸的是藕漱,我完全沒想用爬蟲直接爬人家欲侮,而是戳了一下FAQ
發(fā)現(xiàn)人家有官方API,可以供我們胡作非為
Uniprot官方提供了各種API來滿足各種稀奇古怪的需求
各種功能的API介紹
Uniprot API的使用
ID信息轉(zhuǎn)換
滿足我需求的最重要的部分就是各種ID信息的轉(zhuǎn)換和提取
各種能夠轉(zhuǎn)換的ID肋联,上邊還有四種常用語言的示例
ID轉(zhuǎn)換相關的頁面里包含了所有的能夠互相轉(zhuǎn)換的各種ID
相應的威蕉,人家提供了多種不同代碼的示例,以python為例:
python的示例基于python2
# 導入urllib和urllib2兩個模塊橄仍,用來處理各種網(wǎng)絡請求
import urllib,urllib2
# uniprot的api端口
url = 'http://www.uniprot.org/uploadlists/'
# 提交的參數(shù)
params = {
# 將什么ID轉(zhuǎn)化成什么ID韧涨, from to
# 目前沒發(fā)現(xiàn)能夠轉(zhuǎn)換成多種不同的ID,只能一一轉(zhuǎn)化
'from':'ACC',
'to':'P_REFSEQ_AC',
# 返回結(jié)果的格式
'format':'tab',
# 要轉(zhuǎn)換的ID
'query':'P13368 P20806 Q9UM73 P97793 Q17192'
}
# 因為http傳輸?shù)氖莃ytes等侮繁,因此需要將參數(shù)轉(zhuǎn)碼
data = urllib.urlencode(params)
# 通過Request指定獲取哪臺服務器的什么信息
request = urllib2.Request(url, data)
# 你自己的郵箱虑粥,如果有問題,人家好聯(lián)系(比如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的使用者彬祖,所以茁瘦,沒法拿來主義,經(jīng)過簡單修改就正常使用了
經(jīng)過對眾多ID的測試之后發(fā)現(xiàn)储笑,其他ID轉(zhuǎn)化成ACC的時候甜熔,包含的信息量格外的多,其中就有我急需的蛋白質(zhì)名稱突倍,因此腔稀,通過將一個基因名轉(zhuǎn)化成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里發(fā)現(xiàn),protein name了拆火,雖然只有推薦名跳夭,其他的名字統(tǒng)統(tǒng)沒有
'to': 'ACC',
'format': 'tab',
# 以list的形式傳遞基因名啥的,通過join就修成需要的字符串了
'query': ' '.join(query)
}
# urlencode只是將字典形式的參數(shù)轉(zhuǎn)換成字符串而已们镜,并不能轉(zhuǎn)成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分隔的完整字符串,為了能夠正常提取所需信息嚼鹉,需要對其進行分割
print出來當然就是一個文本文件的樣子
# 將API返回的結(jié)果贩汉,調(diào)用函數(shù)進行有效分割,我的用法如下
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來分割线脚,原因很明顯赐稽,按空白符分割就分割的太碎,不利于各種信息的提取
# 數(shù)一數(shù)浑侥,就會發(fā)現(xiàn)姊舵,蛋白名稱是每行的倒數(shù)第四列
protein_name = line.split('\t')[-4]
# 每個蛋白編碼名稱后邊都會有一個括號的注釋,比較煩寓落,就通過分割去掉
protein_name = protein_name.split(' (')[0]
# 然后加到set里邊括丁,去除重復
results.add(protein_name)
return results
# 嫌上邊的寫法麻煩就改成一行實現(xiàn)上邊的功能
def split_(data):
reutrn set(line.split('\t')[-4].split(' (')[0] for line in data if 'Homo sapiens' in line)
分割的成果
最終,我們就能獲取到TP53基因?qū)牡鞍踪|(zhì)名稱了
TP53編碼蛋白的所有名稱
然后通過反復的爬取零如,將結(jié)果儲存為json躏将,或者直接存到數(shù)據(jù)庫中锄弱,方便以后的取用都方便的很
如果要用模糊匹配來驗證某些東西,推薦使用fuzzyfinder和fuzzywuzzy這兩個python模塊
其次祸憋,還有一個mygene的模塊用來提取各種基因的信息也是極妙的会宪,配合上這個API可以做很多幺蛾子。