打开网站
http://rice.hzau.edu.cn/rice/clone/list.php?page=1&searchword=
我想找水稻中已经克隆了的基因,要我一页一页复制粘贴吗?哇,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 ## 去除第一行,原本的列名,但是中间又空格,可以自己清洗然后再直接变为列名。
于是就清洗完了第一页。结果与我们的第一列的内容一毛一样
于是开始建立函数
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))
于是利用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)
为了进一步确认结果,查看最后几个基因是否与最后一页的内容一致? 也是一毛一样