호돌찌의 AI 연구소
article thumbnail

19년 하반기에 강의 했었던 내용을 짧게 일부 발췌하였습니다. 최소한은 이 부분은 알고 가신 다음에 적용하는 것이 좋습니다. 


 

우리가 인터넷에서 정보를 검색하는 방법

 

  • 클라이언트가 웹브라우저에 주소(URI) 입력
  • 웹 서버로 데이터 요청(Request)
  • 요청이 정상적 → 웹 서버에서 HTTP 요청에 따라 결과를 발송(Response)
  • 웹 브라우저에서 HTML 출력(Randering)

 

R에서의 웹 크롤링과 인터넷 검색의 유사점

 

  • 저희 튜토리얼에서 다루는 범위는 Get, Post방식은 다루지 않습니다.
  • RSelenium, rvest, dplyr을 다룰 예정입니다.
  • 정규표현식과 stringr, Get, Post는 추후에 다른 사이트 긁을일이 생긴다면 공부를 따로 하는 것이 좋습니다.

 

웹 크롤링을 위해 추가로 알아야할 사항

  • 크롬 개발자 도구 : 웹 구조를 파악하기 제일 기초적인 도구입니다.(network tab 부분은 안다룰 예정입니다.)
  • 로케일 및 인코딩 : window, mac에 따라서 다르게 적용해주어야합니다.(이번 수업에서 안다룰 예정입니다.)
  • 다양한 에러 해결법(반복문을 돌리다가 에러가 발생하여 전체 반복문이 중단되는 경우만 다룰 예정입니다. ip가 차단된 경우, 응답코드가 막히는 경우는 다루지 않습니다)
  • 정규표현식(여기는 정말 Hell입니다. 책이 하나 따로 있을 정도입니다. 따로 공부를 하셔야합니다.)
정규표현식과 stringr
str_count : 찾고자 하는 패턴이 몇 개가 있는지 셈
str_detect : 찾고자 하는 패턴이 있는지 TRUE/FALSE로 반환
str_extract str_extract_all : 찾는 패턴을 뽑아서 출력
str_locate str_locate_all : 찾는 패턴의 글자내 시작점과 끝점을 출력
str_match str_match_all : 찾는 패턴을 뽑아주는데 캡쳐 그룹도 같이 제공
str_replace str_replace_all : 찾는 패턴을 다른 내용으로 바꿈
str_split str_split_fixed : 지정한 패턴으로 글자를 나눔
str_subset : 찾는 패턴이 있는 위치의 데이터를 출력
str_which : 찾는 패턴이 있는 데이터의 위치를 출력
str_view str_view_all : html로 매칭된 내용을 출력
 
출처 : https://mrchypark.github.io/dabrp_classnote2/class4#1

 

이것만 알고 넘어가요

HTML 기초

  • HTML은 웹 페이지의 제목, 단락, 목록 등 문서의 구조를 나타내는 마크업 언어입니다.
    • < > 안에 태그로 되어있는 HTML 요소 형태로 작성
    • HTML의 디자인을 담당하는 CSS와 웹 브라우저를 제어하는 javaScript를 함께 사용 → 상호작용하는 웹 페이지를 구현

HTML 요소

  • HTML 요소는 HTML 문서나 웹 페이지를 구성하는 개별 항목을 의미
  • 시작태그와 종료태그로 작성되며, 그 사이에 내용이 포함
  • 태그는 < > 로 감싸며, 시작 태그에 속성명과 속성값이 포함되고, 종료 태그에는 '/' 가 추가됩니다.

 

 

CSS Selector & XPath 표기법 비교

  • CSS는 HTML의 디자인을 담당합니다. HTML 요소에 포함된 Selector를 참조해 웹 브라우저에 출력되는 모습을 변경합니다.
  • XPath(XML Path Language)는 계층 구조를 갖는 XML 문서에서 노드를 탐색하는 경로로 사용, selenium에서 사용할 경우 조금 더 빠릅니다.
  • 이 표는 달달 외워두시면 크롤링 실력이 많이 향상될 것입니다. 붙이는 것과 비교하면서 이해하시는게 최고입니다.

Rselenium


Selenium 이해

  • Selenium은 파이썬, R(Rselenium)에서 모두 작동할 수 있습니다.
  • Selenium은 웹 브라우저를 제어하여 웹 APP 테스트를 자동화 하려는 목적을 가졌습니다.
  • 하나의 원격 브라우저를 따로 연 다음, 사용자가 웹 서핑하듯이 페이지를 열고, id, pw를 입력하며, 마우스가 이곳 저곳 돌아다니면서 클릭하는 행동을 흉내낼 수 있습니다.

 

Selenium 환경

  • Java JDK를 설치해놔야 합니다. (1.8.0_211은 h2o, selenium 잘 돌아 갑니다.)
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
  • Java를 설치했다면 환경변수에서 'JAVA_HOME'과 'Path'를 설정해야 R에서 동작합니다.
[JAVA] 자바 환경변수 설정 (윈도우10)
정보/팁 주인장 라떼베리 2016.02.21 20:22 자바 프로그래밍 환경 구축방법 입니다. (자바 JDK 다운로드 방법은 여기서 안내 해 드립니다) 1. 자바 설치후 설치 경로입니다. 설치 경로는 설치 파일에서 설정 가능합니다. 2. [내컴퓨터 - 속성] 또는 [제어판\시스템 및 보안\시스템] 에서 왼쪽의 '고급 시스템 설정' 으로 들어갑니다. 4. 환경 변수 창입니다.
https://macchiato.tistory.com/9
  • Rselenium 패키지는 R에서 Selenium을 동작시키기 위해 사용합니다.

 

Rselenium 브라우저 설정

  • 크롬 드라이버 vs Phantom Js
    • 크롬이 편하긴 하지만 이것저것 설치해야할 것이 몇개 있습니다.
    • 그리고 궁극적으로 뽑고자 하는 사이트는 크롬이 먹히질 않습니다. (이것은 아직도 이유를 못찾고 있습니다.) 저희는 Phantom JS를 바탕으로 진행할 예정입니다. (설치할것이 없습니다.)

 

 

실습에 활용할 함수들


★ 실습 코드는 메일에 보내겠습니다


Rselenium Function 1 : remote driver 설정


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

 

 

Rselenium Function 2 : remote web browser 제어


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

 

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

 

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

 

Rselenium Function 3 : 웹사이트 접속


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

 

 

Rselenium Function 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 Function 5 : 글자 입력


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

 

Rselenium Function 6 : 버튼 클릭


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

 

Rselenium Function 7 : 페이지 이동


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

 

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

 

  • 새로고침
> remote$refresh()

 

Rselenium Function 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 Function 9 : 경고 확인 및 제거


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

 

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

 

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

 

 

 

<Copyright 2019. 정호영. All rights reserved.>

'Programming > R' 카테고리의 다른 글

R 정규표현식 기본문법  (0) 2021.07.17
[Crawling] R stringr 패키지 사용법  (0) 2021.07.06
[Crawling] RSelenium  (0) 2021.07.02
[Crawling] JavaScript가 사용된 Webpage 긁기  (0) 2021.06.22
[Crawling] XML, JSON in R  (0) 2021.06.17
profile

호돌찌의 AI 연구소

@hotorch's AI Labs

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