R로 보는 데이터 세상
rvest만 활용하여 R Studio로 신문사 일간 뉴스를 간단히 크롤링 해보자
iandaddy
2021. 7. 26. 14:13
매일 일간지에서 헤드라인 뉴스를 보고 해야하는 업무가 주어진다면 어떻게 해야할까요?
얼마 전에 이와 같은 업무를 받은 적이 있어 네이버 뉴스로 들어가서 일일이 확인해 보다가
노안이 일찍 찾아 올 것만 같아.. 심플하게 만들어 보았습니다.
매일매일 아침에 뉴스가 업뎃 되니 출근하자 마자 돌리면 엑셀 완성..
주의: 날짜를 너무 길게 잡으면 부하가 발생할 수 있으니 3일이 적당(약 1000여개)
R과 R Studio 는 깔려 있다는 것을 전제로 합니다.
뉴스 사이트 방문: 네이버, 다음 다 좋아요
- 헤드라인 정보가 잘 나와있고 2) 일간지에 게재 되어있고 3) HTML 표준화가 잘 되어 있는 곳이면 어디든 상관없어요
0. 필요한 라이브러리 설정
library(rvest) ## URL 크롤링 라이브러리
library(writexl) ## 엑셀로 저장 라이브러리
library(stringr) ## 스트링 변환 라이브러리
1. R 스튜디오에서 한글이 깨지거나, 실행 시 경고 메시지가 나오는 것을 방지 하기 위해 로케일 값을 세팅을 해주세요.
(관련 해서 이것저것 다 해보았으나 이것이 직빵입니다 ㅎ)
Sys.setlocale('LC_ALL','korean')
2. URL, 신문사명, 신문사코드, 날짜 등 변수 설정
## 네이버 뉴스 헤드라인, 신문게재 기사 주소 중 oid(신문사코드)만 제외 하고 주소 설정
url <- "https://news.naver.com/main/list.naver?mode=LPOD&mid=sec&listType=paper&oid="
## 신문사명, 코드를 설정
org.name <- c("경향신문","국민일보","동아일보","문화일보","서울신문","세계일보","조선일보","중앙일보","한겨레","한국일보")
org.code <- c("032","005","020","021","081","022","023","025","028","469")
## 날짜를 설정(시작:끝)
date <- 20210726:20210726
## 결과 값을 가질 틀을 선언
result <- data.frame(신문사명="",코드="",날짜="",위치="",우선순위="",제목="",링크주소="")
3. 수집 코드
for (oi in org.code) {
for (dt in date) {
tmp.url <- paste(url,oi,"&date=",dt,sep="")
html <- read_html(tmp.url)
tt <- html_nodes(html,'#main_content') %>% html_nodes(css='.list_body')%>% html_nodes(css='.type13')
tmp.txt <- html_nodes(tt,xpath='li/dl/dt[last()]/a') %>% html_text()
tmp.link <- html_nodes(tt,xpath='li/dl/dt[last()]/a') %>% html_attr('href')
tmp.author <- html_nodes(tt,css='.writing') %>% html_text()
tmp.picon <- html_nodes(tt, css='.newspaper_info') %>% html_text()
tmp.date <- html_nodes(tt,css='.date') %>% html_text()
for(idx in 1:length(tmp.txt)) {
result <- rbind(result,c(신문사명=tmp.author[idx],코드=oi,날짜=dt,위치=tmp.picon[idx],우선순위=idx,제목=tmp.txt[idx],링크주소=tmp.link[idx]))
}
}
}
4. 결과치 확인 및 엑셀 저장
## 첫 행은 삭제
result <- result[-1,]
## 위치 신문면 값을 일치, 위치에서 [A] 또는 공백(" ") 또는 TOP를 찾아서 ""로 변환
result$위치 <- str_replace_all(result$위치,"[A]| |TOP","") %>% str_trim()
View(result)
write_xlsx(result,"신문크롤링+20210726.xlsx")
간단하게 끝~ 결과를 한번 볼까요?
- 신문사명: 신문사 결과
- 코드: 신문사 코드(URL로 호출시 사용)
- 날짜: 게재 날짜
- 위치: 신문1~10면 까지 위치 정보
- 우선순위: 게시물 순서로 해당 위치 정보
- 제목: 제목
- 링크주소: 신문URL 주소