[R] 특정 날짜의 네이버 뉴스 제목 크롤링

정보

  • 업무명     : 특정 날짜의 네이버 뉴스 제목 크롤링

  • 작성자     : 박진만

  • 작성일     : 2020-11-26

  • 설   명      :

  • 수정이력 :

 

 내용

[개요]

  • 안녕하세요? 기상 연구 및 웹 개발을 담당하고 있는 해솔입니다.

  • 원하는 날짜의 네이버 뉴스 기사의 제목을 스크래핑 하는 방법을 소개하고자 합니다.

 

[특징]

  • 임의의 날짜를 지정한 후 해당 날짜에 작성된 네이버 뉴스의 제목을 가져오는 프로그램 설명

  • 크롤링을 수행할 웹 페이지는 네이버 뉴스 속보 페이지임

  • 페이지의 예시는 아래의 링크에서 확인 가능

 

 

언론사별 속보 뉴스

언론사별 속보 뉴스를 제공합니다.

news.naver.com

 

[기능]

  • 뉴스 기사 제목 크롤링 및 csv 파일 형태로 저장

 

[활용 자료]

  • 없음

 

[자료 처리 방안 및 활용 분석 기법]

  • 없음

 

[사용법]

  • 소스 코드 예시 참조

 

[사용 OS]

  • Windows 10

 

[사용 언어]

  • R v4.0.2

  • R Studio v1.2.5033

 

 소스코드 및 수행결과

 

[소스코드 설명]

  • 인코딩 설정

Sys.setlocale("LC_ALL")
options(encoding = "UTF-8")
Sys.setenv(LANG = "en_US.UTF-8")

 

  • 라이브러리 읽기

    • 웹 스크래핑 관련 패키지인 rvest 이외에 데이터 전처리 관련 패키지 로드

library(rvest)
library(stringr)
library(tidyverse)
library(dplyr)
library(magrittr)

 

  • 날짜 지정

    • 시작날짜와 끝 날짜를 하루 간격으로 dtDate 변수에 지정
    • 이후 지정된 Date 배열을 sDate에 character 타입으로 변환
dtDate = seq.Date(as.Date("2020-11-20"), as.Date("2020-11-21"), "1 day")
sDate = format(dtDate, "%Y%m%d")

 

  • URL 및 xpath 경로를 입력으로 받아 데이터를 가공하는 사용자 함수 생성

    • getUrlText : 지정된 xpath 경로의 Text 가공 후 추출

    • getUrlGerf : 지정된 xpath 경로의 attribute 추출
getUrlText = function(url, xpath) {
  xml2::read_html(url) %>%
    rvest::html_nodes(xpath = paste0(xpath)) %>%
    rvest::html_text() %>%
    str_replace_all(pattern = "\n", replacement = " ") %>%
    str_replace_all(pattern = "[\\^]", replacement = " ") %>%
    str_replace_all(pattern = "\"", replacement = " ") %>%
    str_replace_all(pattern = "\\s+", replacement = " ") %>%
    str_trim(side = "both")
}

getUrlHref = function(url, xpath) {
  xml2::read_html(url) %>%
    rvest::html_nodes(xpath = paste0(xpath)) %>%
    rvest::html_attr("href") 
}

 

  • 미리 설정한 날짜의 기사 제목을 데이터 형태로 크롤링 및 저장하는 루프문 수행

for (d in sDate) {
  
  print(d)
  url = sprintf("https://news.naver.com/main/list.nhn?mode=LSD&mid=sec&sid1=001&date=%s&page=%d",d, seq(1:1500))
  
  data = url %>%
    purrr::map(~ getUrlText(.x, '//*[@id="main_content"]/div[2]/ul[*]/li[*]/dl/dt[2]/a')) %>%
    unlist() %>%
    as.data.frame() 
  
  dataL1 <- data %>%
    magrittr::set_colnames("title") %>%
    dplyr::distinct(title) %>% 
    dplyr::mutate(date = d)
  
  
  write.csv(dataL1,paste0("./TITLE/2020/title_",d,".csv"),fileEncoding = "CP949")
    
}

 

[전체 코드 형태]

Sys.setlocale("LC_ALL")
options(encoding = "UTF-8")
Sys.setenv(LANG = "en_US.UTF-8")

library(rvest)
library(stringr)
library(tidyverse)
library(dplyr)
library(magrittr)

dtDate = seq.Date(as.Date("2020-11-20"), as.Date("2020-11-21"), "1 day")
sDate = format(dtDate, "%Y%m%d")


getUrlText = function(url, xpath) {
  xml2::read_html(url) %>%
    rvest::html_nodes(xpath = paste0(xpath)) %>%
    rvest::html_text() %>%
    str_replace_all(pattern = "\n", replacement = " ") %>%
    str_replace_all(pattern = "[\\^]", replacement = " ") %>%
    str_replace_all(pattern = "\"", replacement = " ") %>%
    str_replace_all(pattern = "\\s+", replacement = " ") %>%
    str_trim(side = "both")
}

getUrlHref = function(url, xpath) {
  xml2::read_html(url) %>%
    rvest::html_nodes(xpath = paste0(xpath)) %>%
    rvest::html_attr("href") 
}

for (d in sDate) {
  
  print(d)
  url = sprintf("https://news.naver.com/main/list.nhn?mode=LSD&mid=sec&sid1=001&date=%s&page=%d",d, seq(1:1500))
  
  data = url %>%
    purrr::map(~ getUrlText(.x, '//*[@id="main_content"]/div[2]/ul[*]/li[*]/dl/dt[2]/a')) %>%
    unlist() %>%
    as.data.frame() 
  
  dataL1 <- data %>%
    magrittr::set_colnames("title") %>%
    dplyr::distinct(title) %>% 
    dplyr::mutate(date = d)
  
  
  write.csv(dataL1,paste0("./TITLE/2020/title_",d,".csv"),fileEncoding = "CP949")
    
}



 

[코드 수행 결과 예시]

 

 참고 문헌

[논문]

  • 없음

[보고서]

  • 없음

[URL]

  • 없음

 

 문의사항

[기상학/프로그래밍 언어]

  • sangho.lee.1990@gmail.com

[해양학/천문학/빅데이터]

  • saimang0804@gmail.com