RSelenium으로 뉴스 헤드라인 수집

2019.05.06 01:53R/Web Crawling

서비스를 제공하는 쪽에서 웹 크롤링을 차단을 하거나, 데이터가 동적으로 변하는 경우 기존 방법 대신에 RSelenium을 사용하면 손쉽게 데이터를 수집할 수 있다.

Selenium 설치 방법은 추후 업데이트 예정 

 

 

library(RSelenium)
library(rvest)
library(tidyverse)

remDR <- remoteDriver(remoteServerAddr = 'localhost',
                      port = 4445L,
                      browserName = 'chrome')

remDR$open()
remDR$navigate('http://naver.com')

위 명령어를 실행하면 크롬 창으로 네이버페이지가 자동으로 뜬다.

지금부터 R 스튜디오에 입력 후 실행하는 명령을 그대로 반영할 수 있다.

명령어를 사용하여 뉴스 버튼을 클릭해서 뉴스 페이지가 뜨도록 해보자

 

#########################################################
## click to load news

btn <- remDR$findElement(using = 'css selector', value = '.an_a.mn_news')
btn$clickElement()

 

자동으로 뉴스 페이지가 로딩되는 것을 볼 수 있다. 뉴스 헤드라인 5개를 수집해보자

 

rvest패키지를 사용하면 일반적으로 read_html을 사용하여 xml정보를 수집할 수 있다.

그러나 일부 사이트에서는 해당 기능을 원천적으로 막는 경우가 있다.

이럴 때 RSelenium의 기능을 활용할 수 있다.

 

 
## parsed top news 

html <- remDR$getPageSource()[[1]] 
parsed <- read_html(html) 

hd.title <- parsed %>% html_nodes('.hdline_article_tit > a') %>% html_text() %>% as.tibble %>%
  mutate(length = str_length(value)) %>% filter(length > 0) %>% select(-length) %>% 
  rename(title = value)
hd.url <- parsed %>% html_nodes('.hdline_article_tit > a') %>% html_attr('href') %>% as.tibble %>% 
  mutate(length = str_length(value)) %>% filter(length > 0) %>% select(-length) %>% 
  rename(url = value)

hd.top5 <- bind_cols(hd.title, hd.url)
hd.top5

 

getPageSource()를 사용하면 페이지 전체를 긁어오면서 read_html만 사용 했을 때 누락되었을 수도 있는 내용이 포함된다. 해당 소스에 read_html을 사용 하면 된다.