监控 TikTok 商店评分和评论数量变化
Advanced Data Extraction Specialist
TL;DR:
- TikTok Shop 评级监控需要有时间戳的产品快照。 单个当前评级无法显示更改发生的时间。
- 评级和评论数应同时解读。 若评级变化但未观察到评论数增长,则需要不同的评论路径;而在有许多新评论后出现的评级变化则不然。
- 缺失的收集数据并不代表评级未变。 商店收集状态应与产品值分开记录。
- 异常标记是评论队列。 它并不能证明产品质量事件或识别更改的原因。
- 商店角色返回的是汇总评级字段,而非评论文本。 此工作流程无法进行评论情感分析。
- 免费开始。 新的 Scrapeless 账户包括通过 Scrapeless Dashboard 获得的免费额度。
介绍:评级在有历史时变得有用
TikTok Shop 产品页面在收集时显示汇总评级和评论数。一个快照描述当前页面;一系列快照可以揭示何时显示的信誉发生变化。
本教程构建了 TikTok Shop 评级监控,用于固定的产品观察列表。它收集公共 rating 和 review_count 字段,将有效观察存储在 SQLite 中,比较每个产品与其之前的快照,并将异常更改发送到人工审核。该工作流程跟踪汇总产品声誉,而不声称能够访问评论文本或情感。
竞争定价管道指南 显示了已知产品观察列表如何支持可重复的比较。
快速查看管道
| 阶段 | 动作 | 输出 |
|---|---|---|
| 观察 | 维护产品 ID 和地区对 | 产品观察列表 |
| 收集 | 请求每个公共产品页面 | 原始商店快照 |
| 规范化 | 解析评级和评论数 | 有效观察行 |
| 比较 | 将每行与其先前观察连接 | 评级变化事件 |
| 审核 | 标记异常更改并检查页面 | 分析师审核队列 |
此管道监控在公共产品快照中显示的值。它不提供评论正文、评论者资料或卖方诊断信息。
先决条件
- 一个来自 Scrapeless Dashboard 的 Scrapeless 账户和 API 密钥
- 一份已知公共 TikTok Shop 产品 ID 和地区的观察列表
- 一份收集计划和保存政策
- 在警报之前选择的评级变化和评论数阈值
SCRAPELESS_API_KEY、TIKTOK_SHOP_PRODUCT_ID和TIKTOK_SHOP_REGION作为收集示例
收集块是一个先决条件缺口,因为凭据和产品观察列表来自读取者。示例遵循提供的商店响应形状,并不显示虚构的 API 输出。
第 1 阶段:修复产品和地区键
使用已知的 product_id 和 region 调用 scraper.tiktok.shop.page。存储两个请求的值和返回的产品上下文。比较键应包含产品 ID 和地区,因为评级可能会在不同的市场表面上被观察。
不要使用产品标题作为主键。标题可能会变化,而字符串产品 ID 是提供给角色的持久引用。保持 ID 为文本格式,以便数据库转换时不会改变较长的标识符。
每次收集尝试还需要一个运行记录,包括开始时间、完成状态和错误详情。失败的请求应创建一行收集状态,而不抄送上一个评级。
第 2 阶段:谨慎解析评级和评论数
商店响应可以将 rating 作为数字返回,而 review_count 作为字符串。将评级解析为十进制值,将评论数解析为非负整数。Python 的 十进制文档 解释了用于评级比较的确切十进制表示。
在插入有效观察之前,应用以下规则:
| 字段 | 有效规则 | 无效处理 |
|---|---|---|
rating |
数字且在接受的产品规模范围内 | 存储原始负载;标记值为无效 |
review_count |
整数大于或等于零 | 存储原始负载;标记值为无效 |
product_id |
非空字符串 | 标记收集为无效 |
region |
非空规范化字符串 | 标记收集为无效 |
不要将缺失的评级转换为零。零是一个值;缺失是缺乏证据的状态。
开始使用 Scrapeless 抓取
使用 Scrapeless 提升您的网络抓取和自动化工作流程!
今天注册并获得 5 美元的免费额度 — 无需信用卡。
立即在 Scrapeless Dashboard 领取您的免费信用。
阶段 3:商店产品声誉快照
数据库将收集尝试与有效评级观察分开。SQLite 的 CREATE TABLE 文档 定义了示例中使用的约束。
注意:下面的代码需要读者提供实时
SCRAPELESS_API_KEY、TIKTOK_SHOP_PRODUCT_ID和TIKTOK_SHOP_REGION值。
python
import json
import os
import sqlite3
import uuid
from datetime import datetime, timezone
from decimal import Decimal, InvalidOperation
from urllib.request import Request, urlopen
ENDPOINT = "https://api.scrapeless.com/api/v1/scraper/request"
def utc_now():
return datetime.now(timezone.utc).isoformat()
def fetch_product(product_id, region):
body = json.dumps({
"actor": "scraper.tiktok.shop.page",
"input": {"product_id": str(product_id), "region": region},
}).encode()
request = Request(
ENDPOINT,
data=body,
headers={
"content-type": "application/json",
"x-api-token": os.environ["SCRAPELESS_API_KEY"],
},
method="POST",
)
with urlopen(request, timeout=60) as response:
return json.load(response)
def parse_rating(value):
try:
rating = Decimal(str(value))
except (InvalidOperation, TypeError, ValueError):
return None
return rating if Decimal("0") <= rating <= Decimal("5") else None
def parse_review_count(value):
try:
parsed = int(value)
except (TypeError, ValueError):
return None
return parsed if parsed >= 0 else None
database = sqlite3.connect("tiktok-shop-ratings.sqlite3")
database.executescript("""
CREATE TABLE IF NOT EXISTS collection_runs (
run_id TEXT PRIMARY KEY,
collected_at TEXT NOT NULL,
requested_product_id TEXT NOT NULL,
requested_region TEXT NOT NULL,
status TEXT NOT NULL,
detail TEXT
);
CREATE TABLE IF NOT EXISTS rating_snapshots (
run_id TEXT PRIMARY KEY,
collected_at TEXT NOT NULL,
product_id TEXT NOT NULL,
region TEXT NOT NULL,
rating TEXT NOT NULL,
review_count INTEGER NOT NULL,
raw_json TEXT NOT NULL
);
""")
run_id = str(uuid.uuid4())
collected_at = utc_now()
product_id = os.environ["TIKTOK_SHOP_PRODUCT_ID"]
region = os.environ["TIKTOK_SHOP_REGION"]
try:
raw = fetch_product(product_id, region)
rating = parse_rating(raw.get("rating"))
review_count = parse_review_count(raw.get("review_count"))
returned_product_id = str(raw.get("product_id") or product_id)
returned_region = str(raw.get("region") or region).casefold()
if rating is None or review_count is None:
raise ValueError("rating or review_count is missing or invalid")
database.execute(
"INSERT INTO rating_snapshots VALUES (?, ?, ?, ?, ?, ?, ?)",
(
run_id, collected_at, returned_product_id, returned_region,
str(rating), review_count, json.dumps(raw, ensure_ascii=False),
),
)
status, detail = "success", None
except Exception as error:
status, detail = "failed", f"{type(error).__name__}: {error}"
database.execute(
"INSERT INTO collection_runs VALUES (?, ?, ?, ?, ?, ?)",
(run_id, collected_at, product_id, region, status, detail),
)
database.commit()
database.close()
异常记录保留不确定性,而不会插入虚假的评级观察。监视过程能够在其质量队列中显现失败的运行。
阶段 4:将每个产品与其先前的有效快照进行比较
SQLite 窗口函数可以将每一条有效行与相同产品和区域的先前观察配对。窗口函数文档 定义了 LAG(),适用于此比较。
sql
-- Illustrative query over the schema created above.
WITH ordered AS (
SELECT
collected_at,
product_id,
region,
CAST(rating AS REAL) AS rating,
review_count,
LAG(CAST(rating AS REAL)) OVER (
PARTITION BY product_id, region ORDER BY collected_at
) AS prior_rating,
LAG(review_count) OVER (
PARTITION BY product_id, region ORDER BY collected_at
) AS prior_review_count
FROM rating_snapshots
)
SELECT
*,
rating - prior_rating AS rating_delta,
review_count - prior_review_count AS review_count_delta
FROM ordered
WHERE prior_rating IS NOT NULL;
只计算有效观察之间的变化。如果某次计划运行失败,保持这个差距可见,而不是声称评级在缺失的时间段内保持不变。
阶段 5:将异常变化发送到人工审核
警报规则可以结合绝对评级变化、审查数量增长和收集质量。在审核结果之前从团队的产品组合中选择阈值,然后版本化这些规则。
评级监测表应包括:
| 产品 | 区域 | 先前评级 | 当前评级 | 评级变化 | 新观察到的评论 | 状态 |
|---|---|---|---|---|---|---|
| 观察列表项目 | 市场密钥 | 先前有效值 | 当前有效值 | 差异 | 评论数量变化 | 正常或审核 |
在审核期间打开公共产品页面,检查产品身份、区域或显示值是否发生变化。将警报视为检查的提示。评级变化不能仅从聚合字段证明质量问题、活动影响、列表变化或审核事件。
Scrapeless 提供通过 Scraping API 访问商店。设置观察列表大小和收集频率之前,请查看 当前定价页面。
负责任地解释评级变化
仅收集监测目的所需的公共产品字段,限制原始负载访问,定义保留期。NIST 隐私框架 提供数据最小化和治理的一般控制。
不要将聚合评级变化标记为情感。此处使用的响应不包括评论文本,因此 TikTok 商店评级跟踪器可以在不解释为何发生变化的情况下,测量显示的评级和评论数量变化。
结论:保留变化和原因之间的区别
TikTok 商店评级监测在每次比较使用有效的、带时间戳的产品和地区快照时有效。记录评级与评论数量,保持失败的收集分开,并将异常变化发送到人工审核队列。输出显示公共列表发生了变化;它并不能确定变化的原因。
准备监测 TikTok 商店评级?
加入 Scrapeless Discord 或 Telegram 社区 讨论声誉快照模式。在产品观察列表准备好时,在 Scrapeless Dashboard 创建一个账户。
常见问题解答
问:一个团队如何跟踪 TikTok 商店产品评级?
一个团队可以通过收集固定产品和区域密钥的时间戳评级和评论数量快照来跟踪 TikTok 商店产品评级。
问:商店响应是否返回单独的评论文本?
此工作流中使用的商店响应返回聚合评级和评论数量,而不包括单独的评论文本。
问:评级监测能否进行情感分析?
评级监测不能进行评论情感分析,除非有评论文本或其他经过验证的情感承载字段。
问:评级下降警报证明了什么?
评级下降警报仅证明两个有效公共快照包含不同的聚合值;它并不能证明变化的原因。
问:失败的收集是否应该将最后的评级复制到前面?
失败的收集应该保留为质量差距,因为复制先前的值会将缺失的证据转变为未变化的观察。
问:团队需要管理 TikTok Shop 选择器吗?
Shop 角色通过 API 返回结构化的产品字段。调用者管理产品观察列表、日程、存储、异常规则和手动审核。
问:抓取公共 TikTok Shop 产品数据合法吗?
合法性取决于管辖区、市场、目的、访问方式、适用条款和收集的字段。出于允许的目的使用公共数据,并为预期的工作流程寻求法律建议。
在Scrapeless,我们仅访问公开可用的数据,并严格遵循适用的法律、法规和网站隐私政策。本博客中的内容仅供演示之用,不涉及任何非法或侵权活动。我们对使用本博客或第三方链接中的信息不做任何保证,并免除所有责任。在进行任何抓取活动之前,请咨询您的法律顾问,并审查目标网站的服务条款或获取必要的许可。



