Selenium 이란?
Selenium automates browsers.
Selenium은 webdriver를 통해 웹 브라우저(ie, chrome, firefox 등)를 자동화 하여 웹 에플리케이션을 테스트 할 수 있는 오픈소스 프레임워크입니다.
다양한 언어 (c#, java, python) 를 지원하며, 상황에 맞게 골라 사용할 수 있죠.
Selenium에는 Selenium WebDriver 와 Selenium IDE 가 있습니다.
Selenium WebDriver
Selenium WebDriver는 지금은 사용되지 않는 Selenium Remote Control의 후속제품으로 다음과 같은 기능이 필요할 경우 사용이 추천됩니다.
브라우저 기반의 강력한 반복 자동화 테스트 생성- 여러 환경에서 Script를 확장 및 배포
Selenium IDE
Selenium IDE는 Firefox 의 확장프로그램(add-on)으로 간단히 recode 및 playback을 사용할 수 있습니다.
다음과 같은 기능이 있을 경우 사용이 추천됩니다.
- 빠른 버그 복제 스크립트 작성
- 자동화 된 예비 검사를 돕기위한 스크립트 작성
이번에 제작하려는 프로그램은 Web Crawler이기 때문에 IDE 는 다음기회에 살펴보기로 하고 Selenium WebDriver를 살펴보기로 합니다.
Selenium + python
Selenium은 많은 언어를 지원하지만 python 을 기반으로 살펴보겠습니다.
간단한 프로젝트를 만들때 python 을 사용하는 이유는 다음과 같습니다.
- 비교적 짧은 코드로 얻을 수 있는 만족스러운 결과물
- 복잡하지 않은 작은 규모의 Application 을 제작하기에 적합
- 파워풀한 Beautifulsoup
- jar 로 배포 시 사용하기 힘들어 하는 사용자가 존재 => 배포시 간단히 exe 로 변환 가능
python requests Crawler와의 차이점
사실 이전부터 사용해오던 간단한 Web Crawler가 존재했습니다.
python 기반으로 가장 쉽게 제작할 수 있는 Beautifulsoup과 requests를 이용한 Crawler였죠.
기능은 간단했습니다.
- 목표 사이트에 로그인
- 원하는 커뮤니티로 이동
- 게시물목록을 읽어들여 게시물 내부의 이미지를 모두 다운로드
해당 프로그램은 약 1년 이상 안정적으로, 또한 성공적으로 그 역할을 완수했습니다.
하지만 최근 해당 사이트의 업데이트로 로그인 보안 강화라는 어쩔 수 없는 이유가 발생하게 됩니다.requests의 로그인 방식은 id와 password를 해당 사이트에 parameter 로 날려서 로그인 세션을 생성해오게 됩니다.
로그인 세션을 발생시키는 url을 확인 후 해당 페이지가 원하는 parameter를 보내주는 방식인거죠.
하지만 이번 업데이트에서는 복잡한 javascript 라이브러리로 사용자의 password와 server 에서 보낸 1회성 key를 조합하여 암호화한 parameter를 넘겨야만 Session이 생성되도록 변경되었습니다.
requests 기반 Crawler의 한계를 느끼는 순간이었습니다.
javascript function 이용의 필요성
사이트 로그인방식은 사실 간단합니다. id 와 pw 를 입력하는 란에 알맞게 넣은 뒤 로그인 버튼을 클릭해주면 되죠. 그 뒤의 복잡한 javascript 구동방식이라던가, 암호화 과정은 고려할 필요가 없습니다.Selenium 역시 사용자가 입력하는 것 처럼 적절히 입력하고 클릭이벤트를 발생시켜 줍니다.
requests는 문자 형식으로 넘어온 html을 분석하기 때문에 javascript function을 실행시킬 수 없었다면, Selenium은 브라우저 자체를 이용하기 때문에 javascript function 까지도 충분히 이용이 가능합니다.
어라… 뭔가 더 좋은게 아닌가?
다만 속도적인 측면에서는 무조건 requests가 빨랐습니다. 아무래도 브라우저가 해당 페이지를 읽어들이는데 필요한 시간이 존재하기 때문이겠지요.
Selenium 설치
본 포스트는 python 3.5가 이미 설치되어 있는 환경이라고 가정하에 작성됩니다. 많은 호환성이 걱정되신다면 Anaconda 환경에서 python 3.5 를 추가하여 사용하시기를 추천드립니다.
1 | pip install selenium |
설치는 간단히 완료되었습니다. 또한 실제 브라우저가 필요하므로 chrome이 설치되지 않았다면 빠르게 설치를 진행해줍니다.
다음은 Chrome 기반으로 작성된 Webdriver 인 ChromeDriver 를 다운로드 받아줍시다.
URL : https://sites.google.com/a/chromium.org/chromedriver/downloads
준비 완료!
라이브라리 import
우선 필요한 라이브러리들을 import 해줍니다.
1 | import os |
selenium.webdriver.common.keys는 실제로 사용자가 입력하는 key 이벤트를 발생시키기 위한 라이브러리 입니다.
ID와 PW를 입력해 줘야 하니 import 합니다.
다음은 Chrome 구동시 옵션입니다. --headless 를 부여하면 chrome 이 백그라운드에서 동작하며 좀더 속도가 향상됩니다. (headless 모드는 chrome 버전 63 부터 사용 가능합니다.)
ChromeDriver를 제작중인 py 파일과 동일한 폴더로 이동시킨 뒤에 해당 Path 를 잡아줍니다.
1 | chrome_options = Options() |
Chrome을 구동합니다.
1 | driver.get("https://logins.daum.net/accounts/loginform.do") |
해당 페이지가 로드된 뒤 로그인 정보를 입력하고 로그인 버튼을 클릭 합니다.
1 | my_id = driver.find_element_by_id("id") #아이디를 입력할 input 위치 |
my_id.clear()로 혹시나 있을지 모르는 초기값을 제거해준 뒤 my_id.send_keys("아이디") 해당 구문을 지정된 input 에 입력해줍니다.
입력이 완료되었다면 login_button.click()으로 로그인을 진행합니다.
driver.quit()는 Chrome을 종료시키는 구문입니다. 프로그램이 완료된 뒤 Chrome 이 종료되기를 원한다면 잊어버리면 안됩니다. (특히 headless의 경우 눈에보이지 않기 때문에 자칫하다가 어마어마하게 실행되어버리는 경우가 발생합니다.)
마무리하며
Selenium은 requests보다 러닝커브가 높은편입니다. 또한 다른 사용자를 위해 제작한 프로그램을 exe로 배포하더라도 chrome 과 chromedriver 를 별도로 다운로드 받아야 하는 등의 불편점도 존재합니다.
하지만 훨씬 강력하며, 매력적인 프레임워크임에는 틀림없어 보입니다.