TikTok Shop 爬虫指南:产品数据、价格和 SKU
Advanced Data Extraction Specialist
TL;DR:
- TikTok商店爬虫从已知产品开始。 将
product_id和region发送到scraper.tiktok.shop.page。 - 产品和变体记录需要不同的表。 产品级别的价格、库存、卖家和运费不应覆盖SKU级别的选项和可用性。
- 区域和货币在每个观察中都需要。 返回的区域代表解析的页面,而货币赋予价格意义。
- 销售标签有限制。 保留如返回的
sold_count;不要将其重新解释为GMV、订单账本或选择周期内的销售。 - 快照支持监控。 执行者返回产品数据;调度和历史记录由调用应用程序构建。
- 免费开始。 新的Scrapeless账户通过Scrapeless Dashboard包含免费积分。
引言:在构建数据前建模产品
TikTok商店产品页面结合了几种数据:产品身份、卖家身份、显示的价格、总库存、可选选项、SKU、图像、评级、评论、类别和运输细节。将所有这些数据压缩成一行在产品有多个变体或某个区域缺少字段时是可行的。
Scrapeless TikTok商店爬虫根据已知的产品ID和区域返回结构化的产品响应。本指南展示了请求,映射字段,并为产品和SKU记录构建干净的Python规范化器。有关受管数据执行者使用的常见请求封装,请阅读发布的Scrapeless数据执行者指南。
TikTok商店爬虫返回的内容
scraper.tiktok.shop.page执行者旨在进行产品详细信息查询。它可以返回:
- 产品ID、名称、区域、卖家和销售数量
- 显示价格和货币
- 总库存
- 评级和评论数量
- 产品图像
- 选项定义和SKU记录
- SKU可用性
- 卖家详细信息、类别和运输信息
该响应描述了在收集时请求的公共产品页面。它不是完整的目录导出、结账结果、订单历史或自动价格历史。
TikTok自己的商业文档在产品API概述中将产品与SKU区分开来。该区分也是获取产品页面记录的正确数据库边界:一个产品可以拥有多个可销售的变体。
请求参数
端点是POST https://api.scrapeless.com/api/v1/scraper/request,通过x-api-token进行身份验证。
主体有两个必填输入:
| 参数 | 类型 | 目的 |
|---|---|---|
product_id |
字符串 | 标识商店产品页面 |
region |
字符串 | 选择请求的市场上下文 |
文档显示的区域示例有GB、SG、JP和US。不要将该短示例集视为完整的市场目录。确认产品工作流所需的市场,并保留结果中返回的区域。
完整的输入和输出示例在TikTok商店页面执行者文档中。
先决条件
- 从Scrapeless Dashboard获得Scrapeless账户和API令牌
- 已知的公共TikTok商店产品ID
- 研究任务所需的市场区域
- 可以分别存储产品和SKU快照的存储架构
该代码在SCRAPELESS_API_KEY中需要一个有效的令牌,并在TIKTOK_SHOP_PRODUCT_ID中需要一个真实的产品ID。
使用curl快速捕获
bash
curl --request POST 'https://api.scrapeless.com/api/v1/scraper/request' \
--header "x-api-token: ${SCRAPELESS_API_KEY}" \
--header 'content-type: application/json' \
--data "{\"actor\":\"scraper.tiktok.shop.page\",\"input\":{\"product_id\":\"${TIKTOK_SHOP_PRODUCT_ID}\",\"region\":\"GB\"}}"
响应为JSON。注册的application/json类型在IANA的媒体类型注册表中维护,因此标准HTTP客户端可以解析主体,而无需特定于站点的解码器。
在Python中规范化产品和SKU数据
下面的规范化器保留原始响应,创建一个产品记录,并为每个SKU发出一行。它故意避免假设每个可选字段都存在。
python
import json
import os
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 = {
"actor": "scraper.tiktok.shop.page",
"input": {"product_id": str(product_id), "region": region},
}
request = Request(
ENDPOINT,
data=json.dumps(payload).encode(),
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)
def normalize(raw):
observed_at = datetime.now(timezone.utc).isoformat()
product_id = str(raw.get("product_id", ""))
product = {
"observed_at": observed_at,
"product_id": product_id,
"region": raw.get("region"),
"name": raw.get("name"),
"seller": raw.get("seller"),
"price": raw.get("price"),
"currency": raw.get("currency"),
"stock": raw.get("stock"),
"sold_count": raw.get("sold_count"),
"rating": raw.get("rating"),
"review_count": raw.get("review_count"),
}
sku_rows = []
for sku in raw.get("skus") or []:
sku_rows.append({
"observed_at": observed_at,
"product_id": product_id,
"region": raw.get("region"),
"sku_id": str(sku.get("sku_id") or sku.get("id") or ""),
"options": sku.get("options"),
"availability": sku.get("availability"),
"price": sku.get("price"),
"currency": sku.get("currency") or raw.get("currency"),
})
return product, sku_rows
raw_product = fetch_product(os.environ["TIKTOK_SHOP_PRODUCT_ID"], "GB")
product_row, sku_rows = normalize(raw_product)
print(json.dumps({"product": product_row, "skus": sku_rows}, indent=2))
使用Scrapeless开始抓取
用Scrapeless提升你的网页抓取和自动化工作流程!
今天注册并获得5美元的免费积分— 无需信用卡。立即在Scrapeless Dashboard领取你的免费积分。
如何读取产品字段
身份和卖家
存储 product_id 作为字符串。将卖家对象或卖家标识符与产品快照一起保存,因为仅有一个名称可能不是一个持久的连接键。
价格和货币
没有货币和地区的价格是不完整的。完全保留其返回值,然后仅在单独的字段中规范化其数字表示。 ISO 货币代码参考 解释了为什么货币标识符应与货币值并列。
库存和可用性
产品级库存是一个汇总视图。SKU 可用性描述了特定选项组合。 TikTok Shop 的 库存文档 也将产品和 SKU 识别为独立的库存维度。保留这两个级别,并避免用产品汇总替换缺失的 SKU 字段。
销售数量、评级和评论
保留 sold_count,评级和评论数量作为观察到的标签。产品页面的销售数量并不建立报告窗口,也不暴露订单账本。评级和评论数量描述当前页面响应,而不是单个评论的文本。
选项和SKU
选项描述如颜色或尺寸等维度;SKU 记录在页面显示时表示具体组合。将原始选项结构与规范化标签并排存储,以便新引入的选项不会破坏旧行。
构建快照准备就绪的架构
一个实用的模型使用三个存储:
| 存储 | 关键字段 | 原因 |
|---|---|---|
| 原始响应 | 集合 ID、观察时间、产品 ID、地区 | 支持后期重新处理 |
| 产品快照 | 观察时间、产品 ID、地区、价格、货币、库存 | 支持产品级比较 |
| SKU 快照 | 观察时间、产品 ID、SKU ID、选项、可用性 | 支持变体级比较 |
缺失和零是不同的。零库存是一个值;缺失的库存是未知的。在数据库、分析作业和警报规则中保持这种区分。
Scrapeless 通过 Scraping API 提供此参与者。在确定产品集和集合节奏时,请使用 当前定价页面。
常见问题以防止
- 发送数字产品 ID。 通过配置、请求和存储将标识符保持为字符串。
- 请求后丢弃地区。 地区是观察的一部分,应包含在每个规范化行中。
- 假设每个产品都有 SKU。 当没有 SKU 数组时,使用空列表。
- 将缺失的可用性转变为零。 在源提供确定状态之前,保留 null 或缺失。
- 将销售数量称为收入。 该字段不是价格乘以订单的账本,不应作为 GMV 使用。
结论:保留产品层次结构
一个可靠的 TikTok Shop 抓取器从一个已知的产品 ID 和地区开始,然后将产品和 SKU 数据保持在其自然层次。这个结构使一次性研究现在更有用,并为以后进行时间戳比较留出空间。
准备好构建您的 TikTok Shop 数据集?
在 Scrapeless Discord 或 Telegram 社区 讨论架构。当您的产品列表和地区规则准备好时,请打开 Scrapeless Dashboard。
常见问题
问:TikTok Shop 抓取器收集什么?
这里覆盖的参与者收集已知公共产品页面的产品、卖家、价格、货币、库存、评级、评论数量、图片、选项、SKU、类别和运输字段(如果可用)。
问:如何使用 Python 抓取 TikTok Shop 产品?
向 Scrapeless Scraper API 发送 JSON POST 请求,包含参与者 scraper.tiktok.shop.page,以及输入对象中的 product_id 和 region。
问:该参与者能发现商店中的每个产品吗?
不行。此产品页面参与者期望已知的产品 ID;不应将其描述为完整的目录发现 API。
问:响应中包含产品变体吗?
它可以包含选项和带有可用性的 SKU 记录。将这些记录与产品级字段分开。
问:该参与者会自动跟踪价格吗?
不会。它返回一个快照。您的应用程序安排调用、存储时间戳、比较快照并发送任何警报。
问:抓取 TikTok Shop 数据是否合法?
合法性取决于市场、目的、数据、访问方法和适用条款。出于允许的目的收集公共产品数据,并确认适用地区的义务。
问:我需要管理代理或页面防御解析器吗?
受管理的角色处理收集表面。你的代码提供有效的产品上下文并处理结构化响应。
问:这可以在没有 AI 代理的情况下运行吗?
可以。该示例使用普通的 HTTP 请求,并不依赖于代理。
在Scrapeless,我们仅访问公开可用的数据,并严格遵循适用的法律、法规和网站隐私政策。本博客中的内容仅供演示之用,不涉及任何非法或侵权活动。我们对使用本博客或第三方链接中的信息不做任何保证,并免除所有责任。在进行任何抓取活动之前,请咨询您的法律顾问,并审查目标网站的服务条款或获取必要的许可。



