返回博客

跟踪 TikTok Shop SKU 可用性和库存变化

Daniel Kim
Daniel Kim

Lead Scraping Automation Engineer

03-Sep-2026

TL;DR:

  • TikTok 商城库存跟踪应在 SKU 级别进行。 产品级别的库存和变体可用性回答不同的问题。
  • 库存事件需要两个有效的观察。 缺少字段和请求失败将保持未知状态,而不是变成缺货记录。
  • 比较键包括市场背景。 保持产品 ID、返回区域、SKU ID 和选项值在一起。
  • 新的、不可用的和缺失的 SKU 是不同的状态。 从一个响应中缺失的变体应进入审核,而不是被标记为停产。
  • 公共产品快照并不是仓库账簿。 它们不能取代卖方承诺、保留或履行的库存。
  • 免费开始。 新的 Scrapeless 账户通过 Scrapeless Dashboard 包括免费积分。

介绍:一个产品可以包含多种可用性状态

一个产品页面可能可用,而某个尺寸或颜色则不可用。仅监控总库存对象隐藏了买家可以选择的确切变体。

本教程扩展了 Scrapeless TikTok 商城演员返回的 skus 数组,为每个变体和观察存储一行,并生成缺货和补货事件。它还将缺失的字段、请求失败和暂时缺失的 SKU 排除在确定性的库存事件流之外。

TikTok 商城抓取器指南 解释了这里使用的产品和 SKU 响应层。

一目了然的管道

阶段 动作 输出
观察 提供产品 ID 和区域对 产品观察列表
获取 请求每个公共产品页面 原始产品快照
扩展 为每个 SKU 创建一行 变体快照表
比较 将每个 SKU 与其先前有效行连接 可用性变化
审核 分离缺失和未知记录 数据质量队列

管道报告面向买家的产品快照字段。它不是一个完整的仓库库存系统。

先决条件

  • 一个来自 Scrapeless Dashboard 的 Scrapeless 账户和 API 令牌
  • 带标准库和 SQLite 的 Python 3
  • 一份已知的公共 TikTok 商城产品 ID 和区域的观察列表
  • 一份定义好的观察时间表和审核政策
  • 一个用于 API 示例的实时 SCRAPELESS_API_KEY

收集块是一个先决条件缺口,因为凭证和真实观察列表由读者提供。规范化规则遵循记录的商店响应,而不提供虚构的实时输出。

阶段 1:请求已知产品于固定区域

使用 scraper.tiktok.shop.page 调用 product_idregion。结果可以包含解析后的 region、产品级别 stockoptionsskus。每个 SKU 可以包括 sku_id、其选项对、嵌套价格数据、available_quantityin_stock 和图像 URL。

保留返回的区域,即使它与请求的大小写不同。区域属于每个比较键,因为产品可用性可能因市场而异。

TikTok 商城的 官方库存搜索文档 将产品 ID 和 SKU ID 查询分开。这一区别同样应体现在公共快照模型中。

阶段 2:分别扩展产品和 SKU 库存

产品级别的库存对象可以包括 SKU 数量、可用总量和现货标志。这些字段总结了产品响应。它们不应覆盖变体行。

一个规范化的 SKU 行应包含:

字段 目的
collected_at 标识观察
product_id 将变体与其产品链接
region 防止跨市场比较
sku_id 稳定的变体比较键
option_signature 可读的人类颜色、尺寸或其他选项对
available_quantity 返回的该 SKU 的数量,允许为空
in_stock 返回的可用性标志,允许为空
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_IDTIKTOK_SHOP_REGION

python Copy
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。这使得选项标签或模式更改在之后可以进行审查。

第四阶段:谨慎分类库存变化

有效的可用性事件比较相同的产品 ID、返回区域和 SKU ID,基于两个成功的观察结果。

先前状态 当前状态 事件
true false out_of_stock
false true back_in_stock
数量变化,标志相等 数量变化 quantity_changed
无先前行 现在可用 new_sku_observed
之前存在,现在缺失 未返回 sku_absent_review
有效的先前行,请求失败 不明 collection_gap

不要将 sku_absent_review 从一次观察变为停产库存。产品选项可以改变,字段可以缺失,而失败的请求不包含有效的可用性证明。

TikTok Shop 用可用、已承诺和活动锁定的库存等数量文档化卖方端的库存变化事件,详见其 库存网页钩子规范。这些卖方端的维度与此处使用的公共商店页面快照不同。

第五阶段:生成可用性报告

报告应包括产品名称、区域、SKU ID、选项签名、先前和当前观察时间、先前和当前标志、先前和当前数量以及事件类型。将集合间隙保留在单独的质量部分中。

将输出分成三个队列:

  • 确认的可用性变化
  • 新观察到或暂时缺失的变体
  • 需要审查的缺失字段和失败的集合

这种分离防止运营团队对收集者未观察到的值采取行动。

以负责任的方式处理产品数据

仅收集库存决策所需的产品和 SKU 字段。当存储源 URL 足够时,避免重复产品媒体,并限制对内部观察列表或警报阈值的访问。 NIST 隐私框架 提供有关数据最小化和保留的一般控制。

Scrapeless 通过 Scraping API 提供商店主体。在设置观察列表大小和计划之前,请查看 当前定价页面

结论:在事件模型中保留不确定性

当产品库存和 SKU 可用性保持分开时,TikTok Shop 库存跟踪才会可靠。比较有效快照中的确切变体键,将缺失数据保留为未知,并在声明库存事件之前将缺失的 SKU 路由以供审查。

准备跟踪 TikTok Shop 变体吗?

加入 Scrapeless DiscordTelegram 社区 讨论变体历史架构。当产品观察列表准备就绪时,请在 Scrapeless Dashboard 创建账户。

常见问题

问:TikTok Shop 库存跟踪器应该监测什么?

TikTok Shop 库存跟踪器应保留产品级库存和单个 SKU 可用性作为独立观察。

问:缺失的 SKU 是否自动缺货?

缺失的 SKU 不会自动缺货。除非有效的当前响应明确确立不可用状态,否则标记它以供审查。

问:哪个关键标识可比较的 SKU 快照?

使用产品 ID、返回区域和 SKU ID。存储选项标签以备审查,而不是将其作为唯一的关键。

问:公共商店股票是否等于仓库库存?

公共商店库存不等于完整的仓库分类账。卖方端系统可能包含未在公共产品快照中显示的保留、承诺、位置和履行状态。

问:我需要管理代理或商店页面选择器吗?

主体在 API 请求后处理其集合表面。调用者管理观察列表、时间戳、存储、比较和通知。

问:监控公共 TikTok Shop 可用性是否合法?
合法性取决于管辖权、市场、目的、访问方式和适用条款。出于允许的目的使用公共数据,并为预期的工作流程获得法律建议。

在Scrapeless,我们仅访问公开可用的数据,并严格遵循适用的法律、法规和网站隐私政策。本博客中的内容仅供演示之用,不涉及任何非法或侵权活动。我们对使用本博客或第三方链接中的信息不做任何保证,并免除所有责任。在进行任何抓取活动之前,请咨询您的法律顾问,并审查目标网站的服务条款或获取必要的许可。

最受欢迎的文章

目录