SW개발/python

[python] selenium 활용한 웹사이트 자동 로그인

코대장 2021. 5. 27. 21:57
반응형

셀레니움 활용한 웹사이트 자동 로그인

 

서 론

이번 글에서는 python selenium 라이브러리를 활용해 웹사이트 자동 로그인을 구현해 보겠습니다.

selenium 모듈은 많은 기능이 있으며, 잘 활용한다면 웹사이트 조작에 여러가지를 자동화 할 수 있어요

제가 시도해 볼 대상 사이트는 세종시에 있는 "국립세종도서관" 홈페이지 입니다.

왜 도서관 홈페이지냐구요?

현재 코로나-19로 인해 사전 방문 예약으로 운영되고 있으며, 하루 400명 제한된 인원만 받고 있어요.

도서관 가서 빌리고 싶은 책이 있는데 사전 방문 예약에 실패해 갈 수가 없다면 너무 속상하지 않나요?

저는 지난번에 사전예약방문이 된 줄 알고 도서관까지 열심히 갔는데... 예약이 안되어 있었더라고요...

할 수 없이 도서관 앞에서 20여분 새로고침 신공을 했답니다...

우리는 개발자니까 자동로그인과 사전방문예약 신청까지 바로~! 기술 드러가 보자구요.

 

본 론

셀레니움 설치 그리고 크롬 드라이버 설치 등 환경설정에 대해서는 넘어가겠습니다.

$ pip install selenium

Homebrew 를 통해 크롬 드라이버를 설치 할 수 있어요.

$ brew install chromedriver

 

국립세종도서관 로그인 화면에서 아이디, 비밀번호 그리고 로그인 버튼에 대한 각 객체 정보를 얻어야 합니다.

국립세종도서관 로그인 화면

크롬 같은 경우 [보기] - [개발자 정보] - [개발자 도구] 를 누르면 개발자 도구 화면이 뜹니다.

우측에 하나의 코드 화면이 보이게 되는데요. 여기서 간단하게 "아이디" 검색하면 로그인 화면에 대한 객체 정보를 확인 할 수 있어요.

여기서 필요한 태그값 정보는 바로 "id" 입니다.

로그인 아이디에서는 id="u_id" 비밀번호에서는 id="pword" 해당하는 태그값 정보를 얻을 수 있어요

# 로그인 아이디 객체정보
<li class="login divDp">
  <input type="text" id="u_id" title="" name="sUserId" value="" placeholder="아이디">
</li>

아이디 객체정보

# 로그인 비밀번호 객체정보
<li class="login divDp">
  <div class="login divDp">
    <input type="password" id="pword" title="" value="" name="sPassword" placeholder="비밀번호">
  </div>
</li>

비밀번호 객체정보

로그인 버튼의 경우 XPath를 통해 접근을 해보겠습니다.

따라서 마우스를 코드에서 우클릭 한 후 Copy XPath를 합니다.

# 로그인 버튼 객체정보
<li class="divDp">
  <input class="btn-login1" type="button" value="로그인" onclick="formLogin(); return false;">
</li>

로그인버튼 객체정보

 

소스코드

import getpass
from selenium import webdriver

'''
국립세종도서관 자동로그인  
'''

options = webdriver.ChromeOptions()

# headless 옵션 설정 : 개발환경이 리눅스라면 아래 두가지는 포함
options.add_argument('headless')
options.add_argument("no-sandbox")

# 브라우저 사이즈 : 현재 창을 열지 않는 방식으로 구현
# options.add_argument('window-size=800,600')

user_id = input('아이디를 입력하세요: ')
user_pw = getpass.getpass('비밀번호를 입력하세요: ')

# 드라이버 위치 경로 입력
driver = webdriver.Chrome()

# url을 이용하여 브라우저로 접속
driver.get('https://sejong.nl.go.kr/html/c7/c701.jsp')

# 대기시간 부여
driver.implicitly_wait(3)

driver.find_element_by_id('u_id').send_keys(user_id)
driver.find_element_by_id('pword').send_keys(user_pw)
driver.find_element_by_xpath('//*[@id="contentDrt"]/div[1]/div/form[4]/div/div/div[1]/div[2]/ul/li[4]/input').click()

# 로그인 된 화면 캡처
driver.get_screenshot_as_file('capture.png')

# 대기시간 부여
driver.implicitly_wait(5)

driver.quit()

 

이상. 끝.