2020-12-16

最近学习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()

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值