ブログに戻ります

TikTokショップ商品リサーチ:商品ウォッチリストを比較する

Ava Wilson
Ava Wilson

Expert in Web Scraping Technologies

03-Sep-2026

TL;DR:

  • TikTok Shopの商品リサーチには提供されたウォッチリストが必要です。 ショップページのアクターは既知の製品を評価し、すべてのトレンドアイテムや高ポテンシャルアイテムを発見するわけではありません。
  • 比較行にはカテゴリと市場の文脈が必要です。 類似の製品をグループ化し、価格を比較する前に返された地域と通貨を保持します。
  • 製品とSKUの記録は異なる質問に答えます。 表示された製品の価格は自動的にすべてのバリアントを表すことはできません。
  • sold_countは文書化された応答の中で共有された最近の販売ウィンドウがありません。 それは現在どの製品が速く売れているかを決定すべきではありません。
  • 評価とレビュー数にはカバレッジラベルが必要です。 欠落している値は不明のままで、ゼロ品質スコアにはなりません。
  • 無料で始められます。 新しいScrapelessアカウントには、Scrapeless Dashboardを通じて無料のクレジットが含まれています。

はじめに:API呼び出しの前に製品リサーチが始まる

リサーチテーブルは、候補リストとその背後にある比較ルールによってだけ良いものになります。無関係なカテゴリ、地域、通貨、バリアント構造を混ぜることは、精密に見えるランク付けを作成しますが、安定したビジネスの質問には答えません。

このワークフローは、ユーザーがキュレーションしたTikTok Shop製品ウォッチリストから始まります。それは公開された製品スナップショットを収集し、製品とSKUフィールドを分離し、比較の範囲をチェックし、人間のレビュー用のテーブルを生成します。自動製品発見や普遍的な「勝利製品」スコアを主張するものではありません。

リストレビューではなく、繰り返しの観察による変化に依存する場合は、TikTok Shop価格追跡チュートリアルを使用してください。

パイプラインの概要

ステージ リサーチ質問 出力
フレーム どのカテゴリ、市場、および決定が研究されていますか? リサーチブリーフ
ウォッチ どの既知の製品が範囲に含まれるべきですか? 候補ウォッチリスト
収集 各公開製品ページは今何を公開していますか? 生のスナップショット
正規化 どのフィールドが製品レベルまたはSKUレベルですか? 比較テーブル
レビュー どの結論がサポートまたは未解決ですか? 決定ワークシート

パイプラインは、既知の候補セットのための証拠収集をサポートします。検索、トレンド発見、マージン、転換、サプライヤー検証には追加データが必要です。

前提条件

  • Scrapeless DashboardからのScrapelessアカウントとAPIトークン
  • 製品ID、リクエスト地域、カテゴリグループ、内部ノートを含むCSVウォッチリスト
  • 通貨、バリアント、欠損値に関する書面での比較ポリシー
  • 収集ブロック用のSCRAPELESS_API_KEYのライブトークン

APIの例は前提条件のギャップです。ライブクレデンシャルと製品ウォッチリストは読者に属します。コードには隠された例の製品や偽の応答は含まれていません。

ステージ1:リサーチ質問とウォッチリストの定義

見直すことができる決定から始めます:選択した製品の公共オファー構造を1つのカテゴリと市場で比較するか、必要なバリアントと出荷情報を持つ候補を検査します。

ウォッチリストには以下が含まれているべきです:

  • candidate_id、内部文字列キー
  • product_id、テキストとして保存
  • request_region
  • category_group
  • inclusion_reason
  • 公開応答の外に保持されたオプションの内部コスト、コンプライアンス、またはサプライヤーレビューのフィールド

コレクターに「最良の製品」を決定させてはいけません。名簿は、各候補が研究に入った理由を記録し、レビュアーが選択バイアスを特定できるようにします。

ステージ2:現在の製品スナップショットを収集

scraper.tiktok.shop.pageアクターはproduct_idおよびregionを受け入れます。応答には、製品の識別、解決された地域、販売者、名前、sold_count、ネストされた価格データ、製品在庫、評価、レビュー数、画像、オプション、SKU、カテゴリ、出荷詳細が含まれる可能性があります。

リサーチテーブルを構築する前に、収集タイムスタンプで生の応答を保存します。後のパーサーの変更は、変換された行が元のソースであったふりをせずに適用できます。

HTTPリクエストはJSONとx-api-tokenヘッダーを使用します。 HTTPセマンティクスはリクエスト-応答モデルを定義し、PythonのJSONモジュールのドキュメントは以下のシリアル化をカバーします。

Scrapelessでスクレイピングを始める

ScrapelessであなたのWebスクレイピングと自動化ワークフローを強化しましょう!
今日サインアップして**$5の無料クレジット**を獲得しましょう — クレジットカード不要

Scrapeless Dashboardで今すぐ無料クレジットを請求してください。

ステージ 3: 製品およびSKUリサーチテーブルの構築

製品行は現在の表示コンテキストを保持します:製品ID、返された地域、販売者ID、名称、カテゴリー、販売価格および元の価格、通貨、合計在庫、評価、レビュー数、販売数、および収集時間。

SKU行はバリアントコンテキストを保持します:製品ID、返された地域、SKU ID、オプションペア、SKUレベルの価格、利用可能な数量、在庫フラグ、および収集時間。

TikTok Shopのインベントリ検索インターフェースは、製品およびSKU識別子を区別し、2つのテーブルの必要性を強調しています。ISO通貨コード参照は、通貨コードがすべての数値価格とともに移動しなければならない理由を説明しています。

注: 以下のコードはSCRAPELESS_API_KEYにライブScrapeless APIトークンが必要で、product-watchlist.csvは読者によって提供されます。

python Copy
import csv
import json
import os
from datetime import datetime, timezone
from urllib.request import Request, urlopen

ENDPOINT = "https://api.scrapeless.com/api/v1/scraper/request"
TOKEN = os.environ["SCRAPELESS_API_KEY"]


def fetch_product(product_id, region):
    data = json.dumps({
        "actor": "scraper.tiktok.shop.page",
        "input": {"product_id": str(product_id), "region": region},
    }).encode()
    request = Request(
        ENDPOINT,
        data=data,
        headers={"x-api-token": TOKEN, "content-type": "application/json"},
        method="POST",
    )
    with urlopen(request, timeout=60) as response:
        return json.load(response)


with open("product-watchlist.csv", newline="", encoding="utf-8") as source:
    watchlist = list(csv.DictReader(source))

product_rows = []
sku_rows = []

for candidate in watchlist:
    raw = fetch_product(candidate["product_id"], candidate["request_region"])
    collected_at = datetime.now(timezone.utc).isoformat()
    product_id = str(raw.get("product_id") or candidate["product_id"])
    region = str(raw.get("region") or "")
    price = raw.get("price") or {}
    stock = raw.get("stock") or {}

    with open(f"{candidate['candidate_id']}-raw.json", "w", encoding="utf-8") as output:
        json.dump(raw, output, ensure_ascii=False, indent=2)

    product_rows.append({
        "candidate_id": candidate["candidate_id"],
        "category_group": candidate["category_group"],
        "collected_at": collected_at,
        "product_id": product_id,
        "region": region,
        "seller_id": str(raw.get("seller_id") or ""),
        "name": raw.get("name"),
        "currency": price.get("currency"),
        "sale_price": price.get("sale_price"),
        "original_price": price.get("original_price"),
        "available_quantity": stock.get("available_quantity"),
        "in_stock": stock.get("in_stock"),
        "rating": raw.get("rating"),
        "review_count": raw.get("review_count"),
        "sold_count": raw.get("sold_count"),
    })

    for sku in raw.get("skus") or []:
        sku_price = sku.get("price") or {}
        sku_rows.append({
            "candidate_id": candidate["candidate_id"],
            "product_id": product_id,
            "region": region,
            "sku_id": str(sku.get("sku_id") or ""),
            "options": " | ".join(
                f"{v.get('name', '')}={v.get('value', '')}"
                for v in (sku.get("options") or [])
            ),
            "currency": sku_price.get("currency"),
            "sale_price": sku_price.get("sale_price"),
            "available_quantity": sku.get("available_quantity"),
            "in_stock": sku.get("in_stock"),
            "collected_at": collected_at,
        })

for filename, rows in (("products.csv", product_rows), ("skus.csv", sku_rows)):
    if not rows:
        continue
    with open(filename, "w", newline="", encoding="utf-8") as output:
        writer = csv.DictWriter(output, fieldnames=rows[0].keys())
        writer.writeheader()
        writer.writerows(rows)

2つのエクスポートはそれぞれの詳細レベルを保持します。製品は1つの表示価格を持つことができますが、個別のSKUは独自の価格または在庫状況を表示します。

ステージ 4: ランキング前に比較ルールを適用

リサーチ質問がそれを支持する場合にのみ候補を比較します:

チェック 安全な取り扱い
カテゴリー 宣言されたカテゴリーグループ内で製品を比較します
地域 返された地域を使用し、クロスマーケットの可用性の主張を避けます
通貨 同じ通貨内でのみ生の価格を比較します
バリアントカバレッジ 任意の1つのSKUではなく、SKU数と価格範囲を報告します
評価の欠如 不明のまま保持します。ゼロに変換しないでください。
販売数 共有の最近ウィンドウなしで、累積的に見えるページフィールドとして保持します

sold_countは最近の速度、純売上、払い戻し、収益またはGMVを確立しません。2つの製品は異なる年齢と観察ウィンドウを持つ可能性があるため、より大きな値は強い現在の需要を証明しません。

ステージ 5: 製品リサーチワークシートを作成

最終的なワークシートは、人間の決定を支援すべきであり、スコアの背後に隠れてはいけません。以下を含めます:

  • 候補の識別と含まれる理由
  • 返された市場と通貨
  • 現在の製品価格とSKU価格範囲
  • 製品レベルおよびバリアントレベルの可用性カバレッジ
  • 評価とレビュー数と欠損値フラグ
  • スコープ警告付きの販売数フィールド
  • リサーチブリーフに必要な販売者、カテゴリー、および出荷フィールド
  • レビュアーの結論:進行、保持、拒否、証拠不十分

外部コスト、コミッション、マージン、供給者の信頼性、規制チェック、およびコンバージョンデータは、適切な第1者または内部ソースから結合する必要があります。Shopのスナップショットだけではその質問には答えられません。

製品リサーチを責任を持って取り扱う

プロジェクトに必要な公的な製品フィールドのみを保存します。内部の供給者またはレビューノートへのアクセスは制御し、ソースURLが十分な場合には製品画像をコピーしないようにします。NISTプライバシーフレームワークは、収集目的、アクセス、保存期間を定義するための一般的なガイダンスを提供します。

Scrapelessは、スクレイピングAPIを通じてShopスナップショットを提供しています。より大きなウォッチリストを収集する前に、現在の価格ページを確認してください。

結論: コレクターの外で決定を保持する

TikTok Shopの製品リサーチは、ウォッチリスト、カテゴリールール、および決定基準が明確な場合に最も効果を発揮します。アクターは現在の公的な製品およびSKU観察を提供し、リサーチワークシートは範囲、不確実性、および商業的決定の前にまだ欠けている証拠を保持します。

製品ウォッチリストを比較する準備はできましたか?

Scrapeless DiscordまたはTelegramコミュニティに参加して、製品テーブルのデザインについて議論しましょう。候補リストが準備できたら、Scrapeless Dashboardにアカウントを作成してください。

FAQ

Q: Shopアクターは自動的にトレンド製品を発見できますか?

Shopページアクターは既知の製品IDと地域を評価します。製品の発見とトレンドランキングには、別の候補ソースと方法論が必要です。

Q: TikTok Shopの製品比較にはどのフィールドが含まれますか?

比較には、返された地域、通貨、製品およびSKU価格、バリアントの可用性、評価、レビュー数、カテゴリー、販売者フィールド、存在する場合は出荷詳細が含まれます。

Q: 大きな販売数は最近の販売が強いことを証明しますか?
より多くの販売数は、文書化された応答が共通の最近の報告ウィンドウ、払い戻し、または完全な注文台帳を提供しないため、より強力な最近の販売を証明するものではありません。

Q: 足りない評価はゼロとして保存すべきですか?

足りない評価は不明のままであるべきです。ゼロは明確な値であり、フィルタリングやランキングを歪めることになります。

Q: プロキシや製品ページパーサーを管理する必要がありますか?

アクターはAPIリクエストの背後でそのコレクション表面を処理します。呼び出し元はウォッチリスト、比較ルール、ストレージ、レビュープロセスを定義します。

Q: 公共の製品データを収集することは合法ですか?

合法性は法管轄、マーケット、目的、アクセス方法、および適用可能な条件によって異なります。許可された目的のために公共のデータを使用し、意図されたワークフローについて法的助言を得てください。

Scrapelessでは、適用される法律、規制、およびWebサイトのプライバシーポリシーを厳密に遵守しながら、公開されているデータのみにアクセスします。 このブログのコンテンツは、デモンストレーションのみを目的としており、違法または侵害の活動は含まれません。 このブログまたはサードパーティのリンクからの情報の使用に対するすべての責任を保証せず、放棄します。 スクレイピング活動に従事する前に、法律顧問に相談し、ターゲットウェブサイトの利用規約を確認するか、必要な許可を取得してください。

最も人気のある記事

カタログ