R语言爬取NCBI大豆基因Locus tag数据

前言

本人生信小白,爬取代码参考R语言批量爬取NCBI基因注释数据(以下简称R文)以及一份新手友好的R语言爬虫教程,函数的解释及说明可在R文中找到。
由于R文是爬取人的基因注释数据,因此我对代码做出改动以适合爬取大豆的数据,同时增加了爬取的稳定性。


以下为爬取过程:

载入要用到的包:

library(bitops)
library(RCurl)
library(stringr)
library(XML)
rm(list=ls())

因为没找到能将大豆基因的Gene symbol转换为Entrez ID的包,所以直接使用了之前转录组测序的结果,里面包含4万多个Entrez ID:

#文件位置为C盘用户的文档:
genes <- read.table("soybean_text.txt",header = T,stringsAsFactors = F)

然后获得每个基因在NCBI中的索引链接:

genes$NCBI_url <- paste("https://www.ncbi.nlm.nih.gov/gene/",genes$ENTREZID,sep="")
head(genes)

基因的entrze ID和NCBI url

(关于XML包以及xpath的知识,可参考R文,此处直接使用其代码。另外,我发现在爬取大豆 Locus tag过程中似乎不需要更改 xpath?)
调用XML包的getNodeSet()函数以及节点处理dealNodeTxt()函数:

getNodesTxt <- function(html_txt1,xpath_p){
  els1 = getNodeSet(html_txt1, xpath_p)
  # 获得Node的内容,并且去除空字符:
  els1_txt <- sapply(els1,xmlValue)[!(sapply(els1,xmlValue)=="")]
  # 去除\n:
  str_replace_all(els1_txt,"(\\n )+","")
}
dealNodeTxt <- function(NodeTxt){
  ifelse(is.character(NodeTxt)==T && length(NodeTxt)!=0 , NodeTxt , NA)
}

使用R文中精确爬取的代码(将Summary等更换为Locus tag),同时增加处理服务器无响应或请求超时以及系统停止和休眠代码

c <- 1 #无响应或请求超时初始值
for(i in 1:nrow(genes)){
temp <- try(getURL(genes[i,"NCBI_url"]),silent=FALSE) #判断 grtURL是否返回错误值
if('try-error' %in% class(temp))
{doc <-NULL
cat('第',i,'个失败!\n')
c <- c+1
}else{
doc <- temp
cat('第',i,'个成功!\n')
html_txt1 = htmlParse(doc, asText = TRUE)
# 获得Locus tag:
genes[i,"Locustag"] <- dealNodeTxt(getNodesTxt(html_txt1,'//*[@id="summaryDl"]/dd[preceding-sibling::dt[text()="Locus tag" and position()=1 ] ]'))
cat("写入Locus tag\n")
}
if(c==20){stop()} #若getURL错误20次,则停止运行
Sys.sleep(1) #睡眠1秒
}
测试:运行成功或失败
测试:两次失败后的变量
爬取结果

保存爬取结果:

write.table(genes,'soybean_test_result.txt',quote = F,row.names = F) #删除引号及行名,空格分隔

爬取结束


写在结尾
  • 建议分段爬取
  • Locus tag换成其他字符似乎就可以爬取其它注释信息(如 Gene description)
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容