TikTokショップのSKUの在庫状況と在庫の変更を追跡する
Lead Scraping Automation Engineer
TL;DR:
- TikTok Shopの在庫追跡はSKUレベルで行います。 商品レベルの在庫とバリアントの可用性は異なる質問に対する回答です。
- 在庫イベントには二つの有効な観測が必要です。 欠落しているフィールドや失敗したリクエストは、不足の記録になるのではなく、未知のままとなります。
- 比較キーには市場のコンテキストが含まれます。 商品ID、返された地域、SKU ID、およびオプション値を一緒に保持します。
- 新しい、利用不可、欠如しているSKUは異なる状態です。 一つのレスポンスから欠落しているバリアントは、取りやめとしてマークされるのではなく、レビューに入るべきです。
- 公開商品スナップショットは倉庫台帳ではありません。 それらは売り手側の約束された、予約された、または履行の在庫を置き換えるものではありません。
- 無料で始められます。 新しいScrapelessアカウントにはScrapeless Dashboardを通じて無料クレジットが含まれています。
はじめに:一つの製品が多くの可用性状態を含むことができる
あるサイズや色が利用できない一方で、製品ページが利用可能である場合があります。集計在庫オブジェクトのみを監視すると、購入者が選択できる正確なバリアントを隠すことになります。
このチュートリアルでは、ScrapelessのTikTokショップアクターによって返されたskus配列を拡張し、各バリアントと観測ごとに1行を保存し、在庫切れや再入荷イベントを生成します。また、欠落しているフィールド、リクエストの失敗、一時的に欠如しているSKUは確定的な在庫イベントストリームから除外されます。
TikTok Shopスクレイパーガイドでは、ここで使用されている製品およびSKUレスポンスレイヤーについて説明しています。
パイプラインの概要
| ステージ | アクション | 出力 |
|---|---|---|
| 監視 | 商品IDと地域ペアを提供 | 商品ウォッチリスト |
| フェッチ | 各公開商品ページをリクエスト | 生の製品スナップショット |
| 拡張 | SKUごとに1行を作成 | バリアントスナップショットテーブル |
| 比較 | 各SKUを以前の有効な行に結合 | 可用性の変化 |
| レビュー | 欠如しているレコードと未知のレコードを分離 | データ品質キュー |
パイプラインは購入者向けの製品スナップショットフィールドを報告します。それは完全な倉庫在庫システムではありません。
前提条件
- Scrapeless DashboardからのScrapelessアカウントとAPIトークン
- 標準ライブラリとSQLiteを含むPython 3
- 知っている公開TikTok Shop商品IDと地域のウォッチリスト
- 定義された観測スケジュールとレビュー方針
- API例用のライブ
SCRAPELESS_API_KEY
コレクションブロックは、資格情報と実際のウォッチリストが読者によって提供されるため、前提条件のギャップとなります。正規化ルールは、創作されたライブ出力を提示することなく、文書化されたショップレスポンスに従います。
ステージ1:固定地域で既知の製品をリクエスト
scraper.tiktok.shop.pageをproduct_idおよびregionで呼び出します。結果には解決されたregion、商品レベルのstock、options、およびskusが含まれる可能性があります。各SKUにはsku_id、そのオプションペア、ネストされた価格データ、available_quantity、in_stock、および画像URLが含まれる場合があります。
リクエストと異なる大文字小文字であっても、返された地域を保持してください。地域はすべての比較キーに含まれるべきです。なぜなら、商品可用性は市場によって異なる可能性があるからです。
TikTok Shopの公式在庫検索ドキュメントは、商品IDとSKU IDのクエリを分けています。その区別も公開スナップショットモデルに含まれるべきです。
ステージ2:製品とSKUの在庫を別々に拡張
商品レベルの在庫オブジェクトには、SKU数、合計利用可能数量、および在庫フラグが含まれる可能性があります。これらのフィールドは商品レスポンスを要約します。バリアントの行を上書きしてはいけません。
一つの正規化されたSKU行には以下が含まれるべきです:
| フィールド | 目的 |
|---|---|
collected_at |
観測を識別します |
product_id |
バリアントをその商品にリンクします |
region |
クロスマーケット比較を防ぎます |
sku_id |
安定したバリアント比較キー |
option_signature |
人間が読みやすい色、サイズ、または他のオプションペア |
available_quantity |
そのSKUについて返された数量、nullable |
in_stock |
返された可用性フラグ、nullable |
collection_status |
成功と失敗のコレクションを分離します |
available_quantityが欠落している場合にin_stock = falseを導出してはいけません。レスポンスによって一方が十分な証拠なしに他方を推測できるため、両フィールドを保持します。
Scrapelessでスクレイピングを開始する
Scrapelessであなたのウェブスクレイピングと自動化ワークフローを強化しましょう!
今日サインアップして**$5の無料クレジット**を取得しましょう — クレジットカードは必要ありません。Scrapeless Dashboardで今すぐ無料クレジットを受け取ってください。
ステージ3:SQLiteにバリアントスナップショットを保存
アペンド専用のテーブルは、観測されたすべての状態を保存します。SQLiteのCREATE TABLE ドキュメントは、ここで使用されるプライマリキー制約を定義しています。
注意: 下記のコードには、
SCRAPELESS_API_KEYにライブのScrapeless APIトークンが必要です。また、TIKTOK_SHOP_PRODUCT_IDおよびTIKTOK_SHOP_REGIONは読者によって提供される必要があります。
python
import json
import os
import sqlite3
from datetime import datetime, timezone
from urllib.request import Request, urlopen
ENDPOINT = "https://api.scrapeless.com/api/v1/scraper/request"
def fetch_product(product_id, region):
payload = json.dumps({
"actor": "scraper.tiktok.shop.page",
"input": {"product_id": str(product_id), "region": region},
}).encode()
request = Request(
ENDPOINT,
data=payload,
headers={
"x-api-token": os.environ["SCRAPELESS_API_KEY"],
"content-type": "application/json",
},
method="POST",
)
with urlopen(request, timeout=60) as response:
return json.load(response)
raw = fetch_product(
os.environ["TIKTOK_SHOP_PRODUCT_ID"],
os.environ["TIKTOK_SHOP_REGION"],
)
collected_at = datetime.now(timezone.utc).isoformat()
product_id = str(raw.get("product_id") or "")
region = str(raw.get("region") or "")
database = sqlite3.connect("tiktok-shop-inventory.sqlite3")
database.execute("""
CREATE TABLE IF NOT EXISTS sku_snapshots (
collected_at TEXT NOT NULL,
product_id TEXT NOT NULL,
region TEXT NOT NULL,
sku_id TEXT NOT NULL,
option_signature TEXT,
available_quantity INTEGER,
in_stock INTEGER,
PRIMARY KEY (collected_at, product_id, region, sku_id)
)
""")
for sku in raw.get("skus") or []:
options = sku.get("options") or []
signature = " | ".join(
f"{option.get('name', '')}={option.get('value', '')}"
for option in options
)
database.execute(
"INSERT INTO sku_snapshots VALUES (?, ?, ?, ?, ?, ?, ?)",
(
collected_at, product_id, region, str(sku.get("sku_id") or ""),
signature, sku.get("available_quantity"), sku.get("in_stock"),
),
)
database.commit()
database.close()
with open("tiktok-shop-product-raw.json", "w", encoding="utf-8") as output:
json.dump(raw, output, ensure_ascii=False, indent=2)
識別子をテキストとして保存し、正規化されたテーブルの隣に生のJSONを保持します。これにより、オプションラベルやスキーマの変更を後で確認できます。
ステージ 4: 在庫の変化を慎重に分類する
有効な入手可能イベントは、同じ製品ID、返された地域、SKU IDを2つの成功した観測で比較します。
| 以前の状態 | 現在の状態 | イベント |
|---|---|---|
true |
false |
out_of_stock |
false |
true |
back_in_stock |
| 数量変更、フラグ同等 | 数量変更 | quantity_changed |
| 以前の行なし | 存在 | new_sku_observed |
| 以前は存在、現在は不在 | 返されていない | sku_absent_review |
| 有効な以前の行、要求失敗 | 不明 | collection_gap |
sku_absent_reviewを1つの観測から中止された在庫に変えてはいけません。製品オプションが変更される可能性があり、フィールドが欠落することもあり、要求が失敗した場合には有効な入手可能証拠が含まれません。
TikTok Shopは、数量を使用して、利用可能、コミット、キャンペーンロックされた在庫などの販売者側の在庫変更イベントを文書化しています。在庫Webhook仕様。これらの販売者側の次元は、ここで使用される公開のShopページのスナップショットとは異なります。
ステージ 5: 入手可能レポートを作成する
レポートには、製品名、地域、SKU ID、オプション署名、以前および現在の観測時刻、以前および現在のフラグ、以前および現在の数量、イベントタイプを含める必要があります。コレクションのギャップは別の品質セクションに保持してください。
出力を3つのキューにグループ化します:
- 確認された入手可能な変更
- 新たに観測されたまたは一時的に不在のバリアント
- レビューを必要とする欠落したフィールドと失敗したコレクション
この分離は、コレクターが観測したことのない値に基づいてオペレーションチームが行動するのを防ぎます。
製品データを責任を持って管理する
在庫の決定に必要な製品およびSKUフィールドのみを収集します。ソースURLを保存することが十分な場合は、製品メディアの重複を避け、内部のウォッチリストやアラートしきい値へのアクセスを制限します。NISTプライバシーフレームワークは、データの最小化と保持のための一般的な制御を提供します。
Scrapelessは、Scraping APIを通じてShopアクターを提供します。ウォッチリストのサイズとスケジュールを設定する前に、現在の料金ページを確認してください。
結論: イベントモデルにおける不確実性を保持する
TikTok Shopの在庫追跡は、製品在庫とSKUの入手可能性が別々に保持されるときに信頼性を持ちます。有効なスナップショット間で正確なバリアントキーを比較し、欠落したデータを不明として保存し、在庫イベントを宣言する前に不在のSKUをレビューに送ります。
TikTok Shopのバリアントを追跡する準備はできましたか?
TikTok Shop Variantsの議論に参加するには、Scrapeless DiscordまたはTelegramコミュニティに参加してください。製品ウォッチリストが準備できたら、Scrapeless Dashboardにアカウントを作成してください。
FAQ
Q: TikTok Shopの在庫トラッカーは何を監視するべきですか?
TikTok Shopの在庫トラッカーは、製品レベルの在庫と個々のSKUの入手可能性を別々の観測として保持すべきです。
Q: 欠落したSKUは自動的に在庫切れですか?
欠落したSKUは自動的に在庫切れではありません。有効な現在の応答が明示的に利用できない状態を確立するまで、レビューのためにマークします。
Q: 比較可能なSKUスナップショットを特定するキーは何ですか?
製品ID、返された地域、およびSKU IDを使用します。オプションラベルをレビューのために保存しますが、それを唯一のキーとして使用しません。
Q: 公開Shopの在庫は倉庫の在庫と同等ですか?
公開Shopの在庫は、完全な倉庫の台帳とは同等ではありません。販売者側のシステムは、公開の製品スナップショットによって公開されていない予約、コミット、場所、履行状態を含む可能性があります。
Q: プロキシやShopページのセレクターを管理する必要がありますか?
アクターはAPIリクエストの背後でその収集面を扱います。コーラーはウォッチリスト、タイムスタンプ、ストレージ、比較、および通知を管理します。
Q: 公開のTikTok Shopの入手可能性を監視することは合法ですか?
合法性は管轄、マーケット、目的、アクセス方法、適用される条件に依存します。許可された目的のために公開データを使用し、意図されたワークフローに対して法律的アドバイスを取得してください。
Scrapelessでは、適用される法律、規制、およびWebサイトのプライバシーポリシーを厳密に遵守しながら、公開されているデータのみにアクセスします。 このブログのコンテンツは、デモンストレーションのみを目的としており、違法または侵害の活動は含まれません。 このブログまたはサードパーティのリンクからの情報の使用に対するすべての責任を保証せず、放棄します。 スクレイピング活動に従事する前に、法律顧問に相談し、ターゲットウェブサイトの利用規約を確認するか、必要な許可を取得してください。


