본문 바로가기

Programming

[Python] Web Driver & Selenium 사용하기

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()


그리고, driverget()함수를 이용해 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