StoryCode

Selenium 을 이용한 Web Crawling

Chrome Browser 활용법
반응형

Selenium이란?


Selenium은 주로 웹앱을 테스트하는데 이용하는 프레임워크다. webdriver라는 API를 통해 운영체제에 설치된 Chrome등의 브라우저를 제어하게 된다.

브라우저를 직접 동작시킨다는 것은 JavaScript를 이용해 비동기적으로 혹은 뒤늦게 불러와지는 컨텐츠들을 가져올 수 있다는 것이다. 즉, ‘눈에 보이는’ 컨텐츠라면 모두 가져올 수 있다는 뜻이다. 우리가 requests에서 사용했던 .text의 경우 브라우저에서 ‘소스보기’를 한 것과 같이 동작하여, JS등을 통해 동적으로 DOM이 변화한 이후의 HTML을 보여주지 않는다. 반면 Selenium은 실제 웹 브라우저가 동작하기 때문에 JS로 렌더링이 완료된 후의 DOM결과물에 접근이 가능하다.

어떻게 설치하나?


pip selenium package

Selenium을 설치하는 것은 기본적으로 pip를 이용한다.

pip install selenium

참고: Selenium의 버전은 자주 업데이트 되고, 브라우저의 업데이트 마다 새로운 Driver를 잡아주기 때문에 항상 최신버전을 깔아 주는 것이 좋다.

이번 튜토리얼에서는 BeautifulSoup이 설치되어있다고 가정합니다.

BeautifulSoup은 pip install bs4로 설치 가능합니다.

webdriver

Selenium은 webdriver라는 것을 통해 디바이스에 설치된 브라우저들을 제어할 수 있다. 이번 가이드에서는 Chrome을 사용해 볼 예정이다.

Chrome WebDriver

크롬을 사용하려면 로컬에 크롬이 설치되어있어야 한다.

그리고 크롬 드라이버를 다운로드 받아주자.

https://sites.google.com/a/chromium.org/chromedriver/downloads

글 작성일자인 2월 27일에는 ChromeDrive 2.27버전이 최신이며, 크롬 v54~56을 지원한다.


다운로드하면 실행파일이 나타나는데, Selenium 객체 생성시 전체 디렉토리명이 필요하다.


PhantomJS webdriver

PhantomJS는 기본적으로 WebTesting을 위해 나온 Headless Browser다.(즉, 화면이 존재하지 않는다)

하지만 JS등의 처리를 온전하게 해주며 CLI환경에서도 사용이 가능하기 때문에, 만약 CLI서버 환경에서 돌아가는 크롤러라면 PhantomJS를 사용하는 것도 방법이다.

PhantomJS는 PhantomJS Download Page에서 받을 수 있다.

Binary 자체로 제공되기 때문에, Linux를 제외한 OS에서는 외부 dependency없이 바로 실행할 수 있다.


from selenium import webdriver

from bs4 import BeautifulSoup



driver = webdriver.Chrome('chromedriver.exe')

driver.implicitly_wait(3)


#driver = webdriver.PhantomJS('c:\Users\PC1\Desktop\0000-000,Project.Dev.Repository\Dev.Python\WebCrawling\phantomjs.exe ')



driver.get('https://nid.naver.com/nidlogin.login')

driver.find_element_by_name('id').send_keys('아이디')

driver.find_element_by_name('pw').send_keys('암호')

driver.find_element_by_xpath('//*[@id="frmNIDLogin"]/fieldset/input').click()

driver.find_element_by_xpath('//*[@id="frmNIDLogin"]/fieldset/span[2]/a').click()


# Naver 페이 들어가기

driver.get('https://order.pay.naver.com/home')

html = driver.page_source

soup = BeautifulSoup(html, 'html.parser')

notices = soup.select('div.p_inr > div.p_info > a > span')


for n in notices:

    print(n.text.strip())



[ 참조 ] https://beomi.github.io/2017/02/27/HowToMakeWebCrawler-With-Selenium/


반응형