R/town_forecast.R

#' town forecast data download
#'
#' The function is to store the neighborhood forecast data in a designated path.
#'
#'  @param year is must be a year larger than 2008.
#'
#'  @param start_month If start_month is year=2008, start_month has a character value between 10 and 12,
#'  otherwise satr_month can have a character value between 01 and 12.
#'  @param City_index is an index to the list of citydata2.For example, if the city_index=1 is download by Seoul data.
#'
#'  @return
#' @examples
#'  citydata2[12]
#'  for( year in 2008:2018){
#'   ifelse(year==2008,start_month<-paste0(10),start_month<-'01')
#'   ifelse(year==2018,end_month<-10,end_month<-12)
#'   town_forecast(dir="D:/dir",year=year,city_index=12,start_month =start_month,end_month = end_month)}
#'  @export
town_forecast=function(dir,year,city_index,start_month,end_month,
                      id='qkdrk777777@naver.com',pw='whckdwp1!@',port1=4502L,port2=4503L,port3=4567L){
  if(!require('RSelenium')){
    install_version("binman", version = "0.1.0", repos = "https://cran.uni-muenster.de/")
    install_version("wdman", version = "0.2.2", repos = "https://cran.uni-muenster.de/")
    install_version("RSelenium", version = "1.7.1", repos = "https://cran.uni-muenster.de/")
  };library(RSelenium)

  pack2(c('rvest','httr','stringr','RCurl','XML','progress'))

  suppressMessages(try(silent = T,{
    pJS <<- wdman::phantomjs(port = port1)
    eCaps <<- list(
      chromeOptions = list(
        prefs = list("profile.default_content_settings.popups" = port2,
                     "download.prompt_for_download" = FALSE,"download.default_directory" = dir)
      )
    )
    rD <<- rsDriver(extraCapabilities = eCaps)
    remDr <<- rD$client
  }))
  #############
  #
  #   remDr <<- remoteDriver(port=port3, browserName = 'chrome',extraCapabilities = eCaps)
  #   remDr$open()#run the driver

  setwd(dir)
  dir.create('data')

  for(year in year){
    setwd(paste0(dir,'/data'))
    dir.create(paste0(year))
    setwd(paste0('./',year))

    try(silent = T,{
      url="https://data.kma.go.kr/data/rmt/rmtList.do?code=420&pgmNo=572"
      remDr$navigate(url)

      remDr2=remDr$findElement(using='xpath',value='//*[@id="loginBtn"]')
      suppressMessages(remDr2$sendKeysToElement(list(key='enter')))

      id_=remDr$findElement(using='css selector',value='input#loginId.input-medium')
      pw_=remDr$findElement(using='css selector',value='input#passwordNo.input-medium')
      id_$sendKeysToElement(list(id))
      pw_$sendKeysToElement(list(pw))

      login=remDr$findElement(using='xpath',value='//*[@id="loginbtn"]')
      login$sendKeysToElement(list(key='enter'))
    })
    Sys.sleep(2)
    #set preiod of data


    city_n=0
    Sys.sleep(1)

    #set area
    for(city in citydata[[city_index]]){
area=remDr$findElement(using='css selector',value='input#btnStn.selectBtn1.btn.btn-primary.VAR3_BTN')
area$sendKeysToElement(list(key='enter'))
q=1;
Sys.sleep(2)
        # try(silent = T,{
suppressMessages(tryCatch({
        area_1=remDr$findElement(using='css selector',value=paste0('span#ztree_',citydata2[[city_index]],'_switch'))
        area_1$clickElement()
        },error=function(e){
tryCatch({
  while(tryCatch(area_1$clickElement(),error=function(e){1})==1){q=q+1
  if(q%%3==0)remDr$refresh()
          assign('area',remDr$findElement(using='css selector',value='input#btnStn.selectBtn1.btn.btn-primary.VAR3_BTN'))
          area$sendKeysToElement(list(key='enter'))
          Sys.sleep(q)
          assign('area_1',remDr$findElement(using='css selector',value=paste0('span#ztree_',citydata2[[city_index]],'_switch')))
}
  },error=function(e){
    assign('area',remDr$findElement(using='css selector',value='input#btnStn.selectBtn1.btn.btn-primary.VAR3_BTN'))
    area$sendKeysToElement(list(key='enter'))
    Sys.sleep(7)
    assign('area_1',remDr$findElement(using='css selector',value=paste0('span#ztree_',citydata2[[city_index]],'_switch')))
    area_1$clickElement()


  })
        }))
       # }))

   city_n=city_n+1



      suppressMessages(try(silent = T,{
        area_2=remDr$findElement(using='css selector',value=paste0('span#ztree_',city,'_check'))
        while(tryCatch(area_2$clickElement(),error=function(e){1})==1){
          Sys.sleep(1)

          try(silent = T,{
          cl=remDr$findElement(using='css selector',value='button.buttonOK')
          cl$sendKeysToElement(list(key='enter'))
          })

          area_2=remDr$findElement(using='css selector',value=paste0('span#ztree_',city,'_check'))
        }
      }))
Sys.sleep(1)
      suppressMessages(try(silent = T,{
        close0=remDr$findElements(using='class name',value='btn-close')
        while(tryCatch(      close0[[3]]$clickElement(),error=function(e){1})==1){
          Sys.sleep(1)
          try(silent = T,{
            cl=remDr$findElement(using='css selector',value='button.buttonOK')
            cl$sendKeysToElement(list(key='enter'))
          })
          while(tryCatch(area_2$clickElement(),error=function(e){1})==1){
            Sys.sleep(1)
            try(silent = T,{
              cl=remDr$findElement(using='css selector',value='button.buttonOK')
              cl$sendKeysToElement(list(key='enter'))
            })
            area_2=remDr$findElement(using='css selector',value=paste0('span#ztree_',city,'_check'))
          }
          close0=remDr$findElements(using='class name',value='btn-close')
        }
      }))
      start=remDr$findElement(using='xpath',value='//*[@id="startDt"]')
      end=remDr$findElement(using='xpath',value='//*[@id="endDt"]')
      tryCatch({
        start$sendKeysToElement(list(paste0(year)))
        end$sendKeysToElement(list(paste0(year)))
      },error=function(e){
        Sys.sleep(1)
        start$sendKeysToElement(list(paste0(year)))
        end$sendKeysToElement(list(paste0(year)))
      })

      #set month
      st.mon=remDr$findElement(using='xpath',value='//*[@id="startMt"]')
      ed.mon=remDr$findElement(using='xpath',value='//*[@id="endMt"]')
suppressMessages(
tryCatch({
      st.mon$sendKeysToElement(list(paste0(start_month)))
      ed.mon$sendKeysToElement(list(paste0(end_month)))
},error=function(e){
Sys.sleep(2)
  st.mon=remDr$findElement(using='xpath',value='//*[@id="startMt"]')
  ed.mon=remDr$findElement(using='xpath',value='//*[@id="endMt"]')
  st.mon$sendKeysToElement(list(paste0(start_month)))
  ed.mon$sendKeysToElement(list(paste0(end_month)))
}))
      #search
tryCatch({
  search=remDr$findElement(using='class name',value='addBtn')
  remDr$mouseMoveToLocation(webElement = search)
  search$clickElement()
},error=function(e){
  Sys.sleep(2)
  search=remDr$findElement(using='class name',value='addBtn')
  remDr$mouseMoveToLocation(webElement = search)
  search$clickElement()
})
tryCatch({
  search2=remDr$findElement(using='css selector',value='select#schListCnt.select')
  search2$sendKeysToElement(list('100'))
},error=function(e){
  Sys.sleep(2)
  search2=remDr$findElement(using='css selector',value='select#schListCnt.select')
  search2$sendKeysToElement(list('100'))
})
      button=NULL
      try(silent = T,{suppressMessages(
        button<<-remDr$findElement(using='css selector',value='button.buttonOK'))
      })
      if(!is.null(button)){stop('Check the date range')
        remDr$close();pJS$stop();rD[['server']]$stop();
      }
      t=0
      n=as.numeric(remDr$findElement(using='class name',value='SEARCH_LIST_COUNT')$getElementText()[[1]])
      area_list2=NULL;list=list.files(dir,pattern='csv')

while(t<n){
        date=as.character(readHTMLTable(remDr$getPageSource()[[1]])[[2]][seq(1,nrow(readHTMLTable(remDr$getPageSource()[[1]])[[2]]),2),3])
        del=gregexpr(',',as.character(readHTMLTable(remDr$getPageSource()[[1]])[[2]][seq(1,nrow(readHTMLTable(remDr$getPageSource()[[1]])[[2]]),2),2]))
        area_list=substr(as.character(readHTMLTable(remDr$getPageSource()[[1]])[[2]][seq(1,nrow(readHTMLTable(remDr$getPageSource()[[1]])[[2]]),2),2]),
                         matrix(unlist(del),byrow=T,ncol=2)[,1]+2,matrix(unlist(del),byrow=T,ncol=2)[,2]-1)

        area_list2=c(area_list2,area_list)
        del2=NULL
        down=remDr$findElements(using='css selector',value='input.btn.btn-default.DATA_DOWN_BTN')

        for(i in 1:length(down)){
          if(length(setdiff(paste0(date[i],area_list[i],'_',names(citydata[[city_index]][city_n])),gsub('.csv','',list.files())))!=0){
            # if(sum(gsub('.csv','',list.files())%in%paste0(date[i],area_list[i],'_',names(citydata[[city_index]])))!=length(down)){

            message(paste0(year,'/',date[i],area_list[i],'_',names(citydata[[city_index]])[city_n]))
          suppressMessages(while(length(tryCatch(down[[i]]$clickElement(),error=function(e){1}))==1){
            Sys.sleep(3)
           })

            Sys.sleep(2)
            error=NULL
            try(silent = T,{
              suppressMessages(error<-remDr$findElement(using='css selector',value='button'))
              # error=remDr$findElement(using='css selector',value='button')
              error$clickElement()
              if(length(error)==1){
                down=remDr$findElements(using='css selector',value='input.btn.btn-default.DATA_DOWN_BTN')
                down[[i]]$clickElement()
              }
            })

            close=NULL
            Sys.sleep(1)
            try(silent=T,{
              suppressMessages(close<-remDr$findElement(using='xpath',value='//*[@name=\"reqstPurposeCd\"]') )
              close$clickElement()
              if(length(close)==1){
                close2=remDr$findElements(using='css selector',value='input.btn.btn-primary')
                close2[[4]]$mouseMoveToLocation(webElement=close2[[4]])
                close2[[4]]$sendKeysToElement(list(key='enter'))
                Sys.sleep(3)
              }
            })
            write.csv(read.csv(paste0(dir,'/',setdiff(list.files(dir,pattern='csv'),list))),file=paste0(dir,'/data/',year,'/',date[i],gsub('/','_',area_list[i]),'_',names(citydata[[city_index]])[city_n],'.csv'))
            file.remove(paste0(dir,'/',setdiff(list.files(dir,pattern='csv'),list)))
            t=t+1

          }else t=t+1

          if(t%%10==0){
            Sys.sleep(4)
            page=remDr$findElement(using='class name',value='next_page')
            page$clickElement()
            Sys.sleep(5)}

        }
      }

    }
  }

  try(silent = T,{
    pJS$stop();remDr$close(); rD[['server']]$stop()

  })

}
# setwd('D:/package/kma2')
# devtools::document()
qkdrk777777/kma2 documentation built on May 31, 2019, 5:42 a.m.