最近学习R语言做数据分析,由于数据量比较少,于是决定写个爬虫,去网上爬取资料,
当然很多代码也是参考了其它汪友的代码,自己改进了一下,给大家提供个参考。
#install.packages("selectr")
library(rvest)
library(stringr)
library(RSelenium)
library(selectr)
remDr <- remoteDriver(browserName = "firefox")
# remDr<-remoteDriver(remoteServerAddr =" yourIP",端口= 4445L)
# 创建一个remoteDriver对象,这一步指定用chrome打开网页,但网页尚未打开
base1 <- "https://gkcx.eol.cn/school"
base2 <- c(101:102)
base3 <- "provinceline"
url <- paste(base1, base2,base3,sep = "/")
# 手动拼接url
## 函数
sin_click <- function (xpath) {
t_sleep <- 2
nextBtn <- remDr$findElement(using = 'xpath',
value = xpath)
nextBtn$clickElement()
Sys.sleep(t_sleep)
}
LinkinfoFunc <- function(remDr, url) {
result <- data.frame()
# 建立空数据框result,后用于盛装数据
remDr$open()
# 打开chrome浏览器
for (i in seq_along(url)) {
remDr$navigate(url[i])
Sys.sleep(1)
#驱动浏览器访问第i个地区的首页
j = 0
# j是第i个地区的页面计数器,即第i个地区第j页,j的初始值为0
while (TRUE) {
# while循环将遍历第i个地区的所有页数
j = j + 1
# 开始页面计数,j=1
destination <- remDr$getPageSource()[[1]] %>% read_html()
# 获取当前访问页面的内容
link<-destination%>% html_nodes("div.province_score_line_table")
#取各专业录取成绩和位次
link3<-link[3] %>% html_nodes("div.line_table_box")
table<-html_table(link3 %>% html_nodes("table"),fill=TRUE)
# 从源代码中,提取当前页&总页数的信息
#page3<-pageinfo[3] %>% html_nodes("li")
page3<-link[3]%>% html_nodes("li")
len<-length(page3)-2
totalpage <- len
curpage <- j
# 从源代码中,提取当前页&总页数的信息
data <- data.frame(table, stringsAsFactors = FALSE)
filepath= paste("F:/mydata/itemData", i,j,".csv",sep = "-")
write.csv(data,file=filepath)
# 将获取到的房屋链接整合为数据框data
result <- rbind(result, data)
# 将data写入空数据框result
if (curpage != totalpage) {
# 若当前页还不是总页数,即尚未达到最后一页
cat(sprintf("第【%d】个学校第【%d】页抓取成功1", i, j), sep = "\n")
#webpage<-page3[length(page3)] %>% html_nodes("a")
#remDr$executeScript("arguments[0].click();", webpage)
xpath<- paste("/html/body/div[1]/div/div/div/div/div/div/div[3]/div[1]/div[1]/div/div[3]/div[2]/div[3]/div/div/ul/li[", length(page3),"]",sep = "")
# 点击下一页
sin_click(xpath)
# 并模拟点击下一页
#Sys.sleep(1)
} else {
cat(sprintf("第【%d】个学校第【%d】页抓取成功2", i, j), sep = "\n")
break
}
}
#write_csv( x , path , col_names = TRUE , append = TRUE )
cat(sprintf("第【%d】个学校抓取成功", i), sep = "\n")
# 输出“第i个地区抓取成功”的提示信息,返回for循环,继续抓取第i+1个地区
}
remDr$close()
# 所有地区所有页面抓取完毕,跳出for循环,关闭浏览器窗口
cat("All work is done!", sep = "\n")
return(result)
# 返回循环叠加后的最终数据
}
linkinfo <- LinkinfoFunc(remDr, url) %>% unlist()