19년 하반기에 강의 했었던 내용을 짧게 일부 발췌하였습니다. 최소한은 이 부분은 알고 가신 다음에 적용하는 것이 좋습니다.
우리가 인터넷에서 정보를 검색하는 방법
- 클라이언트가 웹브라우저에 주소(URI) 입력
- 웹 서버로 데이터 요청(Request)
- 요청이 정상적 → 웹 서버에서 HTTP 요청에 따라 결과를 발송(Response)
- 웹 브라우저에서 HTML 출력(Randering)
R에서의 웹 크롤링과 인터넷 검색의 유사점
- 저희 튜토리얼에서 다루는 범위는 Get, Post방식은 다루지 않습니다.
- RSelenium, rvest, dplyr을 다룰 예정입니다.
- 정규표현식과 stringr, Get, Post는 추후에 다른 사이트 긁을일이 생긴다면 공부를 따로 하는 것이 좋습니다.
웹 크롤링을 위해 추가로 알아야할 사항
- 크롬 개발자 도구 : 웹 구조를 파악하기 제일 기초적인 도구입니다.(network tab 부분은 안다룰 예정입니다.)
- 로케일 및 인코딩 : window, mac에 따라서 다르게 적용해주어야합니다.(이번 수업에서 안다룰 예정입니다.)
- 다양한 에러 해결법(반복문을 돌리다가 에러가 발생하여 전체 반복문이 중단되는 경우만 다룰 예정입니다. ip가 차단된 경우, 응답코드가 막히는 경우는 다루지 않습니다)
- 정규표현식(여기는 정말 Hell입니다. 책이 하나 따로 있을 정도입니다. 따로 공부를 하셔야합니다.)
이것만 알고 넘어가요
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를 설치했다면 환경변수에서 'JAVA_HOME'과 'Path'를 설정해야 R에서 동작합니다.
- 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 |