이전 편에서는 requests와 BeautifulSoup을 사용해 웹페이지의 HTML 코드를 가져와 필요한 텍스트를 수집하는 방법을 알아봤습니다. 하지만 실제 인터넷을 사용하다 보면 ID와 비밀번호를 입력하고 로그인해야만 접근할 수 있는 마이페이지, 혹은 화면의 버튼을 클릭해야만 데이터가 새롭게 갱신되는 웹사이트들이 훨씬 많습니다.

requests 라이브러리만으로는 이처럼 사용자의 직접적인 마우스 클릭이나 키보드 입력이 필요한 웹페이지를 제어하기 어렵습니다. 이때 등장하는 파이썬의 강력한 무기가 바로 셀레니움(Selenium)입니다.

셀레니움은 사람이 웹 브라우저(크롬 등)를 켜고, ID/PW를 입력하고, 버튼을 누르는 모든 동작을 코드가 똑같이 따라 하도록 제어해 주는 웹 브라우저 자동화 도구입니다. 오늘은 셀레니움의 기본 개념부터 로그인 및 마우스 클릭 자동화 스크립트 작성법을 알기 쉽게 정리해 드립니다.


1. 셀레니움(Selenium) 설치 및 기본 동작 원리

셀레니움은 브라우저를 직접 띄워서 조작하는 방식이기 때문에, requests 방식보다 속도는 조금 느리지만 눈에 보이는 모든 웹페이지 요소를 100% 제어할 수 있다는 강력한 장점이 있습니다.

필수 라이브러리 설치

명령 프롬프트(cmd)나 터미널에서 아래 명령어를 입력하여 셀레니움을 설치합니다.

pip install selenium webdriver-manager

과거에는 크롬 버전이 올라갈 때마다 별도의 크롬드라이버(chromedriver.exe) 파일을 수동으로 다운로드받아야 하는 번거로움이 있었지만, 최근에는 webdriver-manager 라이브러리가 내 크롬 버전에 맞는 드라이버를 알아서 자동으로 설치하고 관리해 줍니다.


2. 브라우저 실행 및 자동 제어 기본 구조

셀레니움을 통해 크롬 브라우저를 켜고 특정 사이트로 이동하는 기본 코드 구조입니다.

Python
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
import time

# 1. 크롬 드라이버 자동 다운로드 및 서비스 설정
service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service)

# 2. 원하는 웹사이트로 이동
driver.get("https://example.com/login")

# 브라우저가 화면을 완전히 로딩할 때까지 2초 대기
time.sleep(2)

# 작업 완료 후 브라우저 닫기
driver.quit()


3. 실전 예제: 로그인 및 버튼 클릭 자동화 구현하기

이제 사용자의 입력(텍스트 타이핑)과 마우스 클릭 동작을 코드로 구현해 보겠습니다.

웹페이지 내의 특정 요소(아이디 입력창, 비밀번호 입력창, 로그인 버튼)를 찾아내기 위해 셀레니움의 By.NAME, By.ID, By.CSS_SELECTOR 위치 찾기 기능을 활용합니다.

Python
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
import time

# 크롬 브라우저 실행
service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service)

try:
    # 1. 로그인 페이지 접속
    driver.get("https://example.com/login")
    time.sleep(2)  # 페이지 로딩 대기
    
    # 2. 아이디 및 비밀번호 입력창 요소 찾기
    # 브라우저 F12 키로 확인한 input 태그의 id/name 속성값 활용
    id_input = driver.find_element(By.NAME, "username")
    pw_input = driver.find_element(By.NAME, "password")
    
    # 3. 기존 텍스트 지우고 내 계정 정보 입력 (send_keys)
    id_input.clear()
    id_input.send_keys("my_user_id")
    
    pw_input.clear()
    pw_input.send_keys("my_password123!")
    
    # 4. 로그인 버튼 찾아서 클릭 (click)
    login_btn = driver.find_element(By.CSS_SELECTOR, "button.login-submit-btn")
    login_btn.click()
    
    # 로그인 완료 후 화면이 전환될 때까지 대기
    time.sleep(3)
    print("성공적으로 로그인 및 페이지 이동이 완료되었습니다!")

finally:
    # 작업이 끝나면 브라우저를 안전하게 종료
    driver.quit()

핵심 메서드 정리

  • find_element(By.XXX, "값"): 화면에 존재하는 특정 태그 요소를 1개 가져옵니다.

  • send_keys("입력값"): 검색창이나 입력 칸에 키보드 텍스트를 전달합니다.

  • click(): 해당 버튼, 링크, 또는 이미지를 마우스로 클릭합니다.

  • clear(): 기존에 칸 안에 적혀있던 글자를 전부 깨끗하게 지웁니다.


4. 셀레니움 사용 시 꼭 알아두어야 할 주의사항

셀레니움은 브라우저를 직접 구동하는 방식이기 때문에 컴퓨터 리소스(메모리, CPU)를 비교적 많이 사용합니다.

1) driver.quit()로 브라우저 확실히 종료하기

코드 작성 중 예기치 못한 에러가 터져 프로그램이 중단되면, 배경에서 백그라운드 크롬 프로세스가 계속 살아있어 컴퓨터 메모리를 갉아먹게 됩니다. 따라서 코드 작성 시 try ... finally 구문을 사용해 어떤 상황에서도 마지막에 driver.quit()가 호출되도록 제어해야 합니다.

2) 무조건적인 time.sleep() 자제

단순히 화면이 뜰 때까지 time.sleep(5) 처럼 고정된 대기 시간을 자주 사용하면 전체 스크립트 실행 시간이 지나치게 길어집니다. 화면 로딩 상태에 따라 스마트하게 기다려주는 동적 대기(WebDriverWait) 기술을 조합하는 것이 좋습니다.


핵심요약

  • 셀레니움(Selenium)은 파이썬으로 크롬 등의 웹 브라우저를 켜고 로그인, 클릭, 타이핑 등 사람의 행동을 자동화하는 최적의 라이브러리입니다.

  • find_element()로 원하는 입력창이나 버튼을 찾은 뒤 send_keys()로 글자를 적고 click()으로 클릭을 수행합니다.

  • 프로그램 종료 시 메모리 누수를 방지하기 위해 try ... finally 구문과 driver.quit()를 결합하여 작성하는 것이 중요합니다.