파이썬 셀레늄(Selenium) 기반 동적 웹페이지 데이터 크롤링 고급 기법

이전 포스팅에서 다룬 Requests와 BeautifulSoup 조합은 가볍고 빠르지만, 치명적인 한계가 있습니다. 주소창에 URL을 입력했을 때 처음 받아오는 정적인 HTML 문서만 읽을 수 있기 때문입니다. 최근의 대다수 웹사이트는 마우스 스크롤을 끝까지 내리거나, 버튼을 클릭하거나, 자바스크립트(JavaScript)가 구동되어야만 화면에 데이터가 나타나는 ‘동적 웹페이지’ 구조를 가지고 있습니다. 이처럼 정적 크롤러가 접근할 수 없는 영역의 데이터를 수집하기 위해 웹 브라우저를 소프트웨어로 직접 원격 제어하는 ‘셀레늄(Selenium)’ 라이브러리의 고급 활용 방법을 알아봅니다.

자바스크립트 렌더링 및 로그인 필수 사이트의 스크랩 한계 극복

webdriver-manager 및 명시적 대기(Explicit Wait) 메커니즘

셀레늄은 사람이 마우스를 움직이고 키보드를 타이핑하는 행위를 파이썬 코드로 그대로 모사하는 매크로 기반의 강력한 프레임워크입니다. 과거에는 브라우저 버전에 맞는 드라이버 파일을 수동으로 다운로드해야 하는 번거로움이 있었지만, 최근에는 webdriver-manager 라이브러리를 통해 코드가 실행될 때 자동으로 최적의 드라이버를 로드할 수 있습니다.

셀레늄 고급 기법의 핵심은 ‘기다림의 미학’입니다. 동적 웹페이지는 데이터가 로딩되는 데 시간이 걸리기 때문에, 무조건 무겁게 몇 초씩 대기하는 time.sleep() 대신, 특정 HTML 요소가 화면에 나타날 때까지만 지능적으로 기다리는 ‘명시적 대기(Explicit Wait)’ 메커니즘을 구축해야 에러 없이 고속으로 데이터를 수집할 수 있습니다. 실습에 앞서 필요한 패키지들을 설치해 줍니다.

Bash

pip install selenium webdriver-manager

무한 스크롤 및 버튼 클릭 제어 기반 데이터 수집

핵심 동적 크롤링 스크립트 구현 및 적용

브라우저를 자동으로 실행하여 화면 끝까지 무한 스크롤을 내린 뒤, 동적으로 로딩된 텍스트 데이터를 명시적 대기 기법으로 안전하게 추출하는 전체 파이썬 스크립트 코드입니다.

Python

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from webdriver_manager.chrome import ChromeDriverManager
import time

def scrape_dynamic_website(target_url):
    # 1. 크롬 웹드라이버 자동 설정 및 옵션 지정
    options = webdriver.ChromeOptions()
    # 크롤링 속도 향상 및 서버 구동을 위해 브라우저 창을 띄우지 않으려면 아래 주석을 해제하세요 (Headless 모드)
    # options.add_argument('--headless')
    options.add_argument('--no-sandbox')
    options.add_argument('--disable-dev-shm-usage')
    options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64)...")

    # 드라이버 객체 생성
    driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)
    
    try:
        print(f"동적 웹페이지 접속 중: {target_url}")
        driver.get(target_url)
        
        # 2. 고급 기술: 브라우저 무한 스크롤 다운 제어
        # 현재 화면의 높이 계산
        last_height = driver.execute_script("return document.body.scrollHeight")
        
        for i in range(3): # 총 3번 스크롤 다운 시도
            # 자바스크립트 명령어로 스크롤을 가장 아래로 내림
            driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
            time.sleep(2) # 새 데이터가 로드되는 최소한의 시간 대기
            
            # 스크롤 후 새로운 화면 높이 계산
            new_height = driver.execute_script("return document.body.scrollHeight")
            if new_height == last_height:
                break # 더 이상 내려갈 곳이 없으면 루프 탈출
            last_height = new_height
            print(f"무한 스크롤 다운 실행 중 ({i+1}/3)")

        # 3. 고급 기술: 명시적 대기 (Explicit Wait)
        # 특정 클래스명을 가진 항목이 화면에 렌더링되어 나타날 때까지 최대 10초 대기
        print("동적 텍스트 요소 로딩 대기 중...")
        wait = WebDriverWait(driver, 10)
        
        # 타겟팅할 동적 요소의 CSS 선택자 입력 (예: 상품명 리스트 등)
        # 웹사이트의 실제 구조에 맞춰 클래스명(.card_title 등)을 수정해야 합니다.
        target_elements = wait.until(
            EC.presence_of_all_elements_located((By.CSS_SELECTOR, "div.item_title_class"))
        )
        
        print("\n--- 동적 데이터 추출 결과 ---")
        for idx, element in enumerate(target_elements, 1):
            # 요소 내부의 텍스트 깔끔하게 정제 후 출력
            print(f"{idx}. {element.text.strip()}")
            
    except Exception as e:
        print(f"크롤링 중 예외 발생: {e}")
        
    finally:
        # 작업이 끝나면 메모리 누수 방지를 위해 반드시 브라우저 종료
        driver.quit()
        print("\n브라우저 세션이 안전하게 종료되었습니다.")

if __name__ == "__main__":
    # 스크롤 및 동적 데이터 로딩이 발생하는 대상 웹사이트 URL 입력
    url = "https://example.com/dynamic-shopping-or-news"
    scrape_dynamic_website(url)

이 코드는 단순한 매크로를 넘어 자바스크립트 비동기 호출을 처리하는 고급 메커니즘을 담고 있습니다. driver.execute_script() 함수를 통해 웹 브라우저 내부에 직접 자바스크립트 스크롤 명령을 주입하여 하단 데이터를 강제로 로딩합니다. 또한 WebDriverWaitexpected_conditions(EC)의 조합을 통해, 네트워크 상태에 따라 유동적으로 요소의 렌더링을 감시하므로 무조건적인 대기 시간(Stall Time)을 없애고 스크립트의 실행 효율성을 수십 배 끌어올립니다.

하단의 URL과 CSS 선택자 변수를 실무 대상 웹페이지 구조에 맞게 커스텀하면, 일반 크롤러로는 빈 껍데기만 받아오던 쇼핑몰 상품 목록, 인피니트 스크롤 기반의 SNS 피드, 댓글 창의 비정형 데이터까지 완벽하게 자동 취합하는 마스터 스크래핑 엔진을 완성할 수 있습니다.

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

위로 스크롤