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 주소

크롤링 결과..