파이썬을 배우는 이유 중 하나는 사람이 매번 반복해야 하는 작업을 프로그램이 대신하도록 만들 수 있기 때문입니다. 그중에서도 웹사이트에 접속해 버튼을 클릭하고, 입력창에 내용을 작성하고, 페이지를 이동하는 작업은 Selenium을 활용하면 비교적 쉽게 자동화할 수 있습니다.
Selenium은 웹 브라우저를 프로그램으로 제어할 수 있도록 만들어진 도구입니다. 단순히 웹페이지의 HTML을 다운로드하는 것과 달리 실제 Chrome과 같은 브라우저를 실행해 사람이 브라우저를 사용하는 것과 비슷한 방식으로 동작합니다.
따라서 파이썬 자동화 서버를 구축하고 있다면 Selenium은 활용 범위가 상당히 넓은 도구라고 할 수 있습니다.
Selenium이란 무엇인가?
Selenium은 원래 웹 애플리케이션 테스트를 자동화하기 위한 도구로 널리 사용되었습니다. 하지만 브라우저에서 발생하는 반복 작업을 제어할 수 있기 때문에 일반적인 업무 자동화에도 활용됩니다.
예를 들어 다음과 같은 작업을 자동화할 수 있습니다.
- 특정 웹사이트 자동 접속
- 검색창에 키워드 입력
- 버튼 클릭
- 여러 페이지 순차 이동
- 페이지 내 특정 데이터 확인
- 반복적인 웹 업무 자동화
다만 모든 웹사이트를 자유롭게 자동화해도 된다는 의미는 아닙니다. 서비스마다 자동화 프로그램 사용에 관한 정책이 다르므로 이용약관과 관련 규정을 먼저 확인해야 합니다.
Selenium 설치하기
파이썬 가상환경이 활성화되어 있다면 터미널에서 다음 명령어로 설치할 수 있습니다.
pip install selenium
설치 여부는 다음 명령어로 확인할 수 있습니다.
pip show selenium
파이썬 패키지를 여러 프로젝트에서 사용하고 있다면 시스템 전체에 설치하기보다는 venv와 같은 가상환경을 이용하는 것이 좋습니다.
프로젝트마다 필요한 라이브러리 버전을 분리할 수 있기 때문입니다.
Selenium으로 Chrome 실행하기
가장 기본적인 코드는 다음과 같습니다.
fromseleniumimportwebdriverdriver=webdriver.Chrome()driver.get("https://example.com")
코드를 실행하면 Chrome 브라우저가 열리고 지정한 주소로 이동합니다.
자동화가 끝난 뒤에는 다음 코드를 이용해 브라우저를 종료할 수 있습니다.
driver.quit()
브라우저 종료 코드를 사용하지 않으면 자동화 프로그램을 여러 번 실행했을 때 Chrome 프로세스가 계속 남아 서버 자원을 소비할 수도 있습니다.
웹페이지 요소 찾기
브라우저 자동화의 핵심은 웹페이지 안에서 원하는 요소를 정확하게 찾는 것입니다.
Selenium에서는 By 클래스를 이용합니다.
fromselenium.webdriver.common.byimportByelement=driver.find_element(By.ID, "search")
요소를 찾는 대표적인 방식에는 다음과 같은 것이 있습니다.
driver.find_element(By.ID, "keyword")driver.find_element(By.NAME, "query")driver.find_element(By.CLASS_NAME, "search-box")driver.find_element(By.CSS_SELECTOR, ".search-box")driver.find_element(By.XPATH, "//input[@type='text']")
가능하면 페이지 구조를 이해한 뒤 변동 가능성이 적은 ID나 CSS 선택자를 사용하는 것이 관리하기 편합니다.
입력창에 내용 자동 입력하기
찾은 입력창에는 send_keys()를 사용해 문자열을 입력할 수 있습니다.
search=driver.find_element(By.ID, "search")search.send_keys("파이썬 자동화")
기존에 입력되어 있던 내용을 삭제하고 새 값을 입력하고 싶다면 다음과 같이 사용할 수도 있습니다.
search.clear()search.send_keys("Selenium 사용법")
이 기능을 활용하면 반복적으로 데이터를 입력해야 하는 내부 관리도구나 테스트 환경에서 시간을 줄일 수 있습니다.
버튼 자동 클릭하기
버튼 역시 먼저 요소를 찾은 뒤 click()을 실행하면 됩니다.
button=driver.find_element(By.CSS_SELECTOR, ".search-button")button.click()
다만 페이지가 완전히 로딩되지 않은 상태에서는 해당 버튼을 찾지 못해 오류가 발생할 수 있습니다.
초보자가 Selenium을 사용하면서 가장 자주 만나는 문제 중 하나입니다.
WebDriverWait으로 페이지 로딩 기다리기
간단한 방법으로는 다음처럼 sleep()을 사용할 수 있습니다.
importtimetime.sleep(3)
하지만 항상 3초를 기다리는 방식은 효율적이지 않습니다.
페이지가 0.5초 만에 로딩되어도 3초를 기다려야 하고, 반대로 5초가 걸리는 경우에는 오류가 발생할 수 있기 때문입니다.
이럴 때 WebDriverWait을 사용할 수 있습니다.
fromselenium.webdriver.support.uiimportWebDriverWaitfromselenium.webdriver.supportimportexpected_conditionsasECfromselenium.webdriver.common.byimportBywait=WebDriverWait(driver, 10)button=wait.until(EC.element_to_be_clickable((By.ID, "submit")))button.click()
최대 10초 동안 버튼이 클릭 가능한 상태가 되는 것을 기다린 뒤 작업을 진행하는 방식입니다.
실제 자동화 프로그램을 장시간 운영한다면 단순한 sleep()보다 이러한 대기 방식을 적절히 활용하는 것이 안정적입니다.
Headless 모드로 서버에서 실행하기
VPS와 같은 서버에는 일반 PC처럼 모니터 화면이 없는 경우가 많습니다.
이럴 때 Chrome을 화면에 표시하지 않는 Headless 모드를 활용할 수 있습니다.
fromseleniumimportwebdriverfromselenium.webdriver.chrome.optionsimportOptionsoptions=Options()options.add_argument("--headless")driver=webdriver.Chrome(options=options)driver.get("https://example.com")print(driver.title)driver.quit()
이를 활용하면 Ubuntu 서버에서 Selenium 기반 자동화 스크립트를 주기적으로 실행하는 구조도 만들 수 있습니다.
Selenium 자동화에서 예외 처리가 중요한 이유
웹사이트 구조는 언제든 변경될 수 있습니다.
어제까지 존재했던 버튼의 ID가 변경되거나 서버 응답이 느려지는 것만으로 프로그램이 중단될 수 있습니다.
따라서 실제 운영 코드에서는 예외 처리를 추가하는 것이 좋습니다.
try:button=driver.find_element(By.ID, "submit")button.click()exceptExceptionase:print("오류 발생:", e)finally:driver.quit()
장기간 실행되는 자동화 서버라면 오류 내용을 로그 파일로 저장하고 텔레그램이나 이메일로 알림을 보내도록 확장할 수도 있습니다.
Selenium 사용할 때 주의할 점
Selenium이 기술적으로 특정 작업을 수행할 수 있다고 해서 해당 사이트에서 그 행동이 허용된다는 뜻은 아닙니다.
웹사이트의 이용약관, API 제공 여부, 자동화 접근 정책 등을 확인하는 것이 우선입니다.
특히 지나치게 많은 요청을 보내거나 CAPTCHA 같은 접근 제한을 우회하려는 방식은 피해야 합니다.
가능하다면 공식 API가 제공되는 서비스에서는 Selenium보다 API를 사용하는 것이 안정적이고 효율적인 경우가 많습니다.
Selenium은 어떤 경우에 적합할까?
단순한 데이터 요청만 필요하다면 Requests가 훨씬 가볍습니다.
HTML 데이터만 분석한다면 BeautifulSoup도 좋은 선택입니다.
반면 JavaScript가 실행되어야 콘텐츠가 나타나거나 실제 버튼 클릭과 페이지 이동이 필요한 작업에서는 Selenium이 유용합니다.
즉 모든 자동화를 Selenium으로 해결하려 하기보다는 작업의 성격에 따라 도구를 선택하는 것이 좋습니다.
자주 묻는 질문
Selenium을 사용하려면 파이썬을 많이 알아야 하나요?
기본적인 변수, 조건문, 반복문, 함수 정도를 이해하고 있다면 간단한 자동화부터 시작할 수 있습니다.
Selenium을 서버에서도 실행할 수 있나요?
가능합니다. Headless Chrome을 이용하면 화면이 없는 Linux 서버에서도 실행할 수 있습니다.
24시간 자동 실행도 가능한가요?
가능합니다. 다만 Selenium 자체가 24시간 실행 기능을 제공하는 것은 아닙니다. Crontab, systemd 등의 도구와 결합하여 특정 시간마다 실행하거나 프로세스를 관리할 수 있습니다.
마무리
Selenium은 파이썬 자동화를 배우면서 결과를 가장 직접적으로 체감할 수 있는 라이브러리 중 하나입니다. 웹사이트를 열고 검색어를 입력하고 버튼을 클릭하는 과정이 코드 몇 줄로 실행되는 모습을 보면 자동화의 기본 원리를 이해하기도 쉽습니다.
다만 실제 서비스에 적용할 때는 무조건 자동화하는 것보다 공식 API 제공 여부와 서비스 정책을 먼저 확인해야 합니다.
Selenium의 기본 구조를 이해했다면 이후에는 예외 처리, 로그 기록, 데이터베이스 저장, Crontab 또는 systemd를 이용한 서버 자동 실행으로 확장할 수 있습니다.