左手linux,右手R,很是欢喜。老板,莫怪我拖拉工作,这叫磨刀不误砍柴工。。。

啊,原来你是这样的爬虫。

UniProt数据库

UniProt是 Universal Protein 的英文缩写,是信息最丰富、资源最广的蛋白质数据库。它由整合Swiss-Prot、 TrEMBL 和 PIR-PSD三大数据库的数据而成。我们一般用它来获取蛋白质的信息。  

下面以RpoS蛋白在Uniprot中的检索结果为例:

一共检索得到7,339个RpoS或者与RpoS相关的蛋白,每页显示25条记录。(右上角所示)。现在我们要把这七千多条记录的表格全部下载下来,要是闲的没事也可以手工copy,paste到excel中去整理。图片上所示,默认设置的是每页显示25条记录。  

我们先抓取首页的列表试试:

library(XML)#加载软件包
url1<-"http://www.uniprot.org/uniprot/?query=rpos&sort=score"#检索首页的网页地址
RpoS1<-readHTMLTable(url1,header=T, stringsAsFactors = F)#抓取列表并加上表头
str(RpoS1)#看看抓下来的是啥
## List of 1
##  $ results:'data.frame': 25 obs. of  9 variables:
##   ..$ V1: chr [1:25] "" "" "" "" ...
##   ..$ V2: chr [1:25] "P13445" "P0AEV1" "P45684" "F5ZTT9" ...
##   ..$ V3: chr [1:25] "RPOS_ECOLI" "RSSB_ECOLI" "RPOS_PSEAE" "RPOS_SALTU" ...
##   ..$ V4: chr [1:25] "" "" "" "" ...
##   ..$ V5: chr [1:25] "RNA polymerase sigma factor RpoSRNA polymerase sigma factor RpoS (Sigma S)  (Sigma-38)" "Regulator of RpoSRegulator of RpoS" "RNA polymerase sigma factor RpoSRNA polymerase sigma factor RpoS (Sigma S)  (Sigma-38)" "RNA polymerase sigma factor RpoSRNA polymerase sigma factor RpoS (Sigma S)  (Sigma-38)" ...
##   ..$ V6: chr [1:25] "rpoS appR, katF, nur, otsX, sigS rpoS appR, katF, nur, otsX, sigS, b2741, JW5437" "rssB hnr, sprE, ychL, b1235, JW1223" "rpoS PA3622" "rpoS STMUK_2913" ...
##   ..$ V7: chr [1:25] "Escherichia coli (strain K12)" "Escherichia coli (strain K12)" "Pseudomonas aeruginosa (strain ATCC 15692 / DSM 22644 / CIP 104116 / JCM 14847 / LMG 12228 / 1C / PRS 101 / PAO1)" "Salmonella typhimurium (strain ATCC 68169 / UK-1)" ...
##   ..$ V8: chr [1:25] "330" "337" "334" "330" ...
##   ..$ V9: chr [1:25] "" "" "" "" ...

现在开始批量抓取所以页面的列表信息 我们通过翻页来观察页面与网址变化的规律
如第2页的网址变为:http://www.uniprot.org/uniprot/?query=rpos&offset=25&sort=score&columns=id%2centry+name%2creviewed%2cprotein+names%2cgenes%2corganism%2clength
第3页的网址为:http://www.uniprot.org/uniprot/?query=rpos&offset=50&sort=score&columns=id%2centry+name%2creviewed%2cprotein+names%2cgenes%2corganism%2clength
规律看出来了吧:25sort,50&sort,第n页就是n*25&sort

pages<-seq(from=25,to=7339,by=25)#一共是7339条记录,每页25条
url2<-"http://www.uniprot.org/uniprot/?query=rpos&offset="
url3<-paste(url2,pages,sep = "")#合并前半段网址
ch1<-"&sort=score&columns=id%2centry+name%2creviewed%2cprotein+names%2cgenes%2corganism%2clength"
RpoS_all<-paste(url3,"ch1",sep = "")#合并后半段的网址字符
df2<-sapply(RpoS_all, readHTMLTable, header=T, stringsAsFactors=F)#将readHTMLTable函数应用到数据中的每一个网址中
df3<-do.call("rbind",df2)#合并获取的数据
write.csv(df3,"RpoS_Uniprot_data.csv")#保存数据

最后结果