Big Data/R Programming

1. 네이버 뉴스 웹크롤링

여동동 2021. 9. 27. 19:53

HTML값 가져오기

 샘플 HTML

크롤링 코드

## 패키지 설치 
install.packages("rvest")
install.packages("dplyr")
install.packages('tidyverse')

## 패키지 불러오기
library(rvest)
library(dplyr)
library('tidyverse')
## n_page : 크롤링할 네이버 뉴스의 갯수
n_page = 100

## page : 네이버 뉴스 dns주소가 뉴스페이지 번호마다 1 11 21 31 41 51 ~로 진행되어 이 같은 배열을 구성한다.
page <- seq(1, n_page, 10)

## url_start : page번호가 중간에 있을경우 page번호를 비운상태에서 url_start와 url_end변수를 만든다.
## 이번에 만든 dns는 page번호가 맨뒤에 있어서 url_end가 필요 없다.
url_start <- "https://search.naver.com/search.naver?where=news&sm=tab_pge&query=%EB%A7%9B%EC%A7%91&sort=0&photo=0&field=0&pd=0&ds=&de=&cluster_rank=156&mynews=0&office_type=0&office_section_code=0&news_office_checked=&nso=so:r,p:all,a:all&start="

## url : dns주소와 page번호를 합친 최종 url
rm(news_metadata_all)
rm(news_metadata)
news_metadata_all <- data.frame(title, date, press, url, contents)
news_metadata  <- data.frame(title, date, press, url, contents)
tmp = 0
for(i in page)
{
  url<- paste0(url_start, i)
  
## 기사 제목
  title <-read_html(url) %>%
    html_nodes(".news_area > a") %>%
     html_attr('title')
  
## 기사 날짜
  date <-read_html(url) %>%
    html_nodes(".info_group > span.info") %>%
     html_text()
  
## 기사 날짜와 같은 html조건에 3면 19TOP 이런식의 데이터들이 발견되어 제거함 
  name <- c("면")
  tmp <- grep(name,date)
  if(is.integer(tmp) && length(tmp) > 0)
  {
    date <- date[-grep(name,date)]
  }
  
## 언론사 명
  press <-read_html(url) %>%
    html_nodes(".info_group > a") %>%
      html_text()
  
## 네이버 뉴스 소속은 한 기사당 언론사 이름이 2개가 크롤링되어 '네이버 뉴스'를 삭제한다.
  name <- c("네이버뉴스")
  tmp <- grep(name,press)
  if(is.integer(tmp) && length(tmp) > 0)
  {
    press <- press[-grep(name,press)]
  }
  
## 기사 URL
  targetUrl <-read_html(url) %>%
    html_nodes(".news_area > a") %>%
     html_attr('href')

## 기사 본문
  contents <-read_html(url) %>%
    html_nodes(".dsc_wrap > a") %>%
     html_text()

  news_metadata <- data.frame(title = title, date = date, press = press, url = targetUrl, contents= contents)
  news_metadata_all <- rbind(news_metadata_all, news_metadata)

}
##csv 생성
write.csv(news_metadata_all, "article.csv")
message("success!!!")