자유로운 개발일지/실험일지

[직링 자동화 도구] 셀레니움을 이용해 콘서트 예매하기

그낙이 2025. 5. 24. 22:50
반응형

지난 글에서는 Puppeteer를 활용해 콘서트 예매 자동화를 성공적으로 구현해 보았습니다. 콘솔 창에서 HTML 요소를 분석한 뒤, 실제 사용자의 동작처럼 버튼을 클릭하고 예매 절차를 밟는 과정을 구현했었습니다. 말하자면, 외형과 능력을 모두 갖춘 진짜 메타몽이 되어버린 순간이었죠. 이번 글에서는 다른 방식인 Selenium(셀레니움)을 이용해 동일한 콘서트 예매 자동화를 시도해보고, 퍼피티어와 차이를 비교해보려 합니다. 

 

⚠️ 이 글은 기술적인 호기심과 실험적인 분석을 위한 목적으로 작성되었습니다. 실제 예매 과정에서 이를 악용하거나 무단으로 활용하는 것은 서비스 약관 위반이 될 수 있으며, 법적 책임이 따를 수 있습니다. 또한, 이번 글에서는 코드 구현보다는 개념과 작동 원리에 집중하니 가볍게 읽어주시길 바랍니다.

 

0단계 : 개발 환경 준비하기 

지난 시간, 이미 VS Code 설치 과정을 다뤘습니다. 셀레니움은 Python 언어 기반이기 때문에 파이썬 설치를 해야합니다.

 

1. 파이썬 다운로드 사이트에서 파이썬을 본인 운영체제에 맞게 다운로드 해줍시다. 

 

Download Python

The official home of the Python Programming Language

www.python.org

 

 

설치가 진행된 후, 원격 프롬프트(CMD)에서 아래 명령어로 파이썬 버전이 나온다면 설치가 정상적으로 완료된 것입니다. 

python --version

 

1단계 : 프로젝트 초기화 및 셀레니움 설치 

퍼피티어에서 프로젝트를 생성했던 것과 동일하게 프로젝트를 생성해봅시다. 지난 시간과 동일하게 폴더 생성 > 우클릭 > Code(으)로 열기 도 가능하지만, 이번 시간에는 조금 더 고-급 기술을 사용해봅시다. 명령어로 파일 생성 > 이동 > 코드로 열기를 진행해보겠습니다. 마찬가지로 CMD에 다음 순서대로 입력해줍시다. 

# 1. selenium이라는 폴더 만들기 
mkdir selenium

# 2. selenium 폴더로 이동하기 
cd selenium

# VS Code로 열기 
code .

 

이제 저희는 조금 더 개발자스러워졌습니다. 이제 가상환경(virtual environment)을 생성하고 켜줍시다. 가상환경은 파이썬 프로젝트마다 독립적인 패키지 설치 공간을 제공해주는 기능입니다. 미니 프로젝트 공간을 만드는거죠. VS Code 안에서 Ctrl + `을 눌러 터미널을 열고, 아래 명령어를 입력해줍니다.

python -m venv venv

# Windows
source venv/Script/activate

# macOS, Linux
source venv/bin/activate

 

python -m venv venv는 venv라는 가상환경을 생성한다는 뜻을 가지고 있습니다. 그래서 python -m venv sample_venv 등으로 입력하셔도 상관없습니다. 다만 가상환경을 실행할 때도 생성된 가상환경의 이름을 입력해주셔야 합니다. 가상환경을 키는 과정에서는 tab 키를 누르시면 자동완성이 됩니다. 다만 같은 접두어를 가진 폴더나 파일이 2개 이상인 경우 선택지가 뜨게 됩니다. 아래와 같이 (venv)가 보인다면 현재 가상환경이 켜져 있다는 뜻입니다. 

가상환경이 켜져있는 상태라면 이제 셀레니움을 설치해봅시다. 나중에 여러명이서 작업하거나, 파일을 다른 컴퓨터에서 작업해야 하는 경우에는 requirements.txt를 만들어 설치된 패키지들을 기록해둘 수 있지만 일단은 넘어갑시다.

pip install selenium

 

셀레니움 설치가 끝났다면 main.py 파일을 생성해줍시다. VS Code 터미널에 touch main.py을 입력하시면 생성됩니다.이제 파이썬 설치, 셀레니움 설치에 프로젝트 생성까지 모두 완료했으니 본격적인 코드를 짜러 가봅시다. 

 

2단계 : 셀레니움으로 브라우저 열어보기 

이제 셀레니움과 브라우저 사이를 중계해줄 드라이버를 설치합시다. 셀레니움은 다양한 브라우저를 제어할 수 있는 자동화 도구입니다. 하지만 브라우저마다 내부 구조와 통신 방식이 다르기 때문에 드라이버를 설치해 중간 다리 역할을 맡깁시다. 마찬가지로 터미널에 아래 명령어를 입력해줍시다.

pip install webdriver-manager

 

모든 준비는 끝났습니다. 코드를 입력해줍시다.

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

# ChromeDriver 경로를 Service 객체로 감싸기
service = Service(ChromeDriverManager().install())

# 드라이버 실행
driver = webdriver.Chrome(service=service)

# 웹사이트 접속
driver.get("https://www.sample_url.com")

 

이후 터미널에서 python main.py(혹은 생성한 파이썬 파일이름)을 입력하면 sample_url에 접속하게 됩니다. 브라우저에 잘 이동한 것을 확인하면 아래 코드를 통해 테스트를 진행해봅시다. 

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
from urllib.parse import urlparse, parse_qs
import time

# 브라우저 설정 및 실행
options = webdriver.ChromeOptions()
options.add_experimental_option("detach", True) 
options.add_argument("--start-maximized") 
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)

# 페이지 접속
driver.get("https://ticket.sample_url.com/")

try:
    # 1. 로그인 감지
    while True:
        try:
            logout_btn = driver.find_element(By.CSS_SELECTOR, ".logout")
            print("로그인 감지됨")
            break
        except:
            print("로그인 안 됨... 3초 후 재시도")
            time.sleep(3)

    # 2. Id 추출
    id = None
    while not id:
        current_url = driver.current_url
        parsed = urlparse(current_url)
        query_params = parse_qs(parsed.query)
        id_list = query_params.get("Id")
        id = id_list[0] if id_list else None

        print("아직 id 값 찾지 못했음 3초 후 재확인")
        time.sleep(3)

    # 3. 날짜 선택
    driver.implicitly_wait(10)
    date_element = driver.find_element(By.CSS_SELECTOR, ".sample_date")
    date_element.click()
    print("날짜 클릭 완료")

    # 4. 예매 버튼 클릭
    driver.implicitly_wait(10)
    reserve_btn = driver.find_element(By.ID, "ticket_buy_btn")
    reserve_btn.click()
    print("예매 버튼 클릭 완료")

except Exception as e:
    print("오류 발생:", e)

 

위 코드는 지난 시간 진행했던 퍼피티어 코드를 셀리니움으로 바꿨을 뿐, 동작은 동일합니다.

 

Selenium vs Puppeteer

사용자 동작 흉내내기에서 한번 다루었지만, 셀레니움과 퍼피티어 모두 코드까지 작성하고 동작을 확인해본 지금, 두 도구의 차이를 다시 비교해보겠습니다. 둘 다 브라우저 자동화를 위한 강력한 도구지만, 목적과 상황에 따라 적합한 선택지가 달라집니다. 퍼피티어는 크롬 개발자 도구와 직접 통신하는 방식으로 속도와 정밀 제어에 우수하고, 플러그인을 통해 자동화 탐지 우회에 탁월합니다. Node.js 기반으로 비동기 구조를 잘 활용한다면, 예매 자동화 같은 작업에 강점을 보입니다. 반면 셀레니움은 다양한 브라우저를 지원한다는 강점과, 파이썬 기반으로 개발자 친화적인(코드가 직관적이여서 배우기 쉬운) 구조를 가지고 있습니다. 퍼피티어가 정밀한 사용자 흉내에 더 가깝다면, 셀레니움은 다양한 환경에서 안정적으로 동작하는 범용 도구에 가깝다고 볼 수 있습니다.

 

다음 글 안내

이번 글에서는 셀레니움을 활용한 콘서트 예매 자동화를 구현해보고, 퍼피티어와의 차이점을 비교해보았습니다. 다음 글에서는 이제 한 걸음 더 나아가, 지난 시간 작성한 Puppeteer 자동화 코드에 GUI를 입혀 직접 실행하고 멈출 수 있는 프로그램으로 발전시켜볼 예정입니다. 다시 한번 이 글은 기술적인 호기심과 실험적인 분석을 위한 목적으로 작성되었습니다. 실제 예매 과정에서 이를 악용하거나 무단으로 활용하는 것은 서비스 약관 위반이 될 수 있으며, 법적 책임이 따를 수 있습니다.

 

반응형