Webdriver & Selenium
Web Driver는 FireFox, Chrome 등과 같은 브라우저에서 제공하는 API들로, 이를 이용하면 코드를 통해 실제 사용자가 브라우저를 다루는 것처럼 사용할 수 있다. 또한 Python에는 이러한 Web Driver를 사용하기 위한 Selenium이라는 라이브러리가 존재한다. 이러한 Web Driver를 이용하면, 단순 패킷 요청만 하는 것이 아닌 브라우저 자체를 이용하는 것이기 때문에 JS와 CSS에 관한 것들도 자동으로 테스트를 할 수 있고, Google과 같이 크롤링 하기 힘든 곳도 크롤링을 할 수 있다.(물론 느리다)
Web Driver로 사용가능한 브라우저로는,
- Firefox
- Chrome
- IE
- Opera
- PhantomJs
등의 브라우저가 존재하고, 이 중 Phantom JS를 이용할 경우, 실제 브라우저를 이용하는 것이 아니라 가상의 브라우저를 이용해 실제 사용자가 브라우징 하는 것처럼 행동할 수 있다.
보통은 Phantom JS를 사용하지만, 이 글에서는 Phantom JS에 대해서 다루지는 않는다.
먼저, Python에서 Web Driver를 사용하려면 사용할 브라우저의 Driver와 Selenium 라이브러리를 설치해야한다. 이 글에서는 FireFox와 OSX를 기준으로 설명하며, FireFox Driver는 FireFox 브라우저를 설치하면 자동으로 설치된다. 또한, Selenium에 대해서는 링크에서 확인할 수 있다.
이 글에서는 Web Driver와 python의 Selenium 라이브러리를 이용해 간단하게 naver를 들어가고, 로그인과 검색을 하도록 한다.
Selenium 설치
pip을 이용해 selenium을 설치한다.
$ pip install selenium
Naver 로그인
먼저, selenium의 webdriver를 import하고 FireFox driver를 생성한다.
from selenium import webdriver
driver = webdriver.Firefox()
그리고, driver
의 get()
함수를 이용해 Naver에 접속한다.
driver.get("http://naver.com")
Naver에 들어가면 이제 로그인 창이 보이게 되는데, 일반적으로 JS에서 element를 선택하는것과 마찬가지로find_element_by_id(_id)
함수를 이용해 선택하게 되는데, Naver는 로그인 창이 일반적이지 않고, iframe 태그로 이루어져 있기 때문에 switch_to.frame()
함수를 이용해 frame을 옮겨 주어야 한다.
아래 사진과 같이, 개발자 도구를 이용해 iframe을 살펴보면 iframe의 id 값을 알 수 있다.
이를 이용해 iframe을 변경하고, 아이디와 비밀번호를 입력하는 input 태그의 id 값으로 find_element_by_id(_id)
함수를 호출하여 각 값을 입력한다. 이후 submit()
함수를 이용하면 로그인이 성공한다.
driver.switch_to.frame("loginframe")
elem = driver.find_element_by_id("id")
elem.send_keys("user_id")
elem = driver.find_element_by_id("pw")
elem.send_keys("user_pw")
elem.submit()
Naver 검색
위의 로그인에서와 마찬가지로 개발자 도구를 이용해 아래와 같이 검색창 input 태그의 id를 찾고, find_element_by_id(_id)
와 send_keys()
함수를 이용해 값을 입력하고, submit()
함수를 이용해 검색을 실행하면 된다.
elem = driver.find_element_by_id("query")
elem.send_keys("naver")
elem.submit()
유의사항
만약 위의 로그인과 검색 코드를 연달아서 실행한다면 에러가 출력될 수 있다. 이는 로그인 후 리다이렉트 되는 속도에 비해, 코드 실행속도가 너무 빨라 발생하는 일이므로 로그인과 검색 사이에 sleep(1)
을 주면 해결된다.
source code
'Programming' 카테고리의 다른 글
React JS Lifecycle Method 소개 (0) | 2015.11.22 |
---|---|
React JS 소개와 간단한 사용법 및 에제 (2) | 2015.10.18 |
집단지성 프로그래밍 4(Hierarchical Clustering) (0) | 2015.07.12 |
집단지성 프로그래밍 3(Term Vector) (0) | 2015.07.08 |
집단지성 프로그래밍 2(Recommendations) (0) | 2015.07.04 |