반응형

    정보

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

    • 작성자     : 박진만

    • 작성일     : 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
    반응형
    • 네이버 블러그 공유하기
    • 네이버 밴드에 공유하기
    • 페이스북 공유하기
    • 카카오스토리 공유하기