호돌찌의 AI 연구소
Published 2021. 7. 2. 23:16
[Crawling] RSelenium Programming/R

 

2019년에 Crawling 공부하면서 정리를 했었던 내용의 일부입니다.

 

 

Selenium 이해


  • 웹 브라우저를 제어하여 웹 어플리케이션 테스트를 자동화하려는 목적으로 사용.
  • Selenium은 하나의 원격 브라우저를 연 다음, 사용자가 웹 서핑을 하듯이 원하는 웹 페이지를 열고, 아이디와 비밀번호를 입력하게 할 수도 있으며, 마우스가 이곳 저곳을 돌아다니면서 클릭하는 행동을 흉내낼 수 있음 → 활용법은 무궁무진

 

Java JDK 설치


  • OS에 맞게 JDK 설치이후 JAVA_HOME 경로 따로 설정해주시면 됩니다.
Java SE Development Kit 8 Downloads
Thank you for downloading this release of the Java™ Platform, Standard Edition Development Kit (JDK™). The JDK is a development environment for building applications, applets, and components using the Java programming language. The JDK includes tools useful for developing and testing programs written in the Java programming language and running on the Java platform.
https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

 

RSelenium 패키지 소개


  • Selnium은 웹 브라우저를 제어하여 웹 애플리케이션 테스트를 자동화하려는 목적으로 주로 사용됨
  • Remote Driver를 설정하여 웹 브라우저를 띄우고, 리모트 웹 브라우저를 원격으로 제어
  • 검색창에 검색어를 입력하고, 마우스로 버튼을 클릭하는 등의 행동을 구현할 수 있음.

 

크롬 드라이버 버전 확인


  • RSelenium 패키지의 함수를 이용해 리모트 웹 브라우저를 띄우기 전에 먼저 binman 패키지의 list_version()함수를 이용해 자신의 컴퓨터에 저장된 크롬드라이버 버전을 확인 해주어야함
    • 만약 컴퓨터에 저장된 크롬 드라이버가 없다면 결과가 출력되지 않을 수 있음
> bidman::list_version(appname = 'chromedriver')

 

크롬 드라이버 설정


  • wdman 패키지의 chrome() 함수를 이용해 크롬 드라이버를 설정함
    • 'port' 인자에 적당한 숫자를 할당하고, 'version'인자에는 앞에서 확인한 크롬드라이버 버전 중 하나 낮은 것을 선택
> driver <- wdman::chrome(port = 4567L, version = '74.0.3729.6')
  • 만약 앞에서 크롬드라이버 버전을 확인했을 때 아무런 값도 출력되지 않았다면 'version' 인자를 생략하고 실행.
> driver <- wdman::chrome(port = 4567L)

 

Rselenium 패키지 주요함수 1 : remote driver 설정


  • remote webdriver를 설정
    • 'port' 인자에 할당된 정수는 앞에서 chrome() 함수에 설정된 값과 같아야함
    • browserNmae 인자는 생략해도 됨.
> library(tidyverse)
> library(RSelenium)
> library(binman)
> library(wdman)
> library(rvest)
> remote <- remoteDriver(port = 4567L, browserName = 'chrome')

 

 

Rselenium 패키지 주요함수 2 : remote web browser 제어


  • 리모트 웹 브라우저 열기
> remote$open()

 

  • 리모트 웹 브라우저 닫기
> remote$close()

 

  • 리모트 웹 브라우저를 열기
> remote$closeWindow()

 

Rselenium 패키지 주요함수 3 : 웹사이트 접속


  • 리모트 웹 브라우저가 열렸으면 원하는 웹 사이트에 접속할 수 있음
> remote$navigate(url = 'https://www.naver.com')
  • 웹 사이트로 이동헀으면 해당 페이지의 HTML을 읽을 수 있음. JavaScript 등 동적인 기능이 모두 완료된 상태이므로 화면에 보이는 내용 그대로 가져올 수 있음. 이 과정에서 시간이 다소 소요됨

 

> html <- remote$getPageSource() %>% '[['(1)

 

 

Rselenium 패키지 주요함수 4 : HTML 요소 찾기


  • 글자 입력 및 마우스 클릭 등의 행동을 하려면 해당 HTML 요소를 찾아야함.
  • 사용자가 Selenium을 이용하여 특정 동작을 제어하기 위해 해당 HTML 요소의 XPath, CSS Selector로 지정해주어야함
  • 네이버 메인 화면 상단 검색의 위치를 xpath로 지정
> query <- remote$findElement(using = 'xpath', 
                            value = '//*[@id="query"]')
  • CSS selector도 가능
> query <- remote$findElement(using = 'css', 
                            value = '#query')

 

Rselenium 패키지 주요함수 5 : 글자 입력


  • 글자 입력창에 원하는 글자를 입력할 수 있음
    • 입력할 곳을 지정한 다음 원하는 글자를 입력하는 방식
    • 네이버의 검색창의 HTML 요소를 'query'로 지정하였으므로, 여기에 검색어 입력 가능
  • 네이버 검색창에 검색어를 입력하는 example
> query$sendKeysToElement(sendKeyw = list('미세먼지'))

 

Rselenium 패키지 주요함수 6 : 버튼 클릭


  • 버튼에 해당하는 HTML 요소의 xpath지정
    • 버튼 관련 태그는 보통 <button>
queryBtn <- remote$findElement(using = 'xpath', 
                               value = '//*[@id="search_btn"]')

# 돋보기 버튼을 클릭
queryBtn$clickElement()

 

Rselenium 패키지 주요함수 7 : 페이지 이동


  • 이전 페이지 이동
> remote$goBack()

 

  • 다음 페이지 이동
> remote$goForward()

 

  • 새로고침
> remote$refresh()

 

Rselenium 패키지 주요함수 8 : 창 이동 및 팝업 제거


  • 새로운 웹 페이지를 열고 팝업이 생겼을 때 팝업 제거가 가능
  • 팝업은 새로운 창(window)으로 인식되므로 현재 열려있는 리모트 웹 브라우저의 window id 를 확인한 뒤 해당 window id 로 옮긴(swich) 후 버튼을 클릭하는 방식으로 팝업 제거 가능
> windowids <- remote$getWindowHandles()
> pipup <- remote$switchToWindow(windowid = windowid[[2]])
> closeBtn <- remote$findElement(using = 'xpath', value = 'btn html')
> closeBtn$clickElement()

 

Rselenium 패키지 주요함수 9 : 경고 확인 및 제거


  • 경고 문구 출력
> remote$getAlertText()

 

  • 경고 수용 (ok)
> remote$acceptAlert()

 

  • 경고 무시 (cancel)
> remote$dismissAlert()

 

 

<Copyright 2019. @hotorch. All rights reserved.>

 

profile

호돌찌의 AI 연구소

@hotorch's AI Labs

포스팅이 도움이 되셨다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!