跟踪 TikTok Shop SKU 可用性和库存变化
Lead Scraping Automation Engineer
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_id 和 region。结果可以包含解析后的 region、产品级别 stock、options 和 skus。每个 SKU 可以包括 sku_id、其选项对、嵌套价格数据、available_quantity、in_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_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。这使得选项标签或模式更改在之后可以进行审查。
第四阶段:谨慎分类库存变化
有效的可用性事件比较相同的产品 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 Discord 或 Telegram 社区 讨论变体历史架构。当产品观察列表准备就绪时,请在 Scrapeless Dashboard 创建账户。
常见问题
问:TikTok Shop 库存跟踪器应该监测什么?
TikTok Shop 库存跟踪器应保留产品级库存和单个 SKU 可用性作为独立观察。
问:缺失的 SKU 是否自动缺货?
缺失的 SKU 不会自动缺货。除非有效的当前响应明确确立不可用状态,否则标记它以供审查。
问:哪个关键标识可比较的 SKU 快照?
使用产品 ID、返回区域和 SKU ID。存储选项标签以备审查,而不是将其作为唯一的关键。
问:公共商店股票是否等于仓库库存?
公共商店库存不等于完整的仓库分类账。卖方端系统可能包含未在公共产品快照中显示的保留、承诺、位置和履行状态。
问:我需要管理代理或商店页面选择器吗?
主体在 API 请求后处理其集合表面。调用者管理观察列表、时间戳、存储、比较和通知。
问:监控公共 TikTok Shop 可用性是否合法?
合法性取决于管辖权、市场、目的、访问方式和适用条款。出于允许的目的使用公共数据,并为预期的工作流程获得法律建议。
在Scrapeless,我们仅访问公开可用的数据,并严格遵循适用的法律、法规和网站隐私政策。本博客中的内容仅供演示之用,不涉及任何非法或侵权活动。我们对使用本博客或第三方链接中的信息不做任何保证,并免除所有责任。在进行任何抓取活动之前,请咨询您的法律顾问,并审查目标网站的服务条款或获取必要的许可。


