Scarnox · Blog

웹 스크래핑으로 가격 모니터링하기: 실전 가이드

가격 모니터링은 정해진 일정에 따라 여러 사이트에서 제품 가격을 확인하고, 시간이 지나며 비교할 수 있도록 결과를 기록하는 것입니다. 쇼핑몰, 마켓플레이스, 분석가 모두 이를 사용합니다. 가격 스크래핑은 스크래퍼가 captcha를 만나는 가장 흔한 경우 중 하나이므로, 설계를 제대로 잡아 둘 가치가 있습니다. 이 가이드는 무엇을 모니터링할지, 원래 파싱을 위해 만들어지지 않은 페이지에서 숫자를 어떻게 뽑아낼지, 변화를 어떻게 저장하고 알릴지, 그리고 그 과정에서 사이트 규칙을 어떻게 지킬지를 다룹니다.

사용해도 되는 출처부터 찾기

코드를 쓰기 전에, 사이트가 데이터를 얻는 공식 방법을 제공하는지 확인하세요. 상품 피드, API, 또는 파트너 프로그램이 있을 수 있습니다. 이런 방법은 스크래핑보다 안정적이며, 법적·기술적 위험의 대부분을 없애 줍니다. 스크래핑은 공식 경로가 없는 공개 페이지에 대한 대안이며, 이용 약관과 robots.txt는 여전히 적용됩니다. 일반적인 질문은 법적 개요에서 다룹니다.

다섯 부분으로 구성된 아키텍처

안정적인 모니터는 다섯 부분으로 구성되며, 각 부분을 분리해 두면 디버깅이 쉬워집니다.

  1. 스케줄러. 어떤 상품 페이지를 언제 방문할지 결정합니다. 모든 페이지를 같은 분에 확인하지 말고, 하루 동안 방문을 고르게 나누세요.
  2. 페처. 예의 바른 속도 조절, 재시도, 캐시와 함께 페이지를 내려받습니다.
  3. 파서. 가격, 통화 맥락, 재고 상태를 추출합니다.
  4. 저장소. 모든 관측값을 타임스탬프와 함께 보관해 이력을 남깁니다.
  5. 알림기. 새 값을 직전 값과 비교하고, 설정한 임계값을 넘으면 알립니다.

지저분한 페이지에서 가격 파싱하기

가격은 여러 형태로 나타납니다. 천 단위 구분 기호가 있거나, 소수점에 쉼표를 쓰거나, 숫자 앞에 라벨이 붙거나, 여러 요소에 나뉘어 있을 수 있습니다. 파서는 작게 유지하고 실제 예시로 테스트하세요. 아래는 천 단위에 쉼표, 소수점에 점을 쓰는 일반적인 형식을 가정한 버전입니다. 다른 형식은 호출 전에 정규화하세요.

import re
from decimal import Decimal, InvalidOperation

PRICE_PATTERN = re.compile(r"\d{1,3}(?:,\d{3})*(?:\.\d{1,2})?|\d+(?:\.\d{1,2})?")

def parse_price(text: str) -> Decimal | None:
    """텍스트에서 첫 번째 숫자를 Decimal로 반환하며, 없으면 None을 반환합니다."""
    match = PRICE_PATTERN.search(text.replace(" ", " "))
    if not match:
        return None
    try:
        return Decimal(match.group(0).replace(",", ""))
    except InvalidOperation:
        return None

print(parse_price("Now 1,249.50 in stock"))  # Decimal('1249.50')
print(parse_price("Sold out"))               # None

비교하거나 합산할 값에는 float이 아니라 Decimal을 쓰세요. 부동소수점 반올림 때문에 같은 가격이 서로 다르게 보일 수 있습니다. 파싱된 값 옆에 원본 텍스트도 함께 보관하세요. 그러면 나중에 파서 버그를 고칠 때 모든 페이지를 다시 가져올 필요가 없습니다.

이력 저장과 변화 감지

가격 하나는 스냅숏일 뿐입니다. 모니터의 가치는 이력에 있습니다. 관측 한 건마다 상품 ID, 출처, 타임스탬프, 파싱된 값, 원본 텍스트를 담은 행 하나를 저장하세요. 그러면 알림은 이전 행과의 단순한 비교가 됩니다. 소음에 파묻히지 않도록, 설정한 비율 이상 하락하거나 상품이 품절되는 등 의미 있는 변화에만 알림을 보내세요.

변형 상품과 묶음 상품 처리하기

상품 페이지에는 여러 가격이 함께 나타나는 경우가 많습니다. 사이즈나 색상별 가격, 묶음 가격, 회원 가격, 또는 옵션을 선택해야만 보이는 가격이 있습니다. 모니터가 무엇을 기록할지는 만들기 전에 정하세요. 흔한 방법은 가격과 함께 변형 식별자를 저장하는 것입니다. 그러면 한 사이즈의 변화가 상품 전체의 변화처럼 보이지 않습니다. "최저" 가격이나 취소선이 그어진 원래 가격은 주의하세요. 잘못된 숫자를 집는 파서는 잘못된 알림을 만들어 냅니다. 각 값 옆에 라벨 텍스트도 함께 저장하면, 알림이 이상해 보일 때 어떤 값을 읽었는지 확인할 수 있습니다.

예의 바르게 일정 잡기

각 상품은 실제 가격이 얼마나 자주 바뀌는지에 맞는 간격으로 확인하세요. 매일 바뀌는 상품에 시간별 확인은 필요하지 않습니다. 방문마다 지터(무작위 지연)를 더하고, 사이트당 시간당 요청 수에 상한을 두고, 선택한 간격 동안 결과를 캐시하세요. 이런 습관은 부하를 낮게 유지하고 데이터를 일관되게 만듭니다.

페이지가 차단할 때

가격 페이지는 자동화된 접근의 단골 대상이므로, 차단, 속도 제한, 또는 captcha를 만날 수 있습니다. 429나 503이 나오면 요청 간격을 늘리고, 계속 거부하는 사이트 방문은 멈추세요. 자동화가 허용된 페이지에서 captcha가 나타나면, Scarnox에서 현재 실시간으로 제공하는 captcha 유형은 PopularCaptcha입니다. 토큰 흐름은 PopularCaptcha Python 가이드에서 보여 줍니다. 장비를 더 추가하기 전에 차단되지 않고 스크래핑하기를 읽어 보세요. 대부분의 경우 추가 도구보다 요청 간격 조절이 더 많은 문제를 해결합니다.

일부 페이지는 가격을 JavaScript로 렌더링합니다. 이런 경우에는 JavaScript 웹사이트 스크래핑의 방법을 따르세요.

책임 있게 스크래핑하기

다음 단계

무료 체험 크레딧으로 카드 없이 시작하세요. 계정을 만들고 자동화가 허용된 페이지에서 PopularCaptcha 흐름을 시험해 보세요. 현재 요금은 요금 페이지에서 확인할 수 있습니다.