[withR]RSelenium을 이용한 웹스크래핑-텍스트 수집

Neo Jeong
신나는연구소
Published in
5 min readDec 26, 2019

이전 포스팅에서는 R과 Selenium 그리고 크롬의 웹드라이버를 작동시키는 부분까지 했었습니다.

여기서는 작동시킨 후 필요한 텍스트를 수집하는 부분을 진행합니다.

다른 패키지 httr등으로 get방식을 이용해서 스크랩 할 수도 있지만, RSelenium을 이용하는 이유는 자바스크립(javascript)로 작성된 페이지에서는 별도의 페이지 url이 생성되지 않고, 자바스크립트 이벤트 핸들러를 작동 시켜서 결과값 불러들여야 해당 내용의 텍스트를 수집가능하기 때문이다.

그럼 다시 웹드라버를 실행 시키자

library(RSelenium) #브라우저를 제어하기 위한 패키지

library(rvest) #HTML처리

library(httr) #HTML처리

library(stringr) #문자열 함수

ch=wdman::chrome(port=4567L) #크롬드라이버를 포트 4567번에 배정

remDr=remoteDriver(port=4567L, browserName=’chrome’) #remort설정

remDr$open() #크롬드라이버 실행

여기까지는 이전 포스팅을 보면 금방 이해할 것으로 생각됨.

예제로 네이버 쇼핑에서 판매되는 특정 상품의 리뷰를 수집해보자.

우선 네이버 쇼핑 페이지로 이동하려면 아래와 같이 입력하자.

remDr$navigate(https://search.shopping.naver.com/detail/detail.nhn?nv_mid=5365196529&cat_id=50000448&frm=NVSHATC&query=%EC%98%A4%ED%9C%98)

이미지 썸네일 삭제

오휘 선 사이언스 파우더 선블럭 EX 20g (SPF50) : 네이버쇼핑

종류 : 선파우더형태 : 루스형사용부위 : 페이스용사용효과 : 피지케어, 백탁현상방지용량 : 20g자외선차단지수 : 50PA지수 : PA+++피부타입 : 모든피부용특징 : 자외선차단

search.shopping.naver.com

어느 정도 리뷰수(4000개정도)가 있는 ‘오휘 선 사이언스 파우더 선블럭’에 대한 리뷰를 수집 해보려고 한다.

대표사진 삭제

#오휘 선 사이언스 파우더 선블럭에 대한 상품리뷰

쇼핑몰리뷰 영역을 보면, 한페이지의 20개정도의 리뷰가 보일 것이다. 여기서 각 페이지를 눌러보면서 주목해야 할 부분은, 다른 페이지로 넘어가더라도 페이지 주소는 동일하다는 것이다.

자바스크립트(javascript)로 작성된 페이지로 이벤트가 작동되어 페이지가 생성되기 때문이다.

모든 페이지의 리뷰를 스크랩하려면, 해당 자바스크립트를 찾아 실행 시켜야한다.

자바스크립트 부분을 찾기위해서는 크롬의 개발자 도구를 실행 시킨다.

대표사진 삭제

사진 설명을 입력하세요.

개발자 도구를 실행 시킨 후 다음과 같은 도구를 활용해 자바스크립트 이벤트 핸들러를 찾아낸다.

1번 부분에 마우스커서 모양을 누른다

2번 부분에 다음 페이지 부분에 마우스를 갖다 댄다

다음으로 다시 1번 밑에 사이트의 HTML요소를 확인할수 있는 창에서 파란색으로 칠해지는 부분을 찾는다.

대표사진 삭제

#크롬 개발자 도구

위와 같은 방법으로 탐색을 해보면, 내가 실행하고자 하는 자바스크립트를 찾을수 있다.

“shop.detail.ReviewHandler.page(2, ‘’); return false;” 다음 페이지로 넘기기 위해서는 이 부분을 실행시켜야한다.

page(2, ‘’), page(3,’’)….식으로 페이지 번호가 자동으로 바뀌면서 실행되어야 하므로 for문을 이용한다.

All_review=c() #텍스트를 모으기 위한 백터공간

for(i in 1:210) { #페이지 수만큼 반복하여 review긁어오기

a=i #페이지 번호

first=”shop.detail.ReviewHandler.page(“ #i를 변수로 받기 위해서 문장을 분해 i자리 앞쪽

secon=”, ‘’); return false;” #i자리 뒤쪽

script=paste(first,a,secon,sep=’’) # a는 자동적으로 i를 받아 변하고 paste를 통해 한문장이 됨.

pagemove <- remDr$executeScript(script, args = 1:2) #args 요 부분 의미는 잘 모르겠음.

source<-remDr$getPageSource()[[1]] #페이지 소스 가져오기

main <- read_html(source)

mainfo=html_nodes(main,css=’.atc’)

review=mainfo%>%html_text() #텍스트만 가져오기

All_review=c(All_review,review) #텍스트 저장

}

대표사진 삭제

사진 설명을 입력하세요.

이렇게 작성 시키면 텍스트가 c()백터에 저장된다.

--

--

Neo Jeong
신나는연구소

#Data Analyst #세상을 보는 데이터 분석가 #책을 읽는 몽상가