data analysis & visualization

library(RSelenium)

list.of.packages <- c('classInt','rgdal',"xml2","XML","leaflet","leaflet.extras","classInt",'rjson','rgdal','protolite','sp','maps','maptools')

new.packages <- list.of.packages[!(list.of.packages %in% installed.packages()[,"Package"])]

if(length(new.packages)) install.packages(new.packages, dependencies = TRUE)


map <- readOGR( "skorea_municipalities_geo_simple.json")


port1=4568L

remDr<-rsDriver(port=port1)

remDr$open()

url='https://www.airkorea.or.kr/web/sidoCompare?itemCode=10008&pMENU_NO=102'

remDr$navigate(url)

remDr$screenshot(display = T)

source=remDr$getPageSource()[[1]]


data=XML::readHTMLTable(source,stringsAsFactors = FALSE)[[1]]

remDr$close()

head(data)

rownames(data)<-data[,1]

data=data[,-1]

data=t(data)

data=data.frame(area=rownames(data),HourMean=data[,1])

rownames(data)=NULL

data$area=as.character(data$area)

data$HourMean=as.numeric(data$HourMean)


setwd('/home/ducj/data/data/shpfile/shp/CTPRVN_201703')

map=readOGR('TL_SCCO_CTPRVN.shp',encoding = 'euc-kr',stringsAsFactors = F)


map@data$CTP_KOR_NM<-c('서울','부산','대구','인천','광주','대전','울산','세종','경기','강원','충북','충남','전북','전남','경북','경남','제주')

map@data=merge(map@data,data,by.x='CTP_KOR_NM',by.y='area',all=T)

map@data=map@data[order(map@data$CTPRVN_CD),]

plot(map,col=map@data$HourMean)

map=spTransform(map,"+init=epsg:4326")

map=spTransform(map,CRS("+proj=longlat +ellps=GRS80"))

#addDrawToolbar는 선 다각형 사각형을 바로 지도에 나타낼 수 있게 해준다.


map2=leaflet() %>%

  addTiles() %>%

  addDrawToolbar(

    editOptions=editToolbarOptions(selectedPathOptions=selectedPathOptions())

  )


p <- colorBin("YlOrRd", domain = map@data$HourMean, bins = classIntervals(map@data$HourMean, 7)$brks)

map2%>%

  addPolygons(data=map,color = ~p(HourMean),stroke=F, smoothFactor = 0.2,fillOpacity = .5)%>%

  addLegend(data=map,pal=p,values=~HourMean,position = 'bottomright',title = date())



RSelenium 사용하기


예전엔 따로 다운로드 받지 않아도 패키지만 설치해서 크롤링이 가능했는데 크롬버전 업그레이드 때문인지 cmd로 chromeDriver를 열어주는 방법을 사용해야 된다. 


목차


1. 필요 파일 다운로드

2. 크롤링 환경 만들기

3. R에서 크롤링 시작하기



1.필요파일 다운로드

우선 cmd로 chrome Driver를 열어주는 방법을 알아보자.


아래 3개의 파일을 같은 경로에 다운로드 받자.

1) selenium download

2) geckodriver download

3) chromedrover download


아래와 같이 selenium-server와 geckodriver, chromedriver 3개를 설치해주면 된다.

다운로드 받은 파일을 한 경로에 옮긴다.



위에서 보시다 시피 나의 경로는 C:\selenium이다. 


2. 크롤링 환경 만들기


관리자권한으로 명령프롬프트를 실행한다.

아래의 명령어를 입력한다. 

참고로 명령프롬프트의 붙여넣기는 shift + insert 이다.


cd c:\selenium

java -Dwebdriver.gecko.driver="geckodriver.exe" -jar selenium-server-standalone-3.9.1.jar -port 4445

port 는 자기 자신이 열고싶은 번호를 사용하면 되며 selenium-server-standalone의 버전은 자신의 것과 같게 맞춰주면 된다.





3. R에서 크롤링 시작하기



library(RSelenium)

library(stringr)

remDr <<- remoteDriver(port =4445L,browser='chrome')


name=c('대구대','영남대','계명대')


geo_code=function(name,n=3){

url='https://www.google.com/maps'

remDr$navigate(url)


search=NULL

while(length(search)==0){

  assign('search',remDr$findElement(using='css selector',value='input#searchboxinput.tactile-searchbox-input'))

}


data=NULL

for(i in 1:length(name)){

  search$clearElement()

  search$sendKeysToElement(list(name[i],key='enter'))

  Sys.sleep(n)

  lonlat=as.numeric(str_split(substr(remDr$getCurrentUrl()[[1]],

                                     regexpr('@',remDr$getCurrentUrl()[[1]])+1,regexpr(',[0-9]+z',remDr$getCurrentUrl()[[1]])-1),',')[[1]])

  data=rbind(data,data.frame(name=name[i],lat=lonlat[1],lon=lonlat[2]))

}

return(data)

}

geo_code(name)

remDr$close()