소개

김태경

내용

  • CSS Selector
  • Chrome and Chromote
  • rvest

시작하기 전

  • R and RStudio
  • HTML

CSS Selector

Chrome

install.packages("remotes")
install.packages("dplyr")
install.packages("rvest")
remotes::install_github("rstudio/chromote")

설치가 완료되면 정상적으로 자동되는지 확인하자.

library(dplyr)
library(rvest)
library(chromote)

Chromote site: 바로가기

Headless browser

웹브라우저는 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()

loadEventFired

크롬에서 웹사이트(서버)에 방문할 때 데이터가 더 이상 들어오지 않을 때까지 기다릴 필요가 있다. 물론 load event가 한번 종료된 이후에도 새로운 이벤트로 데이터가 추가될 가능성이 있다.

{
  b$Page$navigate("http://www.naver.com",wait_=FALSE) #loadEventFired 준비
  b$Page$loadEventFired() #대기한다.
  Sys.sleep(5) #추가로 5초간 더 대기한다.(동영상 렌더링 시간을 확보-클라이언트에서)
} #한 개의 그룹으로 실행한다. { }

Runtime

크롬을 컨트롤하려면 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

패키지 rvest는 문자로 된 html 소스를 R이 다룰 수 있는 객체로 바꿔준다(parsing이라고 함). 크롬에서 받아온, 가령 .outerHTML의 결과물을 파싱하여 데이터 작업을 하면 된다. 이때 dplyr 등 데이터 관련 패키지를 사용하면 생산성을 높일 수 있다.

Online Tutorial

rvest는 아주 유명하다. 다음은 자습을 위한 온라인 튜토리얼이다.