← 전체 글

대규모 감성 분석을 위한 제품 리뷰 수집

리뷰 데이터는 JS 렌더링, 페이지네이션, 사이트 감지 로직 뒤에 숨어 있습니다. 감성 분석 모델에 유의미한 데이터를 공급하기 위해 집계 파이프라인에 필요한 요소를 살펴봅니다.

과제

소비자 브랜드는 더 이상 단일 마켓플레이스의 리뷰 대시보드에만 의존할 수 없습니다. 동일한 SKU라도 Amazon, Walmart, Best Buy, 그리고 Trustpilot이나 자체 Shopify 스토어마다 각기 다른 리뷰 점수를 갖습니다. 제품 팀, 감성 분석 모델, 또는 CX 운영 큐가 이 중 하나만 확인하고 있다면, 깨진 거울을 보고 방향을 잡는 것과 같습니다.

이것이 바로 리뷰 문제의 일상적인 형태인 파편화입니다. 리뷰 데이터는 존재하지만, 서로 다른 10개의 로그인, 10개의 렌더링 스택, 10개의 봇 탐지 환경 뒤에 나뉘어 있습니다. 매주 감성 분류 모델에 데이터를 공급하거나 주요 상품에 부정적인 리뷰가 등록되었을 때 알림을 트리거하려면, 이 모든 최신 데이터를 한곳에 모아야 합니다.

이 데이터를 통합하는 것은 데이터 문제이기 이전에 렌더링 문제입니다. 대부분의 팀은 이 전반부의 난이도를 과소평가합니다.

까다로운 이유

2026년의 리뷰 페이지는 2018년의 리뷰 페이지와 완전히 다릅니다. 중요한 모든 요소는 초기 HTML 이후에 로드됩니다.

  • 리뷰 목록 자체는 브라우저가 셸을 렌더링한 후 JSON을 통해 가져옵니다.
  • 심층 페이지(리뷰 더보기, 페이지네이션)의 경우 세션에 적절한 cookie가 유지되어야 하며, 스크롤 인터랙션이 수반되기도 합니다.
  • 정렬 필터(최신순, 구매자 인증 전용)는 request signature를 변경합니다. 하나라도 어긋나면 마켓플레이스는 기본 뷰를 반환하고 미세한 rate limit을 적용합니다.
  • 전체 페이지는 User-Agent를 확인하기도 전에 request의 로우레벨 시그니처, header 순서, 타이밍을 검사하는 봇 방어 체계 뒤에 배치됩니다.

단순 HTTP request로 해당 페이지를 호출하면 리뷰나 평점이 없는 빈 셸만 수신됩니다. 직접 구축한 headless 브라우저로 호출하면 마켓플레이스가 봇 탐지 방식을 변경할 때마다 브라우저를 유지 관리하고, 프록시 출구 노드를 교체하며, 새로운 탐지 규칙에 대응해야 하는 지속적인 비용이 발생합니다.

해결책

효과적인 패턴은 단일 API endpoint로 호출할 수 있는 브라우저 기반 fetch입니다. 리뷰 URL을 전달하면, 페이지를 렌더링하고 JavaScript를 실행하며 리뷰 페이로드가 하이드레이션될 때까지 대기한 후 DOM을 반환합니다. session 정보가 response에 함께 포함되므로 다음 페이지네이션 호출 시 이를 재사용할 수 있습니다.

FourA의 Browser 제품을 사용하면 Python에서 다음과 같이 작성할 수 있습니다.

import requests

def fetch_reviews(url, api_key, sticky_proxy=None):
    body = {
        "url": url,
        "unblocker": True,
    }
    if sticky_proxy:
        body["proxy"] = sticky_proxy

    r = requests.post(
        "https://api.foura.ai/api/browser",
        headers={"Authorization": f"Bearer {api_key}"},
        json=body,
        timeout=60,
    ).json()

    return {
        "status": r.get("status"),
        "html": r.get("body"),
        "cookies": r.get("cookies"),
        "sticky_proxy": r.get("proxy"),
        "defense_solved": r.get("defenseSolved"),
    }

리뷰 스크래핑에서는 두 가지 세부 사항이 중요합니다.

첫째, unblocker: true는 대부분의 마켓플레이스 리뷰 페이지가 적용하는 와이어 레벨 방어 체계를 처리합니다. 이것이 없으면 리뷰 대신 챌린지 페이지가 반환됩니다.

둘째, 반환되는 proxy 값은 렌더링에 성공한 출구 노드의 base36 ID입니다. 동일한 제품에 대한 다음 호출 시 이 값을 다시 전달하면 페이지네이션에서 동일한 방문자로 인식합니다. 따라서 1페이지는 정상 로드되고 3페이지에서는 아무것도 반환되지 않는 문제의 원인은 주로 세션 고정 여부에 있습니다.

상위 20개 리뷰의 주간 스냅샷만 필요한 제품이라면 세션 고정을 건너뛰고 각 호출이 자체 출구를 선택하도록 두십시오. 세션 고정은 깊은 페이지네이션이 실제로 필요한 SKU에만 적용하는 것이 좋습니다.

기대할 수 있는 결과

이 패턴을 기반으로 리뷰 수집을 실행하는 팀은 다음 사항을 기대할 수 있습니다.

  • 커버리지: 판매 중인 모든 마켓플레이스에서 모든 제품의 리뷰를 수집하며, CX 알림을 위한 일 단위부터 트렌드 분석을 위한 주 단위까지 다운스트림 요구에 맞는 주기로 갱신됩니다.
  • 수집 깊이: 마켓플레이스별 SKU당 리뷰 첫 3-5페이지를 수집하며, 이곳에 실행 가능한 인사이트가 집중되어 있습니다. 5페이지 이후의 롱테일 데이터는 감성 분석 관점에서 대부분 노이즈에 가깝습니다.
  • 최신성: 월간 데이터 추출이 실행될 때까지 2주를 기다릴 필요 없이, 새로 등록된 리뷰가 게시 하루 만에 감성 파이프라인으로 유입됩니다.
  • 비용 예측 가능성: 렌더링 완료된 fetch 건당 비용을 지불하므로, 브라우저 유지보수에 필요한 인력 규모가 아니라 관리 대상 SKU 수에 비례하여 예산이 책정됩니다.

이는 단순한 이상치가 아닙니다. 렌더링 영역의 부담을 팀에서 완전히 분리했을 때 얻을 수 있는 결과입니다.

전체 마켓플레이스 모니터링 스택과 비교하자면, 리뷰 수집은 감성 분석에 집중된 형태입니다. 동일한 렌더링 엔진을 공유하되 다운스트림 목적이 다릅니다.

핵심 요약

브랜드가 보는 모든 대시보드는 차트로 귀결됩니다. 하지만 차트는 다운스트림 결과물일 뿐입니다. 대부분의 브랜드가 이를 제대로 해내지 못하는 업스트림 비용 문제는 렌더링 인프라에서 발생합니다. 접근을 차단하도록 설계된 방어 체계를 뚫고 15개 마켓플레이스에 대한 연결성을 유지하는 데 엔지니어 3명과 별도 proxy 계약 수준의 비용이 소모되지 않아야 합니다.

렌더링 영역이 리뷰 수집 프로젝트의 병목이라면, 그 부분은 외부 솔루션을 도입하는 것이 합리적입니다. 감성 모델, 대시보드, 알림 시스템은 최신 리뷰가 유입되기 시작하면 팀 내에서 반나절 만에 구축할 수 있는 영역입니다.