본문 바로가기

빅데이터 in r

[R] 튜토리얼 02-2. 크롤러 개발 : 복지로 홈페이지의 텍스트 글을 긁어오자

복지로 홈페이지에 들어가서 지자체의 복지서비스의 이름과 그 지역명을 수집을 한번 해보자

 

 

 

우선 크롤러를 개발하기 전에 환경셋팅을 먼저 해야한다.

pc에 환경셋팅을 하는 방법은 아래 링크를 참고하면 된다.

https://action-makes-fortune.tistory.com/entry/%EC%9B%B9%ED%81%AC%EB%A1%A4%EB%A7%81-%EC%85%80%EB%A0%88%EB%8B%88%EC%9B%80-Selenium-R

 

[R] 튜토리얼 02-1. (수집) 셀레니움 Selenium을 이용한 자동 웹 크롤링하는 방법

0. 자바 설치하기cmd 창에서 java -version  또는 javac 라고 명령어를 입력하고 쳐서 제대로 잘 깔렸는지 확인한다.에러가 난다면 환경변수편집으로 path를 지정해준다.1. 설치하기C:\r_selenium으로 폴더

action-makes-fortune.tistory.com

 

1. 관련 라이브러리를 불러온다.

library(RSelenium) 
library(rvest)
library(httr)
library(stringr)
library(writexl)

 

2.  크롬 드라이버를 여는걸 실행한다.

remDr <- remoteDriver(remoteServerAddr = 'localhost',
                      port = 4445L, # 포트번호 입력
                      browserName = "chrome")

remDr$open()

 

3. 웹 사이트 접근

복지로 홈페이지 url에 접속하는 실행코드이다.

url <- "https://bokjiro.go.kr/ssis-tbu/twataa/wlfareInfo/moveTWAT52005M.do"

remDr$navigate(url)


복지로 홈페이지 > 복지서비스 메뉴 > 서비스 목록

 

 

4. 버튼 클릭 이벤트 적용

아래 스크롤을 내리면 [중앙부처] [지자체] [민간] 버튼을 눌러서 검색하는게 있다.

 

 

지자체라는 버튼을 클릭하고 싶으면 아래 코드처럼 짜면 실행된다.

first <-  remDr$findElement(using="xpath",   # 지자체 버튼 클릭
                            value='//*[@id="uuid-lu"]/div/div/div')
first$clickElement()

 

 

5. 게시물 반복 수집

우선 게시물이 보여지는 모양새부터 살펴본다.

지자체 버튼을 눌러 검색하면 한페이지 당 게시물이 9개씩 보여지고

아래엔 페이지가 5개씩 보여지고 있다. 

 

 

 

끝까지 페이지 넘겨서 가보면 494개 페이지까지 있고, 마지막 창엔 게시물이 7개까지만 보여진 모양새이다.

여기서 if (length(temp_title)>0)  이라는 코드를 넣어야겠다는 생각을 염두해둘 수 있다.

 

이러한 갯수들에 유의해서 코드를 짜주면 된다.

 

1번 페이지의 full xpath와 2번 페이지의 full xpath 를 확인해본다. 쭉 5번째 페이지의 full xpath를 확인해보니 규칙성이 보이기 시작한다.  맨 뒤에 보이는 div[ ___ ] /div/div 가 1에서 5까지 숫자만 바뀌는 모습을 가지고 있다.

이를 토대로 게시물들을 보여주는 페이지의 full xpath를 contentsPAGE_value 변수에 담아준다.

contentsPAGE_value <- c('//*[@id="uuid-9s"]/div/div/div/div[3]/div[1]/div/div', '//*[@id="uuid-9s"]/div/div/div/div[3]/div[2]/div/div', 
                        '//*[@id="uuid-9s"]/div/div/div/div[3]/div[3]/div/div', '//*[@id="uuid-9s"]/div/div/div/div[3]/div[4]/div/div', 
                        '//*[@id="uuid-9s"]/div/div/div/div[3]/div[5]/div/div')

 

 

아래 j 는 한 페이지에 보여지는 게시물 개수를 의미하고

i는 페이지 단위를 의미하고

z는 페이지5개 다 읽었으면  > 이 모양 아이콘인 다음 넘기기를 클릭하는 개수를 의미한다.

result <- NULL

for(z in 1:100) {
  print(z)
  
  for(j in 1:5) {
  print(j)

    
    NEW <- NULL
    NEW$title <- c()
    NEW$where <- c()

  
  content <- remDr$findElement(using="xpath",    # 컨텐츠 1 2 3 4 5 페이지 클릭
                               value=contentsPAGE_value[j])
  content$clickElement()
  
  
  url_item <- remDr$getPageSource()[[1]]     # F12 이 페이지의 html소스를 모두 가져온다
  url_item <- read_html(url_item, encoding="UTF-8")
  
    
    for (i in 1:9){
  
    temp_title <- url_item %>% html_nodes(xpath = paste0('/html/body/div[1]/div[1]/div/div[3]/div/div/div/div[3]/div/div/div/div[2]/div/div/div/div[3]/div/div/div/div[3]/div/div/div/div[3]/div/div/div/div[2]/div/div/div/div[2]/div/div/div/div[4]/div/div/div/div[',i,']/div/div/div[3]/div/div/div/div[2]/div/div/div')) %>% html_text()  
    title <- rbind(title, temp_title)
    
    temp_where <- url_item %>% html_nodes(xpath = paste0('/html/body/div[1]/div[1]/div/div[3]/div/div/div/div[3]/div/div/div/div[2]/div/div/div/div[3]/div/div/div/div[3]/div/div/div/div[3]/div/div/div/div[2]/div/div/div/div[2]/div/div/div/div[4]/div/div/div/div[',i,']/div/div/div[4]/div/div/div/div[2]/div/div')) %>% html_text() 


    
    if (length(temp_title)>0) {NEW$title[i] <- temp_title}
    else {NEW$title[i] <- c('#')}
    
    if (length(temp_where)>0) {NEW$where[i] <- temp_where}
    else {NEW$where[i] <- c('#')}

    
  
    Sys.sleep(0.5)
  
    }
    
  NEW_data <- as.data.frame(NEW)
  write_xlsx(NEW_data, paste0('C:/Users/kimty/Desktop/dpg/data/bokjiro_contents_page',z, j,'.xlsx' )  )
  
  result <- rbind(result, NEW_data )


 }
  
  nextpage_section <- remDr$findElement(using="xpath",   # 다음 페이지 넘어가기 버튼 클릭
                                        value='//*[@id="uuid-9s"]/div/div/div/div[4]')
  nextpage_section$clickElement()


}



## 결과 저장
write_xlsx(result, paste0('C:/Users/kimty/Desktop/dpg/data_2/bokjiro_contents_rbinds_final.xlsx' )  )

 

 

 

6. 결과 확인

엑셀 파일을 열면, 서비스 제목과 지역이름이 나란히 같이 하나의 행씩 들어온걸 확인할 수 있다.

지역명이 컬럼에서 시도와 시군구 단위를 구분하여 다른 컬럼으로 나누고 싶으면

또 다시 규칙성을 보니 띄어쓰기로 구분되어 있는걸 확인하고 그 기준으로 텍스트 나누기를 해주면 된다.