由于工作需要,今天花了一上午的時(shí)間研究了一下KEGG的API,雖然走了不少?gòu)澛?,但最終還是圓滿完成任務(wù)。下面我將復(fù)盤(pán)整個(gè)過(guò)程,和大家分享在使用KEGG API中的經(jīng)歷和體會(huì)。
事情的起因是這樣的,我手上有一個(gè)KEGG的ID列表,我的任務(wù)是找到這些ID所對(duì)應(yīng)的gene以及它們所在的pathway。

我已經(jīng)很多年沒(méi)有用過(guò)KEGG了,剛拿到這些ID的時(shí)候也是一頭霧水。經(jīng)過(guò)一番搜索(也要感謝小伙伴們的指點(diǎn)),我在KEGG的網(wǎng)站上找到了這些ID以及我想要的gene和pathway信息。

我一開(kāi)始想抓這個(gè)網(wǎng)頁(yè),解析HTML文件,但是發(fā)現(xiàn)這些信息是javascript程序動(dòng)態(tài)產(chǎn)生的,此路不通。在這個(gè)網(wǎng)頁(yè)的右上方有一個(gè)【Download htext】的鏈接,下載后得到的是一個(gè)后綴名為 .keg 的文本文件,看上去和網(wǎng)頁(yè)上的內(nèi)容一樣。

如果這是個(gè)xml或者是json格式的文件,故事就到此為止了,因?yàn)橛泻芏喱F(xiàn)成的工具可以拿來(lái)解析它。但是這個(gè)文件的格式比較特殊,得自己動(dòng)手寫(xiě)程序來(lái)提取,比較麻煩。有沒(méi)有更簡(jiǎn)單一點(diǎn)的方法呢?
身為一名Rapper,不找找Bioconductor的包怎么行呢?果然有一個(gè)叫KEGGREST的包可以方便的調(diào)用KEGG的API,這樣問(wèn)題就變得簡(jiǎn)單多了。
https://www.bioconductor.org/packages/release/bioc/vignettes/KEGGREST/inst/doc/KEGGREST-vignette.html

但是,我高興的太早了!在使用KEGGREST的過(guò)程中,不斷有 Timeout was reached 的錯(cuò)誤產(chǎn)生,真的讓人抓狂!

于是我再回過(guò)頭來(lái)研究KEGGREST的原理。它實(shí)際上是先通過(guò)KEGG API下載一個(gè)文本文件,然后再去解析。而我現(xiàn)在就卡在了調(diào)用API這一步。
弄清楚原理之后,我調(diào)整了自己的策略:首先用外部工具來(lái)調(diào)用API,將文本文件保存下來(lái),然后用KEGGREST內(nèi)部的parser來(lái)解析這些文件。
具體做法如下:
-
在不借助KEGGREST提供的keggGet函數(shù)的情況下,我得先搞清楚KEGG API 的URL格式是怎樣的。
http://www.kegg.jp/kegg/docs/keggapi.html
KEGG_API.png
我需要的operation是get,dbentries就是ID號(hào),所以API的URL就可以寫(xiě)成:http://rest.kegg.jp/get/K00001 -
然后用curl來(lái)調(diào)用API,由于我有3000多個(gè)ID,所以需要生成一個(gè)腳本來(lái)批量下載:
bash.png
bash腳本的內(nèi)容:
curl_list.png
運(yùn)行該腳本,下載過(guò)程很順利。我發(fā)現(xiàn)每次下載前總是要停大概15秒左右,也許這就是前面的方法總是Timeout的原因吧。具體原因就不深究了,只要能達(dá)到我的目的就行。
curl.png -
接下來(lái)要弄清楚KEGGREST包中的哪個(gè)函數(shù)負(fù)責(zé)文本解析。通過(guò)查看keggGet函數(shù)的代碼,我覺(jué)得應(yīng)該是.flatFileParser函數(shù)
code2.png -
目標(biāo)明確后,我們就來(lái)下載KEGGREST的源代碼(Package Source)
https://www.bioconductor.org/packages/release/bioc/html/KEGGREST.html
package_source.png
將KEGGREST_1.14.0.tar.gz解壓后,我在它的R目錄下發(fā)現(xiàn)了一個(gè)parsers.R的文件,我們要找的函數(shù)就在里面。 -
最后,我們用下面的代碼來(lái)解析下載好的文本文件
code3.png
需要注意的是,這里不要再寫(xiě)library(KEGGREST),直接source它的2個(gè)文件就可以了。.flatFileParser返回的是一個(gè)長(zhǎng)度為1的list,list里面又嵌套了一個(gè)list。
-
最終的結(jié)果如下,任務(wù)圓滿完成!
table.png
我的方法不一定是最好的,歡迎廣大Rapper提供更好的方法和大家分享。








