install.packages("remotes")
install.packages("dplyr")
install.packages("rvest")
remotes::install_github("rstudio/chromote")
설치가 완료되면 정상적으로 자동되는지 확인하자.
library(dplyr)
library(rvest)
library(chromote)
Chromote site: 바로가기
웹브라우저는 javascript를 사용하는 동적 웹페이지의 정보를 수집하기 위해 반드시 필요하다. 그러나 웹브라우저를 직접 컨트롤 하는 일은 어렵고, 또한 속도도 느리다. 이러한 문제는 프로그램의 보조 도구로 브라우저를 실행할 수 있도록 하는, 즉 headless mode로 완화시킬 수 있다. 크롬은 자체적으로 headless mode를 지원한다. chromote는 R에서 Google Chrome의 headless mode를 사용하도록 돕는다.
library(chromote) #loading chromote
b=ChromoteSession$new() #새로운 세션(브라우저) 실행함
#...
b$close() #세션을 닫음
브라우저로 네이버를 방문해서 screenshot을 찍어보자.
library(chromote)
b=ChromoteSession$new()
b$Page$navigate("http://www.naver.com") #링크 방문
b$screenshot('naver.png') #스크린샷 naver.png
b$close()
크롬에서 웹사이트(서버)에 방문할 때 데이터가 더 이상 들어오지 않을 때까지 기다릴 필요가 있다. 물론 load event가 한번 종료된 이후에도 새로운 이벤트로 데이터가 추가될 가능성이 있다.
{
b$Page$navigate("http://www.naver.com",wait_=FALSE) #loadEventFired 준비
b$Page$loadEventFired() #대기한다.
Sys.sleep(5) #추가로 5초간 더 대기한다.(동영상 렌더링 시간을 확보-클라이언트에서)
} #한 개의 그룹으로 실행한다. { }
크롬을 컨트롤하려면 Runtime을 호출한다. Runtime은 크롬의 실행 엔진을 말한다. 엔진에 evaluate()를 실행하여 자바스크립트를 삽입하여 일을 처리하자. 이를 Javascript injection이라고 한다.
result=b$Runtime$evaluate('document.querySelector("title").innerHTML;')
output=result$result$value
CSS Selector 구문으로 객체를 선택하려면 document.querySelector()나 document.querySelectorAll() 안에 CSS 코드를 넣는다.
document.querySelector()는 한 개체를 반환한다. 이것에 .innerHTML 속성을 붙이면 객체 안의 내용을 받아온다. 만약, HTML 객체 혹은(element)를 포함하여 가져오려면 .outerHTML 속성을 사용한다.
이외에도 자바스크립트를 evaluate()로 실행할 수 있기 때문에 버튼 클릭이나 키 입력, 스크롤 기능도 사용할 수 있다. 또한 필요에 따라서 javascript를 강제 실행하거나 API 실행을 해킹하는 일도 가능하다.
패키지 rvest는 문자로 된 html 소스를 R이 다룰 수 있는 객체로 바꿔준다(parsing이라고 함). 크롬에서 받아온, 가령 .outerHTML의 결과물을 파싱하여 데이터 작업을 하면 된다. 이때 dplyr 등 데이터 관련 패키지를 사용하면 생산성을 높일 수 있다.
rvest는 아주 유명하다. 다음은 자습을 위한 온라인 튜토리얼이다.