엑셀 매크로(VBA) 보안 경고 끝! 파이썬으로 똑같은 작업 대체하기
"매일 아침 사내 그룹웨어에 로그인해서 출근 체크를 한다", "인트라넷에 로그인한 후 매번 같은 메뉴를 클릭해서 데이터를 확인한다", "여러 웹사이트에 로그인해서 정보를 확인하는 루틴이 매일 반복된다"…
이전 게시글 pyautogui 윈도우 자동화 편에서는 좌표 기반으로 마우스·키보드를 제어하는 방법을 소개했습니다. 웹사이트 자동화에는 Selenium이라는 전용 도구가 훨씬 안정적입니다. 브라우저 창의 위치나 크기가 바뀌어도 HTML 요소를 기준으로 정확하게 찾아서 클릭하기 때문입니다.
파이썬이 설치되어 있어야 합니다. 없다면 python.org에서 최신 버전을 받아 설치하세요. 설치 시 반드시 "Add Python to PATH"에 체크해야 합니다.
웹 자동화에 필요한 라이브러리를 설치합니다. 터미널(윈도우: CMD 또는 파워셸)을 열고 아래 명령어를 실행하세요:
pip install selenium webdriver-manager
selenium은 브라우저를 코드로 제어하는 표준 라이브러리입니다. webdriver-manager는 크롬 브라우저에 맞는 드라이버 파일을 자동으로 다운로드하고 관리해줍니다. 별도로 드라이버를 수동 설치할 필요가 없습니다.
⚠️ 중요한 주의사항: 이 코드는 본인이 권한을 가진 계정(사내 시스템, 개인 업무 계정)에만 사용해야 합니다. 타인의 계정이나 권한 없는 사이트에 자동 로그인을 시도하는 것은 명백한 불법 행위입니다. 또한 비밀번호를 코드에 평문으로 저장하는 것은 보안 위험이 있으므로, 실제 운영 시에는 아래 응용 섹션의 환경 변수 분리 방법을 꼭 적용하세요.
아래 코드를 그대로 복사해서 메모장에 붙여넣고, web_login.py로 저장하세요. 저장 시 파일 형식은 "모든 파일", 인코딩은 UTF-8로 설정합니다.
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
import time
# ① 설정
LOGIN_URL = "https://intranet.example.com/login" # ← 로그인 페이지 URL
USERNAME = "내아이디" # ← 로그인 아이디
PASSWORD = "내비밀번호" # ← 로그인 비밀번호
HEADLESS = False # ← True: 화면 안 보이게 백그라운드 실행 / False: 화면 보면서 확인
# ② 크롬 브라우저 옵션 설정
options = webdriver.ChromeOptions()
if HEADLESS:
options.add_argument("--headless=new")
options.add_argument("--start-maximized")
options.add_argument("--disable-notifications")
# ③ 브라우저 실행 (드라이버 자동 설치)
service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service, options=options)
wait = WebDriverWait(driver, 10) # 최대 10초까지 요소가 나타날 때까지 대기
try:
# ④ 로그인 페이지 접속
print(" ▶ 로그인 페이지 접속 중...")
driver.get(LOGIN_URL)
# ⑤ 아이디 입력창 찾아서 입력 (id 속성이 "userId"라고 가정)
id_input = wait.until(EC.presence_of_element_located((By.ID, "userId")))
id_input.clear()
id_input.send_keys(USERNAME)
print(" ✔ 아이디 입력 완료")
# ⑥ 비밀번호 입력창 찾아서 입력 (id 속성이 "password"라고 가정)
pw_input = driver.find_element(By.ID, "password")
pw_input.clear()
pw_input.send_keys(PASSWORD)
print(" ✔ 비밀번호 입력 완료")
# ⑦ 로그인 버튼 클릭 (id 속성이 "loginBtn"이라고 가정)
login_btn = driver.find_element(By.ID, "loginBtn")
login_btn.click()
print(" ✔ 로그인 버튼 클릭")
# ⑧ 로그인 완료 대기 (메인 페이지의 특정 요소가 나타날 때까지)
wait.until(EC.presence_of_element_located((By.CLASS_NAME, "main-dashboard")))
print(" ✔ 로그인 성공! 메인 페이지 진입 확인")
time.sleep(2) # 결과 확인용 대기 (필요시 제거 가능)
except Exception as e:
print(f" ✘ 오류 발생: {e}")
finally:
# ⑨ 브라우저 종료 (HEADLESS=False면 결과 확인 후 직접 닫아도 됨)
if HEADLESS:
driver.quit()
print("\n✅ 완료!")
코드의 By.ID, "userId" 같은 부분은 실제 웹사이트의 HTML 구조에 맞게 수정해야 합니다. 찾는 방법은 간단합니다.
<input id="userId" ...> 처럼 id 속성이 있다면 그 값을 코드에 사용합니다.id가 없다면 name 속성을 사용하거나, By.CSS_SELECTOR로 클래스명을 활용합니다.# id가 없을 때 다른 방법들 driver.find_element(By.NAME, "user_id") # name 속성 사용 driver.find_element(By.CSS_SELECTOR, "input.id-box") # CSS 클래스 사용 driver.find_element(By.XPATH, "//input[@placeholder='아이디']") # XPath 사용
LOGIN_URL, USERNAME, PASSWORD를 입력합니다.python web_login.py
정상 실행 시 크롬 브라우저가 자동으로 열리고 로그인이 진행되며, 터미널에 이렇게 출력됩니다:
▶ 로그인 페이지 접속 중... ✔ 아이디 입력 완료 ✔ 비밀번호 입력 완료 ✔ 로그인 버튼 클릭 ✔ 로그인 성공! 메인 페이지 진입 확인 ✅ 완료!
오류 1: NoSuchElementException
코드에 입력한 ID나 CSS 선택자가 실제 웹사이트와 다른 경우입니다. 3단계 방법으로 정확한 요소 정보를 다시 확인하세요. 사이트가 iframe(웹페이지 안의 또 다른 웹페이지) 구조라면 driver.switch_to.frame()으로 먼저 진입해야 합니다.
오류 2: TimeoutException
요소가 10초 안에 나타나지 않은 경우입니다. 인터넷 속도가 느리거나 페이지 로딩이 오래 걸리면 WebDriverWait(driver, 20)처럼 대기 시간을 늘려보세요.
오류 3: 로그인 버튼을 눌렀는데 캡차(자동입력방지문자)가 나타남
보안을 위해 캡차가 적용된 사이트는 완전 자동화가 어렵습니다. 이런 경우 HEADLESS = False로 설정해 직접 캡차만 입력하고, 나머지 과정은 자동화하는 반자동 방식을 사용하세요.
비밀번호를 코드에 직접 입력하는 것은 보안상 위험합니다. 환경 변수나 별도 설정 파일로 분리하는 방법입니다.
import os
from dotenv import load_dotenv
load_dotenv() # .env 파일에서 환경 변수 불러오기
USERNAME = os.getenv("LOGIN_ID")
PASSWORD = os.getenv("LOGIN_PASSWORD")
같은 폴더에 .env 파일을 만들고 아래처럼 작성합니다:
LOGIN_ID=내아이디 LOGIN_PASSWORD=내비밀번호
pip install python-dotenv로 설치 후 사용하며, .env 파일은 절대 다른 사람과 공유하거나 깃허브에 올리지 않아야 합니다.
💡 이전 게시글과 결합하면: 로그인 후 웹 데이터 자동 수집 편의 코드와 결합하면 로그인이 필요한 사내 시스템에서도 데이터를 자동으로 수집할 수 있고, 스케줄러 편과 결합하면 매일 아침 자동으로 출근 체크까지 처리할 수 있습니다.
이 코드를 응용하면 로그인 후 특정 메뉴를 클릭해 데이터를 조회하거나, 여러 사이트에 순차적으로 로그인하는 것도 가능합니다.