복지로 홈페이지에 들어가서 지자체의 복지서비스의 이름과 그 지역명을 수집을 한번 해보자
우선 크롤러를 개발하기 전에 환경셋팅을 먼저 해야한다.
pc에 환경셋팅을 하는 방법은 아래 링크를 참고하면 된다.
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. 결과 확인
엑셀 파일을 열면, 서비스 제목과 지역이름이 나란히 같이 하나의 행씩 들어온걸 확인할 수 있다.
지역명이 컬럼에서 시도와 시군구 단위를 구분하여 다른 컬럼으로 나누고 싶으면
또 다시 규칙성을 보니 띄어쓰기로 구분되어 있는걸 확인하고 그 기준으로 텍스트 나누기를 해주면 된다.
'빅데이터 in r' 카테고리의 다른 글
[R] 튜토리얼 01. R 프로젝트 시작하기 (0) | 2022.04.05 |
---|---|
[R] 튜토리얼 01. R Global Options에서 기본 설정 변경해서 분석 환경 최적화하기 (0) | 2022.04.05 |
[R] 튜토리얼 01. R 설치하기 - 텍스트마이닝 분석 환경 셋팅하기 (0) | 2022.04.05 |
[R] 튜토리얼 02-2. (수집) selenium 크롬 드라이버 버전 문제 해결 : This version of ChromeDriver only supports Chrome version 100 (0) | 2022.03.31 |
[R] 튜토리얼 02-1. (수집) 셀레니움 Selenium을 이용한 자동 웹 크롤링하는 방법 (0) | 2021.02.17 |