在海量的組學(xué)數(shù)據(jù)中唆缴,我們經(jīng)常需要根據(jù)已有的差異表達(dá)基因找到對(duì)應(yīng)的注釋信息。那么針對(duì)一系列基因ID批量獲取其注釋無疑能夠大大簡(jiǎn)化后繼的分析,提高科研效率深胳。本次來分享使用python爬蟲完成NCBI基因注釋的方法。
Sample input: 輸入文件如下宁仔,是一列g(shù)eneID稠屠。
待獲取的信息來源于NCBI-geneID頁中Description項(xiàng),也就是下圖中紅色方框項(xiàng):
Sample output: 最終輸出結(jié)果如下
下面講解一下思路流程:
1. 逐行讀取xls文件列名并獲取基因ID榨了。
2. NCBI搜索基因ID,進(jìn)入網(wǎng)站并獲取注釋信息攘蔽。
3. 記錄注釋信息并逐行保存在xls文件中龙屉。
所使用的python API:
urllib 獲取網(wǎng)頁信息。
pandas 讀取xls格式輸入文件满俗。
tqdm 可視geneID注釋信息獲取進(jìn)度转捕。
re 正則表達(dá)式找到網(wǎng)頁URL對(duì)應(yīng)的信息行。
下面我們分步完成:
Step1:逐行讀取xls文件列名并獲取基因ID
首先唆垃,因?yàn)槲覀兊妮斎胛募莤ls格式的五芝,我們需要通過pandas包將輸入數(shù)據(jù)讀入計(jì)算機(jī)內(nèi)存中。在這里定義了read_xlsx方法辕万,通過輸入文件路徑(path)枢步,輸入文件中的工作表名稱(sheetname),該工作表中待獲取的列數(shù)(i)渐尿。最終以數(shù)組形式返回基因ID醉途,可供后繼遍歷使用。
# 1.逐行讀取xls文件列名并獲取基因ID
def read_xlsx(path, sheetname,i):
sheet = pd.read_excel(path, sheetname)
geneID = []
for row in sheet.index.values:
geneID.append(sheet.iloc[row, i-1])
return geneID
Step2:NCBI搜索基因ID砖茸,進(jìn)入網(wǎng)站并獲取注釋信息隘擎。
將Step1中得到的geneID數(shù)組作為Step2的輸入數(shù)據(jù)。逐行讀取geneID凉夯,并將獲得的geneID保存到變量i中并傳入"https://www.ncbi.nlm.nih.gov/gene/?term={i}"货葬,這樣相當(dāng)于獲得了每一個(gè)geneID在NCBI的信息頁。
此時(shí)恍涂,我們使用urllib包的request打開剛剛得到的url宝惰,獲取網(wǎng)頁信息并保存到content 中(decode用于html解碼)。
最后使用正則表達(dá)式re.findall匹配注釋信息(Description)所在的模式行:<dd>(.*?)</dd>再沧。這是所獲取的信息就是Description尼夺,我們將它保存在p中并輸出到數(shù)組infoID中。
# 2.NCBI搜索基因ID炒瘸,找到注釋信息
def get_infoID(GeneID):
infoID = []
for i in tqdm(GeneID):
url = f'https://www.ncbi.nlm.nih.gov/gene/?term={i}' # 查找基因的網(wǎng)址
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36"
}
request = urllib.request.Request(url, headers=headers)
response = urllib.request.urlopen(request)
content = response.read().decode('utf-8')
p = re.findall('<dd>(.*?)</dd>', content)[0]# (.*?)為正則表達(dá)式的目標(biāo)區(qū)域
infoID.append(p)
return infoID
Step3:運(yùn)行上述代碼淤堵,記錄注釋信息并逐行保存在xls文件中。
輸入文件的路徑為"C:/Users/Administrator/Desktop/gene-NCBI_NO.xlsx"顷扩,而geneID信息保存在此表中的“218”工作表的第一列拐邪。
分別執(zhí)行Step1和Step2。
最后使用pandas的ExcelWriter寫入新的excel之中隘截。
if __name__ == '__main__':
# 1.逐行讀取xls文件列名并獲取基因ID
GeneID = read_xlsx("C:/Users/Administrator/Desktop/gene-NCBI_NO.xlsx", "218", 1)
print("讀取基因標(biāo)簽完畢扎阶,正在獲取基因注釋汹胃!")
# 2.NCBI搜索基因ID,找到注釋信息
infoID = get_infoID(GeneID)
print("基因注釋獲取完畢东臀,正在生成注釋表格着饥!")
# 3.記錄注釋信息并逐行保存在xls文件中
df = pd.DataFrame({'GeneID': GeneID, 'Description': infoID})
writer = pd.ExcelWriter('C:/Users/Administrator/Desktop/218_with_Description.xls')
df.fillna(' ', inplace=True) # 文本空格消除掉
df.to_excel(writer, sheet_name='218', index=False)
writer.save()
print("完成")
總結(jié)
本篇博客分享了使用Python語言實(shí)現(xiàn)NCBI爬蟲獲取基因注釋的方法。當(dāng)然惰赋,對(duì)于基因功能宰掉,分子組分和通路注釋的方法,在生物信息學(xué)方面有對(duì)應(yīng)的GO和KEGG注釋可以實(shí)現(xiàn)并且可視化赁濒。亦可采用R來解決轨奄,實(shí)現(xiàn)的方法很豐富。
在本篇博客以代碼實(shí)現(xiàn)為主拒炎,對(duì)于python爬蟲的實(shí)現(xiàn)原理講解相對(duì)較少挪拟。實(shí)現(xiàn)網(wǎng)站爬蟲需要了解html開發(fā)者模式,re正則表達(dá)式等等击你,有興趣的小伙伴可以自行學(xué)習(xí)舞丛,或者在下方評(píng)論區(qū)討論~