前言
本人生信小白,爬取代码参考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)