개발자/파이썬

파이썬 (Python) Selenium (기본, 네이버 로그인)

june__kim 2020. 12. 31. 15:45

파이썬 (Python) Selenium (기본, 네이버 로그인)

 

저번 글에서는 BeautifulSoup에 대해서 다루었다.

 

2020/12/30 - [개발자/파이썬] - 파이썬 웹스크래핑(web scraping)

2020/12/30 - [개발자/파이썬] - 파이썬 웹스크래핑(web scraping)_2

 

 

이번에 다룰 것은 Selenium인데 이게 진짜 찐이다.

 

BeautifulSoup과는 다르게 동적인 부분을 처리할 수 있다. (입력, 버튼 클릭, 스크롤 등등)

또한 자바스크립트 렌더링도 지원되어서 더욱 편리하다.

 

Selenium을 사용하기 위해서 그 전에 해야 할 작업들이 있는데,

(참고로, 다들 크롬을 사용한다는 전제하에 진행한다.)

 

먼저, webdriver를 설치해야한다.

이를 위해서 크롬 버전을 확인해야하는데, 아래의 그림처럼 확인 할 수 있다.

크롬 버전 체크

 

버전을 잘 확인하고 아래의 웹사이트에서 자신의 버전과 맞는 Chromedriver를 설치해주면 된다.

( sites.google.com/a/chromium.org/chromedriver/downloads )

 

 

그리고 이제 터미널창으로 와서 "pip install selenium" 을 통해 모듈을 설치한다.

(가끔 pip이 아니라 pip3로 입력해야 되는 분들이 있던데,

이건 아마 파이썬 버젼의 차이때문에 발생하는 것 같다. 이게 안된다면 pip3로 해보자)

 

이제 아래의 코드가 사실상 가장 기본이 된다.

from selenium import webdriver

browser = webdriver.Chrome("각자 Chromedriver의 위치") 

# 1. 네이버 이동
browser.get("http://www.naver.com")

이때 하나 주의할 점! webdriver.Chrome()의 인자에 "꼭" 현재 Chromedriver의 위치를 넣어주자.

(Chromedriver가 파이썬 파일과 같은 폴더내에 위치한다면 굳이 쓸 필요없다고 어디서 본 것 같았는데, 필자의 경우 Chromedriver의 위치를 제대로 넣어주지 않으면 계속 에러가 나더라... 그냥 애매하면 넣어주는게 속 편할 듯)

 

 

이 코드를 돌리면 짜잔 하면서 네이버 페이지가 뜬다.

 

이제 selenium에서 제공하는 다양한 메소드들을 하나씩 보면,

from selenium import webdriver

browser = webdriver.Chrome("각자의 WebDriver 위치") 

browser.get("http://www.naver.com")

elem = browser.find_element_by_class_name("link_login")
elem.click()
browser.back()
browser.forward()
browser.refresh()
browser.back()


from selenium.webdriver.common.keys import Keys

elem = browser.find_element_by_tag_name("a")
elem = browser.find_elements_by_tag_name("a")

elem.send_keys("나도코딩")
elem.send_keys(Keys.ENTER)
browser.back()

browser.quit() # 모든 탭 나가기
browser.close() # 하나의 탭 나가기

exit() #파이썬 나가기

 

정말 다양한 메소드들이 있다.

find_element_by_class_name, find_element_by_class_id, find_element_by_class_xpath 등등을 통해 element를 찾을 수 있다.

(HTML을 분석해보면서 element를 찾아야한다.)

또한 element를 click()를 통해 클릭할 수도 있고 back(), forward(), refresh(), 등등의 동작들도 수행 할 수 있다.

 

그리고 "from selenium.webdriver.common.keys import Keys" 를 통해 Keys를 import하고

element를 찾아서 send_keys("---")를 통해 키 값을 입력할 수 있고, send_keys(Keys.ENTER)를 통해 엔터 동작을 수행 할 수 있다.

 

 

이정도 메소드만으로도 많은 것들을 충분히 해낼 수 있다.

 

네이버 자동 로그인 예제 코드와 실제 실행 영상을 한번 보면,

import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys

browser = webdriver.Chrome("각자의 chromedriver 경로") 

# 1. 네이버 이동
browser.get("http://www.naver.com")

# 2. 네이버 로그인 버튼 클릭
elem = browser.find_element_by_class_name("link_login")
elem.click()

# 3. 아이디, 비밀번호 입력

browser.find_element_by_id("id").send_keys("id")
browser.find_element_by_id("pw").send_keys("password")

# 4. 로그인 버튼 클릭
browser.find_element_by_id("log.login").click()

time.sleep(3) # 동시 처리되는 것을 막기 위해 3초를 쉰다.

 

로그인 시도 영상

잘 동작하는 것을 확인 할 수 있다.

 

하지만 네이버에서 이 동작을 컴퓨터에서 자동적으로 실행된 것이라는 것을 알고 자동입력 방지문자를 입력하라고 요구한다.

 

네이버 자동 로그인을 위해서 

구글링한 결과 여러가지 방법이 있지만 가장 보편적인(?) 것은 자바스크립트 코드를 삽입하는 방식이었다.

(출처: jaeseokim.github.io/Python/python-Selenium%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%9B%B9-%ED%81%AC%EB%A1%A4%EB%A7%81-Naver-login-%ED%9B%84-%EA%B5%AC%EB%8F%85-Feed-%ED%81%AC%EB%A1%A4%EB%A7%81/ )

import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys

browser = webdriver.Chrome("각자") 

# 1. 네이버 이동
browser.get("http://www.naver.com")

# 2. 네이버 로그인 버튼 클릭
elem = browser.find_element_by_class_name("link_login")
elem.click()

# 3. 아이디, 비밀번호 입력

input_js = '\
        document.getElementById("id").value = "{id}"; \
        document.getElementById("pw").value = "{pw}"; \
    '.format(id = "gutenjune", pw = "password") # 각자의 아이디와 패스워드를 넣자.

time.sleep(2)
browser.execute_script(input_js)
time.sleep(3)

# 4. 로그인 버튼 클릭
browser.find_element_by_id("log.login").click()

time.sleep(3) # 동시 처리되는 것을 막기 위해 3초를 쉰다.

(이때 코드 중간중간에 time.sleep(3)처럼 몇 초가 쉬어주는 경우가 있는데 동시처리가 되는 것을 막기 위해 이렇게 몇 초씩은 쉬어준다.)

 

위의 코드를 실행시켜보면 다음과 같이 동작한다.

개발을 할 줄 아는 사람들은 이런 방식을 통해 업무를 자동화하는 경우가 많더라.

 

물론 아직 많이 부족하지만, 충분히 다양한 것들을 시도해볼 수 있을 것 같다.