【aRsenal-3】KEGG API

由于工作需要,今天花了一上午的时间研究了一下KEGG的API,虽然走了不少弯路,但最终还是圆满完成任务。下面我将复盘整个过程,和大家分享在使用KEGG API中的经历和体会。

事情的起因是这样的,我手上有一个KEGG的ID列表,我的任务是找到这些ID所对应的gene以及它们所在的pathway。


KO_list.png

我已经很多年没有用过KEGG了,刚拿到这些ID的时候也是一头雾水。经过一番搜索(也要感谢小伙伴们的指点),我在KEGG的网站上找到了这些ID以及我想要的gene和pathway信息。


keg_web.png

我一开始想抓这个网页,解析HTML文件,但是发现这些信息是javascript程序动态产生的,此路不通。在这个网页的右上方有一个【Download htext】的链接,下载后得到的是一个后缀名为 .keg 的文本文件,看上去和网页上的内容一样。


keg.png

如果这是个xml或者是json格式的文件,故事就到此为止了,因为有很多现成的工具可以拿来解析它。但是这个文件的格式比较特殊,得自己动手写程序来提取,比较麻烦。有没有更简单一点的方法呢?

身为一名Rapper,不找找Bioconductor的包怎么行呢?果然有一个叫KEGGREST的包可以方便的调用KEGG的API,这样问题就变得简单多了。
https://www.bioconductor.org/packages/release/bioc/vignettes/KEGGREST/inst/doc/KEGGREST-vignette.html

KEGGREST.png

但是,我高兴的太早了!在使用KEGGREST的过程中,不断有 Timeout was reached 的错误产生,真的让人抓狂!


code1.png

于是我再回过头来研究KEGGREST的原理。它实际上是先通过KEGG API下载一个文本文件,然后再去解析。而我现在就卡在了调用API这一步。

弄清楚原理之后,我调整了自己的策略:首先用外部工具来调用API,将文本文件保存下来,然后用KEGGREST内部的parser来解析这些文件。

具体做法如下:

  1. 在不借助KEGGREST提供的keggGet函数的情况下,我得先搞清楚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

  2. 然后用curl来调用API,由于我有3000多个ID,所以需要生成一个脚本来批量下载:


    bash.png

    bash脚本的内容:


    curl_list.png

    运行该脚本,下载过程很顺利。我发现每次下载前总是要停大概15秒左右,也许这就是前面的方法总是Timeout的原因吧。具体原因就不深究了,只要能达到我的目的就行。
    curl.png
  3. 接下来要弄清楚KEGGREST包中的哪个函数负责文本解析。通过查看keggGet函数的代码,我觉得应该是.flatFileParser函数


    code2.png
  4. 目标明确后,我们就来下载KEGGREST的源代码(Package Source)
    https://www.bioconductor.org/packages/release/bioc/html/KEGGREST.html

    package_source.png

    将KEGGREST_1.14.0.tar.gz解压后,我在它的R目录下发现了一个parsers.R的文件,我们要找的函数就在里面。

  5. 最后,我们用下面的代码来解析下载好的文本文件


    code3.png

    需要注意的是,这里不要再写library(KEGGREST),直接source它的2个文件就可以了。.flatFileParser返回的是一个长度为1的list,list里面又嵌套了一个list。

  6. 最终的结果如下,任务圆满完成!


    table.png

我的方法不一定是最好的,欢迎广大Rapper提供更好的方法和大家分享。

qrcode.jpg

你可能感兴趣的:(【aRsenal-3】KEGG API)