[R]-(02) 크롤링[네이버 기사]
네이버 카페 크롤링
셀레니움 이용하여 네이버 신문기사 크롤링을 해보자
날짜, 제목, 본문 내용, 기사 주소, 댓글 내용, 댓글 수에 대해 크롤링할 것이다.
댓글 수가 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"))
}
결과
크롤링 결과는 아래와 같다.
/1.png)
Leave a comment