그로스 마케팅/학습 기록

웹 크롤링이란? | 마케터를 위한 Python 웹 크롤링 기초 #4 [멋쟁이사자처럼 부트캠프 그로스 마케팅 5기 day 18]

shushu26 2026. 6. 8. 22:40

 

이번 강의에서는 셀레니움 기반 동적 크롤링을 두 사이트에 적용하며, 

요소 선택 전략과 자동화 흐름을 완성하는 방법을 다뤘습니다.

 


💡셀레니움 동적 크롤링이란? 

 

사용자의 조작(스크롤, 버튼 클릭, 로그인 등)이나 브라우저 내부의 비동기 통신(Ajax/JavaScript)을 통해

실시간으로 데이터가 변하고 나타나는 웹 페이지를 수집하는 기술

 

동적 크롤링이 작동하는 단계 

 

1. 브라우저 객체 생성 (WebDriver 초기화)

 

  • 컴퓨터 메모리에 파이썬 코드로 제어 가능한 가상 크롬 브라우저 프로세스를 구동함.
  • 화면 해상도나 반응형 웹 UI 변화에 따른 데이터 누락을 방지하기 위해 창 크기를 최대화
 
from selenium import webdriver as wb
driver = wb.Chrome()
driver.maximize_window()

 

 

2. 동적 제어 및 이벤트 발생 

 

  • driver.get() 메서드로 목적지 URL에 접속한 후 웹 로딩을 대기함.
  • 클릭(.click()), 키 입력(.send_keys()), 스크롤 다운 등의 액션을 수행하여 숨겨진 JavaScript 데이터를 화면 DOM(Document Object Model)에 강제로 노출시킴.

 

driver.get("URL")
btn = driver.find_element(By.CSS_SELECTOR, "선택자")
btn.click()

 

 

3. HTML DOM 요소 타겟팅 (Element 검색)

 

  • 화면에 렌더링된 HTML 문서 내에서 수집 타겟의 정확한 위치를 CSS 선택자 기반으로 탐색함.
  • 단건 수집은 find_element(), 다건 목록 수집은 find_elements() 메서드를 명확히 구분하여 리스트 객체로 반환받음.

 
# 다건 데이터(상품 목록 등)를 리스트 형태로 타겟팅
items = driver.find_elements(By.CSS_SELECTOR, "div.container > ul.list")

 

실습1. 파이썬 예외 처리 문법 (try-except)

 

  • 정의: 코드가 정상적으로 작동할 때(try)와 예외적 에러가 발생할 때(except)를 분리하여 프로그램의 흐름을 제어하는 파이썬의 필수 문법
  • 실습 적용 배경: 동적 웹 페이지는 데이터의 양이 가변적이며, '더보기' 버튼이 몇 번이나 존재할지 예측이 불가능
  • 기술적 원리: while True 무한 루프를 통해 버튼을 계속 클릭하다가, 마지막 페이지에서 버튼을 찾지 못해 에러(NoSuchElementException)가 발생하는 시점을 '수집 완료 신호'로 처리함. 프로그램이 멈추는 대신 except 구문으로 우회시켜 안전하게 하단 데이터 수집 코드로 연결하는 것이 본 실습의 핵심 목표
 
# 1. 브라우저 실행 및 한솥도시락 메뉴 페이지 접속
driver = wb.Chrome()
driver.get("https://www.hsd.co.kr/menu/menu_list")
driver.maximize_window()  # 반응형 웹 UI 고정을 위한 창 최대화
time.sleep(2)

# 2. [실습 핵심] 예외 처리를 활용한 '더보기' 버튼 무한 클릭
try:
    while True:
        # 페이지 하단의 더보기 버튼 지정
        btn = driver.find_element(By.CSS_SELECTOR, "a.c_05")
        btn.click()
        
        # 데이터 로딩 시간 확보 및 디도스 차단 방지용 대기
        time.sleep(2)
except Exception:
    # 더 이상 누를 버튼이 없으면 에러를 발생시키고 안전하게 루프 탈출
    print("더보기 버튼이 더이상 없네요 ㅠ_ㅠ 그래도 코드는 에러없이 이어서 동작합니다!")

# 3. 모든 데이터가 확장된 후 HTML 요소 수집 (타겟팅)
titles = driver.find_elements(By.CSS_SELECTOR, "h4.h.fz_03")              # 메뉴명 태그
prices = driver.find_elements(By.CSS_SELECTOR, "div.item-price > strong")  # 정교화된 가격 태그

titles_list, prices_list = [], []

# 4. 반복문과 tqdm을 활용한 순수 텍스트 추출 및 정제
for i in tqdm(range(len(titles))):
    titles_list.append(titles[i].text)
    prices_list.append(prices[i].text + "원")

print("크롤링 완료!!!")

 

실습2. 뉴발란스 상위4개의 품목들의 정보 수집

 
for i in tqdm(range(4)) :
    imgs = driver.find_elements(By.CSS_SELECTOR, "div.pro_thumbNail img.img_goods")
    imgs[i].click()
    time.sleep(3)

    items = driver.find_element(By.CSS_SELECTOR, "#displayName")
   score = driver.find_element(By.CSS_SELECTOR, "div.crema_product_reviews_score__container")
    size = driver.find_elements(By.CSS_SELECTOR, "#optSizeSection > ul.items > li > input")
    
    enabled_size, disabled_size = [], []
    
    for j in size :
        input_id = j.get_attribute("id")
    
        # label 태그의 for 속성에 접근
        label = driver.find_element(By.CSS_SELECTOR, f'label[for="{input_id}"]')
        label_text = label.text.strip()   # 사이즈에 대한 텍스트만 추출
    
        # disabled가 없다면 None이므로 아래 조건문에서 False가 됨
        is_disabled = j.get_attribute("disabled")
    
        if is_disabled :
            disabled_size.append(label_text)
        else :
            enabled_size.append(label_text)
    
    foot_width = driver.find_element(By.CSS_SELECTOR, "#optWidthSection > ul.items > li > label")
    cnt_reviews = driver.find_element(By.CSS_SELECTOR, "a.crema-product-reviews-count.crema-applied")

    print(title.text + " - " + mean_rating.text + " - " + foot_width.text + " - " + cnt_reviews.text[1:-1]+"개")
    print("구매가능 사이즈 :", enabled_size)

    driver.back()
    time.sleep(3)

 

 


 

🦁 데이터로 증명하는 그로스 마케터가 되고 싶다면?

 

 

🦁 내 성장의 기회, 멋쟁이사자처럼

데이터 분석부터 마케팅 자동화까지, 현업 중심 실무 역량 강화

나에게 맞는 실무 커리큘럼 확인하기 →