류동균의 R 공부방입니다.
네이버 날씨 크롤링, Rmd보고서 작성 본문
이번 블로그에서는 웹크롤링을 한번 해보려한다. 또한 이 글에 이어 다음글에서는 Linux crontab을 통한 업무 자동화 또한 간단히 해볼 예정인데 매일의 날씨를 알려주는 Rmd파일을 만들어보자. 그럼 바로 시작해보자.
크롤링 데이터 파악하기
날씨데이터는 다음의 URL에서 크롤링할 예정이다. URL에 접속하여 F12를 누르고 html을 확인해보자.
링크 : 네이버날씨
링크에 접속하면 서울경기 ... 제주 까지 전국의 날씨가 나오는 것을 확인 할 수 있다. html에서 이 데이터를 파악해보면 table태그에서 table의 class가 ".tbl_weather.tbl_today"로 나오는 것을 확인 할 수 있다. 결과적으로 우리가 크롤링해야 할 데이터는 필요없는 것들을 제외하고 ".tbl_weather.tbl_today"의 데이터들만 가져오면 된다는 말이다.
크롤링
weather_naver.R파일을 생성하고 크롤링을 해보자.
## Linux 환경설정 및 필요한 패키지
# Linux 환경설정
Sys.setenv(RSTUDIO_PANDOC="/usr/lib/rstudio-server/bin/pandoc")
# 필요한 패키지
library(rvest) # crawling
library(dplyr) # data handling
library(stringr) # data handling
library(reshape2) # data handling
library(rmarkdown) # render
# url
default_url <- "https://weather.naver.com/rgn/cityWetrMain.nhn"
# url html로 읽어오기
weather_naver_html <- read_html(default_url)
# 날씨가 있는 table을 dataframe로 변환
weather_table <- weather_naver_html %>%
html_nodes(".tbl_weather.tbl_today") %>%
html_table() %>% as.data.frame()
rvest패키지의 html_nodes()를 사용하여 날씨데이터가 있는 태그의 내용만을 추출 후 html_table(), as.data.frame()을 사용해 가져온 테이블을 dataframe화 시킨다. 한번 데이터를 살펴보자.
head(weather_table)
str(weather_table)
자료형은 모두 character로 되어있고 컬럼은 지역, 오늘오전, 오늘오후로 3개이다. 근데 바로 datatable로 만들기에는 /r, /n, /t와 같이 필요없는 요소들이 있고 기온, 강수확률, 날씨요약이 하나의 컬럼에 있는것이 조금 아쉽다. 데이터를 조금 만져주어 보기좋게 만들어보자.
데이터 처리
우선 필요없는 정보들을 없애줘야한다. apply(), gsub()를 사용해 특정문자들을 공백으로 바꿔보자.
# 필요없는 문자 삭제
# apply(데이터, 1(행단위연산) or 2(열단위연산), function)
weather_table <- apply(weather_table, 2, function(x) gsub("\t","",x))
weather_table <- apply(weather_table, 2, function(x) gsub("기온","",x))
weather_table <- apply(weather_table, 2, function(x) gsub("강수확률","",x))
weather_table <- apply(weather_table, 2, function(x) gsub("℃","",x))
weather_table <- apply(weather_table, 2, function(x) gsub("%","",x))
head(weather_table)
지역 오늘오전 오늘오후
"서울경기" "구름많음\r\n 14.0\r\n 20" "맑음\r\n 23.0\r\n 0"
"서해5도" "맑음\r\n 14.0\r\n 0" "맑음\r\n 20.0\r\n 0"
"강원영서" "흐림\r\n 13.0\r\n 30" "맑음\r\n 21.0\r\n 0"
"강원영동" "흐림\r\n 15.0\r\n 40" "흐리고 비\r\n 21.0\r\n 80"
"충청북도" "구름많음\r\n 13.0\r\n 20" "맑음\r\n 22.0\r\n 10"
"충청남도" "구름많음\r\n 14.0\r\n 20" "구름많음\r\n 22.0\r\n 20"
데이터가 많이 깔끔해졌다. /r, /n을 gsub로 삭제하지 않은 이유는 colsplit()을 사용할때 column을 나누는 기준으로 사용하기 위해서이다. colsplit()으로 지역을 제외하고 오늘오전/오후 컬럼을
오전/오후 기후, 기온, 강수확률 총 6개의 컬럼으로 나눠주도록 할 예정이다. 바로 시도해보자.
# 컬럼명 생성을 위한 vector 생성
morning_noon <- c("오전","오후")
column_set <- c("기후", "기온(℃)" ,"강수확률(%)")
# colsplit() 컬럼 분할
morning <- colsplit(weather_table[,2],"\r\n", paste0(morning_noon[1],column_set))
afternoon <- colsplit(weather_table[,3],"\r\n", paste0(morning_noon[2],column_set))
# cbind()로 dataframe합치기
weather_table <- cbind("지역" = weather_table[,1],morning,afternoon)
weather_table
지역 오전기후 오전기온(℃) 오전강수확률(%) 오후기후 오후기온(℃) 오후강수확률(%)
1 서울경기 구름많음 14 20 맑음 23 0
2 서해5도 맑음 14 0 맑음 20 0
3 강원영서 흐림 13 30 맑음 21 0
4 강원영동 흐림 15 40 흐리고 비 21 80
5 충청북도 구름많음 13 20 맑음 22 10
6 충청남도 구름많음 14 20 구름많음 22 20
7 경상북도 흐림 14 30 흐리고 한때 비 20 60
8 경상남도 흐리고 비 16 60 흐리고 비 21 60
9 울릉독도 흐리고 가끔 비 15 60 흐리고 비 17 80
10 전라북도 구름많음 14 20 맑음 23 0
11 전라남도 구름많음 14 20 맑음 24 0
12 제주 흐리고 비 18 60 구름많음 22 20
다음과 같이 아주 보기 편한 형태로 dataframe을 완성했다.
날씨 데이터 보고서 자동화
이제 자동화 보고서 작성을 위해 작업을 해보자. weather_naver.R 파일에서 다음과 같이 계속 코드를 생성하자. file의 경로는 자신의 컴퓨터환경에 맞게 넣어주면 된다. getwd()를 통해 현재 경로를 확인할 수 있다.
# weather_table을 .Rdata파일로 저장
save(weather_table, file = "/home/dgryoo95/web_Crawling/weather_table.RData")
# 파일의 이름 보고서를 작성한 날짜가 파일에 나오기위해 Sys.time()을 사용
html_link <- paste0("naver_weather_", gsub("-","_",Sys.time()),".html")
## Rmarkdown rendering (= rmd를 호출 하여 html로 바꿔주는것(rendering))
# render( rmd파일 , html제목, html경로 )
# rmd 파일, html경로들은 절대경로를 사용한다.
render("/home/dgryoo95/web_Crawling/weather_naver.Rmd",
output_file = html_link,
output_dir = "/home/dgryoo95/web_Crawling")
이렇게 한다면 weather_naver.R 파일에서는 작업이 끝이난다. 이제 Rmd파일로 넘어가보자 weather_naver.Rmd 파일을 생성하고 다음과 같이 코드를 입력해보자.
---
title: "`r Sys.Date()`의 날씨 보고서"
output: html_document
---
```{r}
# 날씨정보가 있는 weather_table을 load
load("/home/dgryoo95/web_Crawling/weather_table.RData")
```
```{r}
# 필요한패키지
library(DT) # datatable
# weather_table을 반응형 datatable로 변환
datatable(weather_table)
```
이정도만 적어주고 한번 R파일에서 render를 실행해보면 실행한 시각의 이름으로 html파일이 생성될 것이다.
이렇게 해서 날씨데이터를 크롤링하고 Rmd보고서를 html파일로 변환하는 것을 해보았다. 바로 다음글에서 Linux의 crontab으로 특정시간에 보고서가 작성되도록 하는 것을 블로그할 것이다.
'ETC' 카테고리의 다른 글
Window10에서 WSL Linux Ubuntu 환경 사용 (0) | 2019.12.18 |
---|---|
Linux crontab (0) | 2019.10.24 |
R을 통한 시스템 자동화 기초 (0) | 2019.10.15 |
R 코드로 크롤링을 통한 파일 다운받기 (0) | 2019.10.14 |
프로젝트 관리 툴 트렐로(Trello) (0) | 2019.10.14 |