由于工作需要震桶,今天花了一上午的時間研究了一下KEGG的API蜡吧,雖然走了不少彎路毫蚓,但最終還是圓滿完成任務。下面我將復盤整個過程昔善,和大家分享在使用KEGG API中的經歷和體會元潘。
事情的起因是這樣的,我手上有一個KEGG的ID列表君仆,我的任務是找到這些ID所對應的gene以及它們所在的pathway翩概。
我已經很多年沒有用過KEGG了牲距,剛拿到這些ID的時候也是一頭霧水。經過一番搜索(也要感謝小伙伴們的指點)钥庇,我在KEGG的網(wǎng)站上找到了這些ID以及我想要的gene和pathway信息牍鞠。
我一開始想抓這個網(wǎng)頁,解析HTML文件评姨,但是發(fā)現(xiàn)這些信息是javascript程序動態(tài)產生的难述,此路不通。在這個網(wǎng)頁的右上方有一個【Download htext】的鏈接吐句,下載后得到的是一個后綴名為 .keg 的文本文件胁后,看上去和網(wǎng)頁上的內容一樣。
如果這是個xml或者是json格式的文件嗦枢,故事就到此為止了攀芯,因為有很多現(xiàn)成的工具可以拿來解析它。但是這個文件的格式比較特殊文虏,得自己動手寫程序來提取侣诺,比較麻煩。有沒有更簡單一點的方法呢氧秘?
身為一名Rapper年鸳,不找找Bioconductor的包怎么行呢?果然有一個叫KEGGREST的包可以方便的調用KEGG的API敏储,這樣問題就變得簡單多了阻星。
https://www.bioconductor.org/packages/release/bioc/vignettes/KEGGREST/inst/doc/KEGGREST-vignette.html
但是,我高興的太早了已添!在使用KEGGREST的過程中妥箕,不斷有 Timeout was reached 的錯誤產生,真的讓人抓狂更舞!
于是我再回過頭來研究KEGGREST的原理畦幢。它實際上是先通過KEGG API下載一個文本文件,然后再去解析缆蝉。而我現(xiàn)在就卡在了調用API這一步宇葱。
弄清楚原理之后,我調整了自己的策略:首先用外部工具來調用API刊头,將文本文件保存下來黍瞧,然后用KEGGREST內部的parser來解析這些文件。
具體做法如下:
-
在不借助KEGGREST提供的keggGet函數(shù)的情況下原杂,我得先搞清楚KEGG API 的URL格式是怎樣的印颤。
http://www.kegg.jp/kegg/docs/keggapi.html
KEGG_API.png
我需要的operation是get,dbentries就是ID號穿肄,所以API的URL就可以寫成:http://rest.kegg.jp/get/K00001 -
然后用curl來調用API年局,由于我有3000多個ID际看,所以需要生成一個腳本來批量下載:
bash.png
bash腳本的內容:
curl_list.png
運行該腳本,下載過程很順利矢否。我發(fā)現(xiàn)每次下載前總是要停大概15秒左右仲闽,也許這就是前面的方法總是Timeout的原因吧。具體原因就不深究了僵朗,只要能達到我的目的就行赖欣。
curl.png -
接下來要弄清楚KEGGREST包中的哪個函數(shù)負責文本解析。通過查看keggGet函數(shù)的代碼衣迷,我覺得應該是.flatFileParser函數(shù)
code2.png -
目標明確后畏鼓,我們就來下載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)了一個parsers.R的文件壶谒,我們要找的函數(shù)就在里面。 -
最后膳沽,我們用下面的代碼來解析下載好的文本文件
code3.png
需要注意的是汗菜,這里不要再寫library(KEGGREST),直接source它的2個文件就可以了挑社。.flatFileParser返回的是一個長度為1的list陨界,list里面又嵌套了一個list。
-
最終的結果如下痛阻,任務圓滿完成菌瘪!
table.png
我的方法不一定是最好的,歡迎廣大Rapper提供更好的方法和大家分享阱当。