네이버 카페 크롤링

셀레니움 이용하여 네이버 신문기사 크롤링을 해보자

날짜, 제목, 본문 내용, 기사 주소, 댓글 내용, 댓글 수에 대해 크롤링할 것이다.
댓글 수가 5,000개가 넘는 게시물은 더보기로 불러올 수 있는 한계가 있어 제한이 있다.

install.packages(c("dplyr", "httr", "jsonlite", "rJava", "RSelenium", "stringr"))
install.packages('rJava')
install.packages('tictoc')
library(dplyr)
library(httr)
library(jsonlite)
library(rJava)
library(RSelenium)
library(stringr)
library(rvest)
library(tictoc)
library(xlsx)
library(openxlsx)
#cd C:\r_selenium
#java -Dwebdriver.gecko.driver="geckodriver.exe" -jar selenium-server-standalone-4.0.0-alpha-1.jar -port 4445
# https://r-pyomega.tistory.com/25#rp 


remDr<-remoteDriver(remoteServerAddr="localhost", port=4445L, browserName="chrome")
remDr$open()
#####
#돌리기 전 저장하고 싶은 위치 확실히 지정할 것. 
#####


############################
#아래 펑션만 먼저 돌린 뒤 위에 crwaaa 형식에 맞춰서 돌리면 됨. 
# 
startt = '2022.09.01'
endd = '2022.09.20'
startt1 = '20220901'
endd1 = '20220920'
검색어 =  '수리남 \"수리남\"'
page = 10
검색어_ = '수리남'

crwaaa('2022.09.01','2022.09.20','20220901','20220920','수리남 \"수리남\"',10,'수리남')
##########################


crwaaa=function(startt, endd, startt1, endd1, 검색어, page, 검색어_){
  
  # URL 분리
  main <- "https://search.naver.com/search.naver?&where=news&query="
  ## 검색어입니다
  
  mid1 <- "&sm=tab_srt&sort=1&photo=0&field=0&reporter_article=&pd=3&ds="
  시작일1 <- startt              ## 설정 기간 시작일입니다
  부터1 <- "&de="
  종료일1 <- endd             ## 설정 기간 종료일입니다
  
  mid2 <- "&docid=&nso=so%3Ar%2Cp%3Afrom"
  시작일2 <- startt1               ## 설정 기간 시작일입니다
  부터2 <- "to"
  종료일2 <- endd1               ## 설정 기간 종료일입니다
  
  mid4 <- "%2Ca%3Aall&mynews=0&refresh_start=0&related=0"
  
  # URL 이어붙이기
  target <- paste(main, 검색어, sep = "")
  
  target <- paste(target, mid1, sep = "")
  target <- paste(target, 시작일1, sep = "")
  target <- paste(target, 부터1, sep = "")
  target <- paste(target, 종료일1, sep = "")
  
  target <- paste(target, mid2, sep = "")
  target <- paste(target, 시작일2, sep = "")
  target <- paste(target, 부터2, sep = "")
  target <- paste(target, 종료일2, sep = "")
  
  target <- paste(target,mid4, sep = "")
  
  remDr$navigate(target) 
  
  
  링크_nnews <- c()
  
  
  for(i in 1:page){ ## 2는 총 페이지수를 뜻함 네이버 뉴스 검색후 맨 끝 페이지를 넉넉하게 넣어주면 됨
    
    tryCatch({
      
      cat('현재', i, '페이지 수집 중! \n') 
      
      frontpage <- remDr$getPageSource()[[1]]
      body <- frontpage %>% read_html() 
      
      
      
      #sp_nws6 > div.news_wrap.api_ani_send > div > div.news_info > div > a:nth-child(3)
      링크.tmp1 <- body %>% html_nodes("a.info") %>%  html_attr("href")
      
      링크.tmp <- 링크.tmp1
      링크.tmp <- 링크.tmp %>% unique()
      
      링크_nnews <- append(링크_nnews,링크.tmp)
      
      
      if(i==page) break()
      
      element <- remDr$findElement("css", "#main_pack > div.api_sc_page_wrap > div > a.btn_next")
      element$clickElement()                          ## "다음페이지"를 클릭하는 명령어입니다
      
      
      Sys.sleep(time = 0.5)
      
    }, error = function(e) cat("불러올 수 없습니다!\n"))
    
  }
  
  
  링크_nnews <- 링크_nnews %>% unique()    ## 혹시라도 모를 중복 결과를 제거하기 위해 실행합니다
  
  
  ##
  news.naver <- grep("https://n.news.naver",링크_nnews)
  링크_news.naver <- 링크_nnews[news.naver]
  링크_news.naver
  ##
  날짜_news.naver <- c()
  제목_news.naver <- c()
  본문_news.naver <- c()
  주소_news.naver <- c()
  댓글수_news.naver <- matrix(0,length(링크_news.naver),1)
  댓글_news.naver <- matrix(0,length(링크_news.naver),1)
  
  ### 댓글 추가하기 코딩 (c는 댓글 더보기 페이지로, d는 더보기 페이지에서 댓글 더보기)
  
  
  
  ###
  tic()
  for (i in 1:length(링크_news.naver)){
    tryCatch({
      remDr$navigate(링크_news.naver[i])
      body <- remDr$getPageSource()[[1]]
      
      cat('현재', i, '페이지 수집 중! \n') 
      
      body <- body %>% read_html()
      
      #content > div.end_ct > div > div.article_info > span > em
      ##날짜(최종수정기사입력)
      
      날짜.tmp2 <- body %>% 
        html_nodes("#content > div.end_ct > div > div.article_info > span > em") %>% 
        html_text()  
      
      날짜.tmp2 <-날짜.tmp2[1]
      
      if (length(날짜.tmp2) != 0) {
        날짜_news.naver <- append(날짜_news.naver, 날짜.tmp2)
      } else {
        날짜_news.naver <- append(날짜_news.naver, "수동확인")
      }
      
      
      
      ##제목
      
      제목.tmp2 <- body %>% 
        html_nodes("#content > div.end_ct > div > h2") %>% 
        html_text()
      
      if (length(제목.tmp2) != 0) {
        제목_news.naver <- append(제목_news.naver, 제목.tmp2)
      } else {
        제목_news.naver <- append(제목_news.naver, "수동확인")
      }
      
      
      ##본문
      
      본문.tmp2 <- body %>% 
        html_nodes("#articeBody") %>% 
        html_text()
      
      if (length(본문.tmp2) != 0) {
        본문_news.naver <- append(본문_news.naver, 본문.tmp2)
      } else {
        본문_news.naver <- append(본문_news.naver, "수동확인")
      }
      
      
      
      
      ##주소
      
      주소_news.naver <- append(주소_news.naver , 링크_news.naver[i])
      
      Sys.sleep(time = 1)
      
      
      
      #댓글 더보기 하는 것임 클릭 한 번에 20개 댓글씩 추가됨 너무 많이하면 렉걸림 300개가 넘는 기사는 다른 코드로 다시 돌려야함. 
      c <- remDr$findElement("css", "#cbox_module > div.u_cbox_wrap.u_cbox_ko.u_cbox_type_sort_favorite > div.u_cbox_view_comment > a > span.u_cbox_in_view_comment")
      c$clickElement()
      Sys.sleep(time = 0.5)
      d =remDr$findElement("css", "#cbox_module > div.u_cbox_wrap.u_cbox_ko.u_cbox_type_sort_favorite > div.u_cbox_paginate > a > span > span > span.u_cbox_page_more")
      d$clickElement()
      Sys.sleep(time = 0.5)
      d$clickElement()
      Sys.sleep(time = 0.5)
      d$clickElement()
      Sys.sleep(time = 0.5)
      d$clickElement()
      Sys.sleep(time = 0.5)
      d$clickElement()
      Sys.sleep(time = 0.5)
      d$clickElement()
      Sys.sleep(time = 0.5)
      d$clickElement()
      Sys.sleep(time = 0.5)
      d$clickElement()
      Sys.sleep(time = 0.5)
      d$clickElement()
      Sys.sleep(time = 0.5)
      d$clickElement()
      Sys.sleep(time = 0.5)
      d$clickElement()
      Sys.sleep(time = 0.5)
      d$clickElement()
      Sys.sleep(time = 0.5)
      d$clickElement()
      Sys.sleep(time = 0.5)
      d$clickElement()
      Sys.sleep(time = 0.5)
      d$clickElement()
      Sys.sleep(time = 0.5)
      #body 재할당(댓글 더보기창 모두 연 상태로 재할당하는 것임)
      body <- remDr$getPageSource()[[1]]
      body <- body %>% read_html()
      
      댓글.tmp2 <- body %>% 
        html_nodes("span.u_cbox_contents") %>% 
        html_text()
      
      댓글.tmp2 = paste(댓글.tmp2,collapse="")
      
      if (nchar(댓글.tmp2) > 1) {
        댓글_news.naver[i,] <- 댓글.tmp2  
      } else {
        댓글_news.naver[i,] <- "empty"
      }
      
      
      #댓글 수
      
      댓글수.tmp2 <- body %>% 
        html_nodes("div.u_cbox_comment_count_wrap") %>% 
        html_text()
      
      if (length(댓글수.tmp2) != 0) {
        댓글수_news.naver[i,] <- 댓글수.tmp2
      } else {
        댓글수_news.naver[i,] <- "empty"
      }
      
      
      
    }, error = function(e) cat("불러올 수 없습니다!\n"))
  }
  toc()
  
  
  ##
  length(날짜_news.naver)
  length(제목_news.naver)
  length(본문_news.naver)
  length(주소_news.naver)
  length(댓글수_news.naver)
  length(댓글_news.naver)
  
  
  ##
  본문_news.naver <- str_replace_all(본문_news.naver,"\n", "")
  본문_news.naver <- str_replace_all(본문_news.naver,"\t", "")
  본문_news.naver <- str_replace_all(본문_news.naver,"//", "")
  본문_news.naver <- str_replace_all(본문_news.naver,"flash 오류를 우회하기 위한 함수 추가", "")
  본문_news.naver <- str_replace_all(본문_news.naver,"function _flash_removeCallback()", "")
  
  
  paper_news.naver <- data.frame(날짜_news.naver, 제목_news.naver, 본문_news.naver, 주소_news.naver, 댓글_news.naver,댓글수_news.naver)
  
  
  
  
  paper_news.naver <- rename(paper_news.naver, c("날짜" = 날짜_news.naver, 
                                                 "제목" = 제목_news.naver,
                                                 "본문" = 본문_news.naver, 
                                                 "주소" = 주소_news.naver,
                                                 "댓글" = 댓글_news.naver,
                                                 "댓글수" = 댓글수_news.naver))
  write.xlsx(paper_news.naver,paste0(검색어_,startt,'-',endd,".xlsx"))
  
}

결과

크롤링 결과는 아래와 같다. 정의

Leave a comment