第一次使用R爬取自己所需要的数据

打开网站

http://rice.hzau.edu.cn/rice/clone/list.php?page=1&searchword=

image.png

我想找水稻中已经克隆了的基因,要我一页一页复制粘贴吗?哇,300多页,怕是要死人哦!
于是我突然记得有一次我见过有人用R爬取过html网站的数据,我想应该会类似,于是打开我的收藏文件,找到该帖子从CAZy database中爬取数据+多恶心的数据都要坚持清洗,
立马就现学现用。首先照着敲了一遍,其实就是从这里学会了一个新R包XML。

  • 1、找规律——

page1的链接是这样的

http://rice.hzau.edu.cn/rice/clone/list.php?page=1

page2的链接是这样的

http://rice.hzau.edu.cn/rice/clone/list.php?page=2

于是不就得出规律了吗?只要把第一页的数据清洗出来,后面使用循环就好了?动手就做。

library(XML)  ## 导入我们所需要的R包
library(tidyverse) ## 数据筛选用
url1 <- "http://rice.hzau.edu.cn/rice/clone/list.php?page=1"  ## 获取url链接
df1 <- readHTMLTable(url1,header=T,stringAsFactors=F)   ## 读取页面数据
raw_data <- as.data.frame(df1[[1]]) ## 从readHTMLTable得到的list挑选出我所需要的那个list 见下图
select(raw_data,V3:V11) -> df1 ## 只要第三列以及以后的列
na.omit(df1) -> df1  ## 去除缺失的列,
colnames(df1) <- c("Gene","Gene_Symbol","Method_of_isolation","Chr","MSU_ID","MH63_ID","ZS97_ID","Same_or_not_in_MH63_ZS97","Fuction")  ## 赋值列名
df1[-1,] -> df1 ## 去除第一行,原本的列名,但是中间又空格,可以自己清洗然后再直接变为列名。
从readHTMLTable得到的list挑选出我所需要的那个list

于是就清洗完了第一页。结果与我们的第一列的内容一毛一样


于是开始建立函数

get_data <- function(i){
  url <- paste("http://rice.hzau.edu.cn/rice/clone/list.php?page=", i, sep = "")
  data <- readHTMLTable(url,header=T,stringAsFactors=F)
  raw_data <- as.data.frame(data[[1]])
  select(raw_data,V3:V11) -> data
  na.omit(data) -> data
  colnames(data) <- c("Gene","Gene_Symbol","Method_of_isolation","Chr","MSU_ID","MH63_ID","ZS97_ID","Same_or_not_in_MH63_ZS97","Fuction")
  data[-1,] -> data
}

实践一下函数, 没毛病

View(get_data(1))
image.png

于是利用for循环得到317个页面的数据,并合并到一个数据中

data_result <- data.frame()
for (i in c(1:317)) {
  data <- paste("data", i, sep = "")
  get_data(i) -> data
  rbind(data_result,data) -> data_result
}

最后查看我们的data_result文件,没毛病,4563个克隆的基因

View(data_result)
image.png

为了进一步确认结果,查看最后几个基因是否与最后一页的内容一致? 也是一毛一样


image.png

image.png

可怜我以前不懂事,还特异去一个个查看,基因是否已经被克隆。这下得到了数据库的所有基因,终于不用一个个查了,只要R语言的merge函数、linux的jion函数、TBtools的提取功能用的好,分分钟啊。手工回宿舍。

你可能感兴趣的:(第一次使用R爬取自己所需要的数据)