Yumere

[Python] Web Driver & Selenium 사용하기 본문

Programming

[Python] Web Driver & Selenium 사용하기

Yumere 2015.07.29 04:29

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


저작자 표시
신고
5 Comments
  • 프로필사진 JudeLee 2015.12.04 09:41 신고 정리가 깔끔한거 같습니다 .
    특정한 id, class 를 가지는 element를 기다리도록 sleep 이외에
    def wait_for_element_with_id(self, element_id):
    WebDriverWait(self.browser, timeout=30).until(
    lambda b: b.find_element_by_id(element_id)
    )

    def wait_for_element_with_class(self, element_class):
    WebDriverWait(self.browser, timeout=30).until(
    lambda b: b.find_element_by_class_name(element_class)
    )
    형태로 구현해주셔도 괜찮을거 같습니다. !
  • 프로필사진 Yumere 2015.12.04 09:51 신고 오! 멋지네요.
  • 프로필사진 초이 2016.01.17 18:28 신고 'loginframe'으로 switch가 안되는데, 확인한번 부탁드릴게요
  • 프로필사진 Yumere 2016.01.21 09:40 신고 질문 주셨는데, 조금 늦어진것 같아 죄송합니다.

    질문을 보고 제가 다시 한번 시도해 봤는데, 네이버 로그인 방식이 조금 바뀌어 있네요. 원래는 위의 글처럼 iframe 태그로 이루어져 있어서 switch_to.frame()함수를 써 주어야 했으나, 현재는 iframe이 빠진 상태입니다.

    그러므로 위의 코드에서 driver.switch_to.frame("loginframe")만 제거하시고 다시 시 시도해 보시면 되실 겁니다.
  • 프로필사진 웹크롤러 신생아 2017.04.30 18:33 신고 네이버가 아닌 'hanibus.com' 이 웹 상에서의 로그인과 비밀번호를 올려주신 방법처럼 하려는데
    elem = driver.find_element_by_id("id")
    elem = driver.find_element_by_id("pw")
    의 id와 pw에 무슨 값을 넣어야할지 태그를 잘 못찾겠습니다. ㅠㅠ 도와주실수 있나요? ㅜ
댓글쓰기 폼