기사 데이터를 수집하는 방법으로 아래 3가지를 제시한다.
1. 데이터를 하나만 가져오는 방법
2. 여러 페이지의 데이터를 가져오는 방법
3. 조건을 설정하여 데이터를 가져오는 방법
3가지 방법을 구현하는 코드는 거의 비슷하지만 상이한 부분에 대해서는 디버깅을 통해 문제를 해결하는 능력이 필요하다.
1. 기본 package 설정
# 1. 기본 package 설치
library(tidyverse)
library(rvest)
✔️ install.packages("")
2. 데이터를 하나만 가져오는 방법
2-1. 검색어 설정
# 2-1. 검색어 설정
search_url <- "https://search.naver.com/search.naver?where=news&sm=tab_jum&query=ChatGPT"
✔️ 검색어: ChatGpt
2-2. URL 주소 검색
# 2-2. URL 주소 검색
news_url <- search_url %>%
read_html() %>%
# sp_nws1 > div > div > div.news_info > div.info_group > a:nth-child(3)" 앞부분 제거
html_nodes("div.info_group > a:nth-child(3)") %>%
html_attr("href") # 필요한 링크 속성값을 추출
news_url
✔️ "#": id
✔️ ".": class
✔️ "na": 태그
✔️ Copy selector를 이용해 html_nodes 주소를 가져왔다.
✔️ news_url <- " https://n.news.naver.com/mnews/article/025/0003279066?sid=104 "
✅ href: 하이퍼링크 레퍼런스의 약자이다.
2-3. 기사 데이터 저장
# 2-3. 기사 데이터 저장
result_tb <- NULL
result_tb
for (i in 1:length(news_url))
{
news_html <- news_url[i] %>%
read_html()
# 기사 제목
title <-news_html %>%
html_nodes('.media_end_head_headline') %>%
html_text()
# 기사 본문
body <-news_html %>%
html_nodes('#newsct_article') %>%
html_text()
# 언론사
media <- news_html %>%
html_nodes("img.media_end_head_top_logo_img.light_type") %>%
html_attr("title")
# 테이블에 데이터 저장
temp <- tibble(no = i,
출판사 = media,
제목 = title,
본문 = body)
result_tb <- rbind(result_tb, temp) # 데이터 업데이트
}
result_tb
3. 여러 페이지의 데이터를 가져오는 방법
3-1. 여러 페이지 검색어 설정
# 3-1. 여러 페이지 검색어 설정
search_url <- "https://search.naver.com/search.naver?where=news&sm=tab_pge&query=ChatGPT&sort=0&photo=0&field=0&pd=0&ds=&de=&cluster_rank=46&mynews=0&office_type=0&office_section_code=0&news_office_checked=&nso=so:r,p:all,a:all&start=" # 뒤의 숫자 제거
page <- seq(from = 1, to = 500, by = 10)
page
search_url <- str_c(search_url, page) # 40페이지까지 가능
search_url
✔️ 검색어: ChatGpt
✔️ 데이터를 최대한 가져올 수 있으나, 형태소 분석 과정에서 긴 시간이 걸린다.
✔️ to: 가져올 데이터로, 네이버는 데이터를 가져올 수 있는 데이터를 4000개로 제한했다.
✔️ by: 몇 칸씩 뛸 것인지를 정하는 것으로, default는 1이다. 네이버는 기준이 10이다.
✅ str_c: stream 함수로, 글자나 텍스트를 정리하여 분석할 때 사용하는 함수이다.
3-2. 여러 페이지 URL 주소 검색
# 3-2. 여러 페이지 URL 주소 검색
news_url <- NULL
for(i in 1:length(search_url))
{
temp <- search_url[i] %>%
read_html() %>%
html_nodes("div.info_group > a:nth-child(3)") %>%
html_attr("href")
news_url <- c(news_url, temp)
}
news_url
3-3. 기사 데이터 저장
# 3-3. 기사 데이터 저장
result_tb <- NULL
result_tb
for (i in 1:length(news_url))
{
news_html <- news_url[i] %>%
read_html()
# 기사 제목
title <-news_html %>%
html_nodes('.media_end_head_headline') %>%
html_text()
# 기사 본문
body <-news_html %>%
html_nodes('#newsct_article') %>%
html_text()
# 언론사
media <- news_html %>%
html_nodes("img.media_end_head_top_logo_img.light_type") %>%
html_attr("title")
# 테이블에 데이터 저장
temp <- tibble(no = i,
출판사 = media,
제목 = title,
본문 = body)
result_tb <- rbind(result_tb, temp) # 데이터 업데이트
}
result_tb
✅ 일반적인 링크가 아닌 경우에 수집되는 데이터 목록에서 제외된다.
- 일반적인 링크 예시: https://n.news.
- 제외되는 링크 예시: https://sports.
3-4. 결과 내보내기
# 3-4. 결과 내보내기
result_tb %>%
write_excel_csv("Article content analysis.csv")
✔️ 호환이 용이하도록 일반 csv가 아닌 excel_csv로 저장한다.
4. 조건을 설정하여 데이터를 가져오는 방법
4-1. 조건 페이지 검색어 설정
# 4-1. 조건 페이지 검색어 설정
search_url <- "https://search.naver.com/search.naver?where=news&sm=tab_pge&query=ChatGPT&sort=1&photo=3&field=0&pd=3&ds=2023.04.01&de=2023.04.30&mynews=0&office_type=0&office_section_code=0&news_office_checked=&nso=so:dd,p:from20230401to20230430,a:all&start=" # 뒤의 숫자 제거
page <- seq(from = 1, to = 100, by = 10)
page
search_url <- str_c(search_url, page)
search_url
✔️ 정렬: 최신순 (관련도순, 최신순, 오래된순)
✔️ 기간: 2023.04.01. ~ 2023.04.30.
✔️ 유형: 지면기사 (전체, 포토, 동영상, 지면기사, 보도자료, 자동생성기사)
✔️ 언론사: 전체
✔️ 1번 페이지가 아닌 2번 페이지로 넘어가서 주소를 복사해서 사용한다.
4-2. 조건 페이지 URL 주소 검색
# 4-2. 조건 페이지 URL 주소 검색
news_url <- NULL
for(i in 1:length(search_url))
{
temp <- search_url[i] %>%
read_html() %>%
html_nodes("div.info_group > a:nth-child(4)") %>% # 조건이 생성되면서 3->4로 변경
html_attr("href")
news_url <- c(news_url, temp)
}
news_url
4-3. 기사 데이터 저장
# 4-3. 기사 데이터 저장
result_tb <- NULL
result_tb
for (i in 1:length(news_url))
{
news_html <- news_url[i] %>%
read_html()
# 기사 제목
title <-news_html %>%
html_nodes('.media_end_head_headline') %>%
html_text()
# 기사 본문
body <-news_html %>%
html_nodes('#newsct_article') %>%
html_text()
# 언론사
media <- news_html %>%
html_nodes("img.media_end_head_top_logo_img.light_type") %>%
html_attr("title")
# 테이블에 데이터 저장
temp <- tibble(no = i,
출판사 = media,
제목 = title,
본문 = body)
result_tb <- rbind(result_tb, temp) # 데이터 업데이트
}
result_tb