88  특가 상품 탐색기 (Deal Finder)

사고 싶은 상품이 저렴한 가격으로 할인될 때 알림을 보내주는 간단한 웹 앱을 만들어 봅시다. 웹 스크래퍼를 활용하여 해당 상품의 제품 페이지 정보를 가져오고, 가격이 변동될 때마다 사용자에게 알려주는 기능을 구현합니다.

이 프로젝트는 웹의 데이터를 자동으로 수집하고, 조건에 따라 트리거되는 알림 시스템을 이해하는 데 매우 유용합니다. 특히 정기적으로 웹사이트를 확인하고 변화를 감지하는 백그라운드 태스크(Background Task) 기능을 익힐 수 있습니다.

88.1 주요 개발 포인트

  • 웹 스크래핑 (Web Scraping): BeautifulSoup, Selenium 등을 사용하여 쇼핑몰의 가격 정보를 주기적으로 가져옵니다.
  • 가격 모니터링: 이전 가격과 현재 가격을 비교하여 할인 여부를 판단합니다.
  • 알림 시스템 (Notification): 이메일, 텔레그램 봇, 또는 푸시 알림으로 할인 소식을 전송합니다.
  • 다중 사이트 지원: 아마존, 이베이, 옥션, 쿠팡 등 여러 쇼핑몰의 상품을 한 번에 관리합니다.

88.2 Python 구현 예시 (간단한 웹 페이지 가격 크롤링)

import requests
from bs4 import BeautifulSoup

def find_deal(product_url, target_price):
    """
    지정된 URL에서 상품의 가격을 확인하고 목표가보다 낮은지 검사합니다.
    """
    print(f"'{product_url}'에서 가격 정보를 가져오는 중...")
    
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
    }
    
    try:
        response = requests.get(product_url, headers=headers)
        soup = BeautifulSoup(response.content, "html.parser")
        
        # 주의: 실제 사이트 구조에 맞춰 선택자(selector)를 수정해야 합니다.
        price_tag = soup.select_one(".price-amount") or soup.select_one("#priceblock_ourprice")
        
        if price_tag:
            # 텍스트에서 숫자만 추출 (예: "₩1,200,000" -> 1200000)
            price_text = price_tag.get_text().replace(",", "").replace("₩", "").strip()
            current_price = float(price_text)
            
            print(f"현재 가격: {current_price:,} 원")
            
            if current_price <= target_price:
                print("!!! 목표가 달성! 즉시 구매하세요 !!!")
                # 여기서 알림 발송 함수 호출 가능
            else:
                print(f"목표가({target_price:,} 원)까지 {current_price - target_price:,} 원 더 떨어져야 합니다.")
        else:
            print("가격 정보를 찾을 수 없습니다. 선택자를 확인해 보세요.")
    except Exception as e:
        print(f"오류 발생: {e}")

if __name__ == "__main__":
    # 가상의 상품 페이지와 목표가 설정
    test_url = "https://example-shop.com/product/laptop"
    my_target = 1000000 # 100만 원
    
    find_deal(test_url, my_target)