시장 조사를 위한 TikTok Shop 상품 데이터 수집

공식 경로부터 살펴봅니다. TikTok Shop Partner API와 Research API가 실제로 무엇을 제공하는지, 언제 라이선스 데이터가 나은지, 그리고 공개 상품 페이지를 해당 시장에서 천천히 읽는 방법을 정리했습니다.

Collecting TikTok Shop Product Data for Market Research
이 글의 목차

가격이나 상품 구성 조사를 위해 TikTok Shop 상품 데이터가 필요하다면 공식 경로부터 확인해야 합니다. TikTok Shop Partner API는 카탈로그와 주문 데이터를 전부 제공하지만, 내 앱을 승인한 상점에 한해서입니다. TikTok Research API는 EU 상점의 상품, 가격, 판매 수량 필드를 반환하지만, 승인된 비상업 연구자에게만 열려 있습니다. 경쟁사를 분석하는 상업 팀은 대부분 분석 업체의 라이선스 데이터를 쓰거나, 공개 상품 페이지가 이미 게시하는 구조화 데이터를 조사 대상 시장의 IP를 거쳐 천천히, 절제해서 읽는 수집기를 운영하게 됩니다.

이 가이드는 시장 조사를 위해 작성되었습니다. TikTok과 제휴하거나 TikTok의 보증을 받은 글이 아니며, TikTok의 서명된 비공개 내부 API는 다루지 않습니다.

팀이 실제로 필요로 하는 TikTok Shop 상품 데이터

대부분의 조사 질문은 약 여덟 개 필드로 귀결됩니다. 상품명, 현재 가격, 정가(그리고 이에 따른 할인율), 판매 수량, 상점, 평점과 리뷰 수, 카테고리, 해당 상품을 홍보하는 크리에이터입니다.

  • 가격 조사. 같은 상품이나 동등 상품을 파는 판매자 간에 현재 가격, 정가, 통화, 진행 중인 프로모션을 비교합니다. 일관된 타임스탬프와 고정된 시장이 필요합니다. 영국 스토어프런트의 가격과 독일의 가격은 노이즈가 섞인 하나의 관측값이 아니라 서로 다른 관측값입니다.
  • 상품 구성 분석. 상점이 어떤 카테고리를 다루는지, SKU와 옵션을 몇 개나 올렸는지, 카테고리 내에서 가격이 어디쯤인지를 봅니다. 보통 주간 스냅샷이면 충분합니다.
  • 추세 탐지. 카테고리별 판매 수량과 리뷰 수의 시간에 따른 변화입니다. 절대값보다 기울기가 중요한데, 표시되는 판매 수치가 부정확하다는 점(아래에서 설명)을 생각하면 다행인 일입니다.
  • 크리에이터·제휴 매핑. 어떤 크리에이터가 상품을 링크하는지입니다. 상품이 아니라 사람에 관한 정보라서 법적으로 가장 무게가 큰 필드입니다.

다른 마켓플레이스용 가격 추적기를 만들어 봤다면 구조는 익숙할 겁니다. 파이프라인 측면은 경쟁사 가격 자동 모니터링과 시장별 가격 추적 가이드에서 다룹니다. TikTok Shop이 다른 점은 카탈로그의 상당 부분이 시장과 로그인에 따라 제한된다는 것입니다.

TikTok Shop 데이터를 얻는 공식 경로

구조화된 TikTok Shop 데이터를 얻는 정당한 출처는 세 가지이며, 어느 것도 상업 팀에 경쟁사 카탈로그를 그냥 넘겨주지는 않습니다. 그래도 먼저 확인할 가치가 있습니다. 앞의 두 가지는 자격만 되면 무료이고, 세 번째는 직접 만드는 것보다 저렴한 경우가 많습니다.

TikTok Shop Partner Center와 TTS API

TikTok Shop Partner Center는 개발자가 TikTok Shop Open Platform용 앱을 등록하는 곳입니다. TikTok의 공식 개요는 TTS API가 "카탈로그, 주문, 배송, 결제 등 승인된 TikTok Shop 데이터"에 접근할 수 있게 해 준다고 설명합니다. 카테고리에는 Product, Order, Fulfillment, Return & Refund, Logistics, Promotion, Finance, Seller, Authorization, Events, Data Reconciliation, Supply Chain API가 있습니다.

핵심은 승인된이라는 단어입니다. 문서에는 세 가지 승인 유형이 나옵니다. 판매자(상점이 내 앱에 접근 권한을 부여), 크리에이터, 파트너입니다. 모두 데이터 소유자의 동의에 달려 있습니다. 판매자이거나 판매자를 고객으로 둔 툴 업체라면 이보다 좋은 데이터는 없습니다. 해당 상점의 정확한 가격, 실제 재고, 실제 주문 수입니다. 하지만 내 앱을 연결하지 않은 상점을 들여다보는 수단은 아닙니다. 문서에는 지원 지역과 로케일 목록도 있으며, 시장이 열리면서 지원 범위가 바뀐다는 안내가 붙어 있습니다.

EU 상점 데이터가 포함된 TikTok Research API

TikTok Research API는 주로 공개 동영상, 댓글, 계정 데이터로 알려져 있습니다. 하지만 많은 사람이 놓치는 TikTok Shop 엔드포인트도 세 개 있습니다. 상점 정보 엔드포인트는 상점 평점, 리뷰 수, 판매 수량, 성과 값을 반환합니다. 상점 상품 엔드포인트는 상품명, 가격, 설명, 판매 수량, 리뷰 수, 1~5점 별점 분포를 반환합니다. 상품 리뷰 엔드포인트는 리뷰 본문, 평점, 타임스탬프를 반환합니다. 세 엔드포인트 모두 EU에서 판매되는 상점과 상품으로 범위가 제한되고, 호출당 최대 10개 결과를 반환합니다.

문제는 자격 요건입니다. 접근 권한은 미국, EEA, 영국, 캐나다, 스위스의 학술 기관, EU의 비영리 연구 기관, 그리고 청소년 안전을 연구하는 일부 브라질 기관에 주어집니다. 신청자는 "상업적 이해관계로부터 독립적"이어야 합니다. Research API FAQ에 따르면 기본 할당량은 하루 1,000건입니다. EU 소셜 커머스를 연구하는 대학 연구팀이라면 신청할 만하지만, 브랜드의 가격 담당 팀은 자격이 없으며 연구 파트너의 접근 권한을 빌려 써서도 안 됩니다.

분석 업체의 라이선스 데이터

상품 순위, 추정 매출, 크리에이터-상품 연결, 카테고리 추세를 대시보드나 API로 판매하는 TikTok Shop 분석 제품군이 따로 있습니다. 구매 전에 세 가지를 물어보세요. 어느 시장을 다루는가? 매출 수치는 관측값인가, 모델링한 값인가? 데이터를 사내에 재배포할 수 있는가? 숫자의 출처를 밝히지 못하는 업체가 주는 것은 추정치이며, 그렇게 다뤄야 합니다.

경로이용 가능 대상제공 범위경쟁사 데이터?
TTS API(Partner Center)판매자, 그리고 판매자·크리에이터·파트너가 승인한 앱 개발자승인된 상점의 전체 카탈로그, 가격, 재고, 주문, 프로모션, 재무불가. 내 앱을 연결한 상점만 해당
Research API, TikTok Shop 엔드포인트승인된 비상업 연구자EU 상점: 상점 평점과 판매량, 상품 가격과 판매 수량, 리뷰가능. 단, 비상업 연구 전용
분석 업체비용을 내는 누구나순위, 추정 매출, 크리에이터 연결, 이력가능. 라이선스 범위 내, 정확도는 제각각
공개 상품 페이지서비스 대상 시장의 누구나로그아웃 방문자에게 페이지가 보여 주는 모든 것가능. 이용약관과 robots.txt의 제약을 받음

공개 TikTok Shop 페이지: 오픈 웹에 있는 것

TikTok Shop은 주로 앱 안에서 이용하는 서비스지만, shop.tiktok.com에 시장별로 구성된 브라우저 스토어프런트가 있고 상품 상세 페이지는 /pdp/ 경로 아래에 있습니다. 어떤 시장이 보이는지는 접속 위치에 따라 달라집니다. 독일 서버에서 www.tiktok.com/shop/pdp/… URL을 요청하자 shop.tiktok.com/de/pdp/…로 301 리다이렉트가 돌아왔습니다. 같은 서버에서 경로만 있는 www.tiktok.com/shop을 요청하면 shop.tiktok.com/us로 리다이렉트되었습니다.

시장 범위를 보면, TikTok 뉴스룸은 오스트리아, 벨기에, 네덜란드, 폴란드가 2026년 6월 15일에 출시된다고 발표했으며, 이로써 프랑스, 독일, 아일랜드, 이탈리아, 스페인, 영국에 합류합니다. Partner Center 지역 목록(2026년 7월 6일 최종 수정)에는 미국, 멕시코, 브라질, 일본, 인도네시아, 말레이시아, 필리핀, 싱가포르, 태국, 베트남도 있습니다. 공식 출처가 있는 시장은 이렇게 20곳입니다. 서드파티 목록에는 더 많은 시장이 나오지만 TikTok 자체 페이지로 확인할 수 없어서 여기서는 제외했습니다.

수집에 관해서는 세 가지가 따라옵니다.

  • 지역이 보이는 내용을 결정합니다. 같은 상품이라도 시장마다 가격, 통화, 판매 여부, 판매자가 다를 수 있고, 아예 없을 수도 있습니다. 영국 스토어프런트를 수집하려면 트래픽이 영국에서 나가야 합니다. 이것이 여기서 국가 타기팅이 되는 주거용 IP가 중요한 주된 이유입니다. 예를 들어 주거용 프록시에서 USERNAME-country-GB를 쓰는 식입니다. 위장과는 아무 관련이 없습니다.
  • 페이지가 JavaScript에 크게 의존합니다. 스토어프런트는 클라이언트 렌더링 앱입니다. shop.tiktok.com의 응답 헤더에는 ByteDance의 오픈소스 웹 프레임워크를 뜻하는 x-processed-by: Modern.js가 포함되어 있습니다. 실제 브라우저가 필요하다고 보세요.
  • 중간 확인 페이지가 있습니다. 저희 데이터센터 테스트 서버에서는 shop.tiktok.com/de와 shop.tiktok.com/robots.txt 모두 CAPTCHA 스크립트를 불러오는 "Security Check"라는 제목의 HTML 페이지를 반환했습니다. 저희는 거기서 멈췄습니다. 이 챌린지를 풀거나 우회하는 것은 이 글의 범위가 아니며, 수집기가 반복해서 이 페이지를 만난다면 속도를 늦추거나 중단하는 것이 올바른 대응입니다.

상품 페이지에서 데이터가 있는 위치

요즘 스토어프런트에서 원하는 필드가 깔끔한 HTML에 들어 있는 경우는 드뭅니다. 보통 세 곳 중 하나에 있으며, 안정성이 높은 순서는 다음과 같습니다. schema.org Product/Offer를 따르는 JSON-LD 블록(검색 엔진용으로 게시됨, Google 상품 마크업 문서 참고), Open Graph와 상품 메타 태그, 그리고 프레임워크에 내장된 하이드레이션 상태입니다. 하이드레이션 상태는 앱이 추가 왕복 없이 렌더링하려고 <script> 태그 안에 넣어 둔 큰 JSON 덩어리입니다.

요령은 페이지가 이미 보내 준 것을 읽는 것입니다. JSON-LD와 메타 태그는 문서화된 형식이므로 그대로 파싱합니다. 하이드레이션 상태는 JSON 덩어리 목록(ID와 크기)을 먼저 정리하고, 브라우저에서 하나를 직접 살펴본 다음, 필요한 필드만 매핑합니다. 범위에서 명시적으로 제외하는 것이 두 가지 있습니다. 앱이 뒤에서 쓰는 비공개 XHR 엔드포인트를 호출하는 것, 그리고 그 서명이나 토큰 파라미터를 재현하는 것입니다. 서명을 위조하는 것은 수집이 아니라 우회입니다. 저희 테스트 서버에서는 상품 페이지를 불러오지 못했으므로(위의 중간 확인 페이지 참고) TikTok Shop 페이지에 JSON-LD가 있다고 단정하지 않겠습니다. 아래 코드는 JSON-LD가 있든 없든 똑같이 동작합니다.

데이터 항목주로 있는 위치신뢰도참고
상품명JSON-LD name, og:title, 하이드레이션 상태높음시장별로 현지화될 수 있으므로 상품명이 아니라 상품 ID를 키로 쓰세요
현재 가격JSON-LD offers.price, 하이드레이션 상태중간시장, 옵션, 프로모션에 따라 달라집니다. 통화는 항상 함께 저장하세요
정가 / 할인하이드레이션 상태, JSON-LD에는 드묾중간~낮음취소선 가격은 판매자가 정합니다. 할인율은 직접 계산하세요
판매 수량하이드레이션 상태, 화면 표시 라벨, Research API(EU)낮음~중간라벨이 축약되는 경우가 많습니다. 감사받은 매출이 아니라 추세로 활용하세요
평점, 리뷰 수JSON-LD aggregateRating, 하이드레이션 상태중간시장마다 리뷰 집계 방식이 다를 수 있습니다. Research API는 EU에 대해 별점 분포를 제공합니다
상점명 / ID하이드레이션 상태, 화면의 판매자 영역높음ID를 저장하세요. 상점명은 바뀝니다
카테고리breadcrumb JSON-LD, 하이드레이션 상태중간카테고리 트리는 시장마다 다릅니다. 자체 분류 체계에 매핑하세요
옵션 / SKU하이드레이션 상태중간가격 범위로 표시되면 구매자가 실제로 고르는 옵션의 가격이 가려집니다
크리에이터 / 제휴 링크대부분 앱 안, 일부는 하이드레이션 상태웹에서는 낮음개인정보입니다. 이 항목은 보통 업체나 파트너 데이터가 낫습니다

절제된 수집 설계

연구용 수집기는 느리고 정직한 방문자처럼 행동해야 합니다. 한 번에 한 페이지, 고정된 URL 목록, 적극적인 캐싱, 챌린지를 만나면 중단하는 것입니다. TikTok의 약관과 robots 규칙은 다른 사이트보다 한계를 분명히 밝히고 있으니 거기서 시작하세요.

robots.txt와 약관이 실제로 말하는 것

www.tiktok.com/robots.txt(2026년 10월 3일 확인)는 모든 사용자 에이전트에 대해 /shop/view/product/를 차단하고, GPTBot, ClaudeBot, CCBot, PerplexityBot, Bytespider 등 이름이 명시된 크롤러 목록에 대해서는 사이트 전체를 차단합니다. /shop/pdp/는 언급하지 않으며 Sitemap 줄도 없습니다. shop.tiktok.com/robots.txt는 저희 테스트 서버에서 HTML 챌린지 페이지가 대신 반환되어 읽을 수 없었습니다. 여기에 함정이 있습니다. Python의 urllib.robotparser는 HTML 페이지를 "규칙 없음", 즉 "모두 허용"으로 해석합니다. 아래 코드는 일반 텍스트 200 응답만 신뢰합니다.

약관은 robots.txt보다 엄격합니다. 미국 이용약관(TikTok USDS Joint Venture LLC와 체결, 2026년 7월 15일 최종 수정)은 "서면으로 승인된 경우를 제외하고, 어떤 목적이든 자동화된 시스템이나 소프트웨어를 사용해 플랫폼에서" 데이터를 스크래핑하거나 추출하는 것을 금지합니다. EEA 약관도 거의 같은 내용입니다. 로그아웃 방문자에게 구속력이 있는지는 관할에 따라 다르지만, 공식 경로와 라이선스 경로를 우선할 강력한 이유가 됩니다.

설계 원칙과 그 이유

  1. 크롤링이 아니라 알려진 URL 목록에서 시작하세요. 조사 질문은 특정 상품이나 샘플링한 집합에 관한 것입니다. 검색 페이지와 카테고리 페이지를 크롤링하면 부하와 약관 위반 위험이 쌓이며, 어차피 TikTok의 robots.txt는 /search? 경로를 차단합니다.
  2. 실행마다 시장 하나만, 고정해서 쓰세요. 출구 IP를 국가 타기팅하고 브라우저 로케일과 시간대도 맞춰서, 한 배치의 모든 관측값이 같은 시장이 되도록 하세요.
  3. 요청 빈도를 낮게 유지하세요. 상품 수백 개의 일간 가격 스냅샷이라면 시장당 20~40초에 한 페이지면 충분합니다.
  4. (상품 ID, 시장, 날짜) 단위로 캐시하세요. 오늘자 영국 관측값이 이미 있다면 다시 가져오지 마세요.
  5. 챌린지는 중단 신호로 받아들이세요. 기록하고, 기다리고, 빈도를 낮추세요. 같은 차단을 피하려고 IP를 로테이션하지 마세요.
  6. 로그인하지 마세요. 로그아웃 방문자에게 보이는 것만 수집하세요. 로그인 상태로 수집하면 자동화가 계정과 그 약관에 묶이고 개인정보에도 손을 대게 됩니다.

Playwright를 활용한 신중한 Python 예제

아래 스크립트는 국가 타기팅 프록시를 거쳐 Chromium에서 각 상품 URL을 엽니다. 먼저 실제 robots.txt를 확인하고, 200이 아닌 응답이나 "Security Check" 제목을 만나면 멈추며, JSON-LD Product 데이터, 몇 가지 메타 태그, 그리고 직접 살펴볼 수 있도록 내장 JSON 덩어리 목록을 추출합니다. 검증할 수 없었기 때문에 TikTok 전용 셀렉터는 쓰지 않으며, 값이 없는 필드는 모두 None으로 반환됩니다. 프록시 설정은 Playwright 문서의 프록시 옵션을 따릅니다. 추출과 robots 로직은 Playwright 1.55로 로컬 픽스처에 대해 테스트했으며, 실제 TikTok Shop 페이지에서는 실행하지 않았습니다.

import json
import random
import time
import urllib.robotparser
from urllib.parse import urlsplit

from playwright.sync_api import sync_playwright

# Country is chosen in the proxy username; match locale/timezone to it.
PROXY = {
    "server": "http://gate.proxyhat.com:8080",
    "username": "USERNAME-country-GB",
    "password": "PASSWORD",
}
UA_NAME = "acme-price-research"  # the token you'd look for in robots.txt groups

# Product URLs you already have (from your own catalogue matching, a partner
# export, or manual research), not URLs discovered by crawling search pages.
URLS = [
    "https://shop.tiktok.com/...",  # paste real product URLs as your browser shows them
]


def robots_verdict(context, url):
    """Return True/False from a real robots.txt, or None if we couldn't get one."""
    parts = urlsplit(url)
    resp = context.request.get(f"{parts.scheme}://{parts.netloc}/robots.txt")
    ctype = resp.headers.get("content-type", "")
    # An HTML challenge page parses as "no rules" (= allow everything) in
    # urllib.robotparser, so only trust a plain-text 200.
    if resp.status != 200 or "text/plain" not in ctype:
        return None
    rp = urllib.robotparser.RobotFileParser()
    rp.parse(resp.text().splitlines())
    return rp.can_fetch(UA_NAME, url)


def _types(node):
    t = node.get("@type", [])
    return t if isinstance(t, list) else [t]


def extract(page):
    """Read what the page itself publishes: JSON-LD, Open Graph/product meta,
    and an inventory of embedded JSON blobs for a human to inspect."""
    jsonld = []
    for raw in page.locator('script[type="application/ld+json"]').all_text_contents():
        try:
            data = json.loads(raw)
        except json.JSONDecodeError:
            continue
        nodes = data if isinstance(data, list) else data.get("@graph", [data])
        jsonld.extend(n for n in nodes if isinstance(n, dict))

    meta = {}
    for prop in ("og:title", "og:url", "product:price:amount", "product:price:currency"):
        loc = page.locator(f'meta[property="{prop}"]')
        if loc.count():
            meta[prop] = loc.first.get_attribute("content")

    blobs = page.evaluate(
        """() => [...document.querySelectorAll('script[type="application/json"]')]
                 .map(s => ({id: s.id || null, chars: s.textContent.length}))"""
    )

    product = next((n for n in jsonld if "Product" in _types(n)), None)
    record = {"name": None, "price": None, "currency": None,
              "availability": None, "rating": None, "review_count": None}
    if product:
        record["name"] = product.get("name")
        offers = product.get("offers") or {}
        if isinstance(offers, list):
            offers = offers[0] if offers else {}
        record["price"] = offers.get("price") or offers.get("lowPrice")
        record["currency"] = offers.get("priceCurrency")
        record["availability"] = offers.get("availability")
        agg = product.get("aggregateRating") or {}
        record["rating"] = agg.get("ratingValue")
        record["review_count"] = agg.get("reviewCount") or agg.get("ratingCount")
    return {"record": record, "meta": meta, "json_blobs": blobs,
            "has_jsonld_product": product is not None}


def main():
    results = []
    with sync_playwright() as p:
        browser = p.chromium.launch(proxy=PROXY)
        context = browser.new_context(locale="en-GB", timezone_id="Europe/London")
        page = context.new_page()
        for url in URLS:
            verdict = robots_verdict(context, url)
            if verdict is not True:
                results.append({"url": url, "status": "skipped", "robots": verdict})
                continue
            resp = page.goto(url, wait_until="domcontentloaded", timeout=45_000)
            status = resp.status if resp else None
            if status != 200 or page.title().strip().lower() == "security check":
                # Don't try to solve it. Record, slow down, move on.
                results.append({"url": url, "status": "challenge_or_error", "http": status})
                time.sleep(120)
                continue
            data = extract(page)
            data.update({"url": url, "final_url": page.url, "status": "ok",
                         "fetched_at": time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime()),
                         "proxy_country": "GB"})
            results.append(data)
            time.sleep(random.uniform(20, 40))  # one page at a time, slowly
        browser.close()
    print(json.dumps(results, indent=2, ensure_ascii=False))


if __name__ == "__main__":
    main()

has_jsonld_product가 false로 나오면 json_blobs를 확인하세요. 일반 브라우저에서 상품 하나를 열어 가격이 들어 있는 덩어리를 찾고, 필요한 두세 개 키에 대해 작고 명시적인 매핑을 작성하세요. 그 키의 위치가 바뀌면 확실히 실패하는 테스트도 추가하세요. JavaScript 측면을 더 넓게 보려면 JavaScript 중심 웹사이트 스크래핑을 참고하세요.

데이터 품질 함정

TikTok Shop 데이터셋은 대부분 수집이 아니라 분석 단계에서 잘못됩니다. 정규화 없이 시장 간 가격을 비교하고, 프로모션 가격을 정가로 읽고, 반올림된 판매 수량을 매출 수치로 취급하는 경우입니다.

  • 지역과 통화. 모든 행에 시장, 통화, 출구 국가를 저장하세요. 통화는 관측일 환율로 환산하고, 시장 간 가격을 평균 내지 마세요.
  • 타임 세일과 프로모션. 짧은 프로모션이 표시 가격을 몇 시간씩 바꿔 놓을 수 있습니다. 매일 같은 시각에 스냅샷을 찍고, 표시 가격과 정가를 모두 기록해 세일을 영구 인하로 착각하지 않도록 하세요.
  • 판매 수량 반올림. 표시되는 수치는 축약되는 경우가 많고, 페이지 데이터에 정확한 정수가 있더라도 감사받은 숫자가 아니라 플랫폼의 수치입니다. 시간에 따른 차이를 쓰고, 매끄러운 곡선보다 계단 모양을 예상하세요.
  • 시장별 카탈로그. 한 시장에서 상품이 보이지 않는다고 품절은 아닙니다. 그 시장에서 판매하지 않는 것일 수 있습니다. "해당 시장 미판매"와 "품절"을 구분해 두세요.

저희가 다룬 다른 마켓플레이스에서도 같은 문제가 나옵니다. Shein 가격 인텔리전스 가이드는 지역별 스토어프런트를, Temu 상품 데이터 가이드는 내장 JSON을, Shopify 가이드는 문서화된 공개 상품 엔드포인트를 다룹니다. 이런 엔드포인트가 없는 플랫폼과 비교해 볼 만합니다.

법적·윤리적 경계

공개 상품 목록은 이 데이터셋에서 위험이 가장 낮은 부분이고, 크리에이터는 가장 높은 부분입니다. 상품 가격은 상업 정보지만, 크리에이터의 핸들, 프로필, 제휴 활동은 식별 가능한 개인과 관련될 경우 GDPR상 개인정보입니다. EU나 영국 관련 작업에서 이를 수집하려면 프로필이 공개되어 있더라도 적법한 근거, 데이터 최소화, 보존 기한이 필요합니다. 개인 프로필을 쌓는 대신 "크리에이터 50명 이상이 홍보한 상품"처럼 가능한 한 집계하세요.

여기에 앞서 인용한 TikTok 약관과 상표 문제가 더해집니다. TikTok Shop은 사실에 맞게 기술하고, 데이터셋이나 툴이 TikTok Shop과 제휴한 것처럼 보이게 하지 마세요. 상업적이고 지속적인 조사라면 공식 경로나 라이선스 경로가 거의 항상 더 오래가는 선택입니다. 공개 페이지 수집기는 공식 경로가 다루지 않는 좁고 소량인 확인 작업, 예를 들어 오늘 영국 쇼핑객이 실제로 보는 화면을 확인하는 데 가장 잘 맞습니다.

이 방식으로 해결되지 않는 것

절제된 공개 페이지 수집기로는 카테고리 전체 범위, 크리에이터 귀속, 라이브 방송 매출, 앱 전용 콘텐츠를 얻을 수 없습니다. 중간 확인 페이지를 넘어가지도 못하며, 시도해서도 안 됩니다. 몇 달이 지나면 프런트엔드가 바뀌면서 동작하지 않게 되기도 합니다. 이 중 무엇이든 필요하다면 그 공백은 엔지니어링이 아니라 데이터 라이선스의 문제입니다. 나머지 네트워크 측면은 웹 스크래핑 활용 사례 페이지와 지원 지역 목록에서 어느 국가를 경유할 수 있는지 확인할 수 있습니다.

자주 묻는 질문

TikTok Shop 상품 데이터를 위한 공식 API가 있나요?

있습니다. Partner Center에서 제공하는 TikTok Shop TTS API로 카탈로그, 가격, 재고, 주문 데이터를 받을 수 있지만, 내 앱을 승인한 상점, 크리에이터, 파트너의 데이터만 해당합니다. 경쟁사 상점을 들여다보는 수단은 아닙니다.

TikTok Research API에 TikTok Shop 데이터도 포함되나요?

EU에 한해 포함됩니다. Research API에는 상점 정보, 상점 상품(가격과 판매 수량 포함), 상품 리뷰 엔드포인트가 있으며, EU에서 판매되는 상점과 상품으로 제한됩니다. 접근 권한은 학술 기관이나 비영리 연구 기관 같은 승인된 비상업 연구자에게만 주어집니다.

TikTok Shop 가격이 다른 나라와 왜 다르게 보이나요?

TikTok Shop은 시장마다 별도의 스토어프런트를 운영하고, 요청은 위치에 따라 해당 시장으로 라우팅됩니다. 가격, 통화, 판매자, 판매 여부가 모두 다를 수 있으므로 각 시장은 그 국가의 IP에서 수집하고 관측값마다 시장 정보를 함께 저장하세요.

TikTok 약관상 TikTok Shop 페이지를 자동으로 수집해도 되나요?

TikTok의 미국 및 EEA 약관은 서면 승인 없는 자동화된 데이터 추출을 금지하며, www.tiktok.com의 robots.txt는 모든 크롤러에 대해 /shop/view/product/를 차단합니다. 상업적 용도라면 공식 데이터나 라이선스 데이터를 우선하고, 공개 페이지 수집은 최소한으로, 천천히, 로그아웃 상태로만 하세요.

TikTok Shop 판매 수량은 얼마나 정확한가요?

방향성 지표로 보는 것이 좋습니다. 표시되는 수치는 축약되는 경우가 많고, 정확한 숫자라도 감사를 거친 값이 아니라 플랫폼이 보고한 값입니다. 매출 데이터로 취급하지 말고 시간에 따른 변화로 추세를 파악하는 데 쓰세요.

차단 없이 가격과 경쟁사를 추적하세요

이커머스 데이터를 위한 안정적인 주거용 프록시. 가입하고 깨끗한 데이터를 수집하세요.

시작하기
← 블로그로 돌아가기