jsonscraper
市场
返回期刊

如何发现互动度正在上升的 TikTok 视频,而不比较原始播放量

间隔一段时间采集同一批搜索结果中的视频指标,将增量与整体热度分开计算

编辑政策 报告错误

要了解某条 TikTok 视频是否获得更多互动,可以将其公开指标与它此前的快照进行比较。单次搜索只能显示已经累积的播放量和互动数据;再次采集同一批搜索结果中的视频,才能看出两次运行之间的变化。下面是一套精简可用的 Python 流水线:搜索、将指标保存为 CSV,并计算差值。

这种监测具体测量什么?

这套脚本适用于需要获取某个主题下搜索结果视频清单,并建立可核查观察记录的营销人员、分析师或开发者。例如,团队定期追踪有关产品发布或某个受众查询词的视频,希望了解哪些视频在上次检查后获得了更多播放、点赞、评论或转发。

文章:如何发现互动度正在上升的 TikTok 视频,而不比较原始播放量
概要:这套分步 Python 流水线会收集搜索结果中的 TikTok 视频,将播放量和互动数据保存为 CSV,并在下次运行时计算同一批视频的变化。
图片用途:封面——核心概念
章节:这种监测具体测量什么?
视觉主题:编辑风格照片:印有短视频匿名 ID 和两个时间戳的纸张
按视频 ID 对照同一条视频的两次指标快照。© jsonscraper · AI 生成

比较的关键单位是由 aweme_id 标识的视频。每条记录都会保存采集时间、ID、描述、URL、作者名称以及可用的计数器。随后按 ID 匹配两次快照。这样,某条视频的播放量增量就不会与另一条视频的累计播放量混在一起。

结果只描述特定运行中由特定搜索查询返回的视频。搜索结果可能变化,个别统计字段也可能缺失。因此,保存快照本身和采集时间很有帮助;报告应被视为对已找到视频的观察记录,而不是某主题下所有帖子的完整目录。

如何通过 API 采集数据?

TikTok Scraper API 文档介绍了 GET 路由 /searchVideo。搜索时必须提供 keyword 字符串;可选参数包括 count、region、sort_by 和 date_posted。API 密钥通过 license_key 传递。参考文档列出的基础地址为 https://tiktok.evelode.com。

响应包含外部状态和 tiktok 对象。搜索结果中的视频可能位于 tiktok.aweme_list,也可能位于 tiktok.search_item_list[].aweme_info。下面的处理程序支持这两种格式。指标从 statistics 中提取,包括 play_count、digg_count、comment_count 和 share_count;缺失的值会留空,而不会被替换为零。

路由参考文档列出了用于翻阅搜索结果的 cursor,并指出了 date_posted 和 sort_by 的可用选项。对于简单、可重复的监测,先获取一页结果并记录响应即可;只有确有需要时才添加分页。如果需要分页,请原样传递返回的游标,不要转换它。

可运行的 Python 示例

运行 python -m pip install requests 安装请求库,并将密钥设置在环境变量 JSONSCRAPER_TIKTOK_LICENSE_KEY 中。脚本接收一个搜索短语作为参数,并将找到的视频快照追加到同一个 CSV 文件。代码兼容 Python 3.8 及以上版本。

import csv
import os
import sys
from datetime import datetime, timezone
from pathlib import Path

import requests

BASE_URL = "https://tiktok.evelode.com/searchVideo"
CSV_PATH = Path("tiktok_video_snapshots.csv")
FIELDS = [
    "collected_at", "aweme_id", "author", "description", "share_url",
    "play_count", "digg_count", "comment_count", "share_count",
]


def extract_items(payload):
    """Support the observed search response layouts."""
    data = payload.get("tiktok") or {}
    items = data.get("aweme_list") or []
    if items:
        return items

    found = []
    for result in data.get("search_item_list") or []:
        info = result.get("aweme_info")
        if info:
            found.append(info)
    return found


def main():
    key = os.environ.get("JSONSCRAPER_TIKTOK_LICENSE_KEY")
    if not key:
        raise SystemExit("Set JSONSCRAPER_TIKTOK_LICENSE_KEY first")
    if len(sys.argv) < 2:
        raise SystemExit('Usage: python collect.py "search phrase"')

    params = {
        "license_key": key,
        "keyword": sys.argv[1],
        "count": 20,
        "region": "US",
        "sort_by": "relevance",
        "date_posted": "this-week",
    }
    response = requests.get(BASE_URL, params=params, timeout=30)
    response.raise_for_status()
    payload = response.json()

    if payload.get("status") != "ok":
        raise RuntimeError("API returned a non-ok outer status")
    data = payload.get("tiktok") or {}
    items = extract_items(payload)
    collected_at = datetime.now(timezone.utc).isoformat()

    rows = []
    for item in items:
        stats = item.get("statistics") or {}
        author = item.get("author") or {}
        rows.append({
            "collected_at": collected_at,
            "aweme_id": item.get("aweme_id"),
            "author": author.get("unique_id") or author.get("nickname"),
            "description": item.get("desc"),
            "share_url": item.get("share_url"),
            "play_count": stats.get("play_count"),
            "digg_count": stats.get("digg_count"),
            "comment_count": stats.get("comment_count"),
            "share_count": stats.get("share_count"),
        })

    write_header = not CSV_PATH.exists()
    with CSV_PATH.open("a", newline="", encoding="utf-8") as file:
        writer = csv.DictWriter(file, fieldnames=FIELDS)
        if write_header:
            writer.writeheader()
        writer.writerows(rows)

    print("Saved", len(rows), "returned videos")
    print("has_more:", data.get("has_more"), "cursor:", data.get("cursor"))


if __name__ == "__main__":
    main()

例如,运行 python collect.py "产品相关查询"。密钥由库作为 URL 参数传入;脚本不会在终端中输出密钥。不要将完整请求 URL 保存到公开日志中,因为其中包含密钥。在生产系统中,请使用密钥管理服务,并限制对快照文件的访问。

如何计算两次运行之间的增量?

脚本会有意保留所有观察记录,而不是覆盖先前的值。下面这个简短的分析器会匹配每条视频最近的两次快照,并输出各计数器的差值。如果某项指标在两条记录中的任一条缺失,结果就会标记为不可用。

文章:如何发现互动度正在上升的 TikTok 视频,而不比较原始播放量
概要:这套分步 Python 流水线会收集搜索结果中的 TikTok 视频,将播放量和互动数据保存为 CSV,并在下次运行时计算同一批视频的变化。
图片用途:辅助插图 2——另一个具体方面
章节:如何计算两次运行之间的增量?
视觉主题:俄语信息图,展示流程:TikTok 关键词搜索 → 返回的视频
从搜索结果到对照两次保存的快照的数据路径。© jsonscraper · AI 生成插图
import csv
from collections import defaultdict
from pathlib import Path

rows_by_video = defaultdict(list)
with Path("tiktok_video_snapshots.csv").open(encoding="utf-8", newline="") as file:
    for row in csv.DictReader(file):
        if row["aweme_id"]:
            rows_by_video[row["aweme_id"]].append(row)

metrics = ("play_count", "digg_count", "comment_count", "share_count")
for video_id, snapshots in rows_by_video.items():
    snapshots.sort(key=lambda row: row["collected_at"])
    if len(snapshots) < 2:
        continue
    previous, latest = snapshots[-2], snapshots[-1]
    changes = {}
    for metric in metrics:
        old, new = previous[metric], latest[metric]
        changes[metric] = int(new) - int(old) if old and new else None
    print(video_id, changes, latest["share_url"])

差值是两条已保存记录之间的差异,并不代表具有固定采样周期的增长速度。如果两次运行的间隔不同,请计算 collected_at 之间的时长,并按实际时间间隔比较增量。计数器可能会在两次观察之间发生变化;保存的时间戳会注明所用数值的采集时间。

如何自动化并解读报告?

要生成每日报告,可以将采集任务放到服务器或 CI 的任务计划程序中,设置固定的搜索短语列表,并保存 CSV 或将数据行写入数据库。如果重复运行后同一快照中出现重复项,请按 aweme_id 去重。为了保留历史记录,请将原始 JSON 与规范化后的列一起保存:如果报告结构发生变化,这样更容易重新处理数据。

表格中可以列出视频 ID 和 URL、作者、描述、采集时间,以及各项指标的增量。按播放量增量排序可以了解传播情况;评论或转发的增量则有助于识别另一种互动类型。除非明确规定计算方法,否则不要将这些指标合并成一个总评分:每个计数器的含义都不同。

任务计划程序可以将报告发送到电子邮件、表格或内部频道,但这一步由你的基础设施完成——上面的示例只负责采集和分析数据。若要采集得更完整,可以遍历结果页、保存游标,并在 API 表示没有后续页面时停止循环。搜索游标是响应中提供的不透明值;不要自行计算。即便遍历了所有页面,结果也只是 API 返回的搜索结果,并不保证涵盖所有符合条件的帖子。

实际预期成果是一份可重复生成的观察日志,以及一张列出已找到视频指标变化的表格。这有助于发现哪些帖子在两次检查之间的公开计数器发生了变化,并将具体链接交给相关人员进行内容分析。产品详情和 API 访问方式可在 TikTok Scraper API 页面查看。

安排定时运行前要检查什么?

  • 在处理 tiktok 对象之前,确认外部响应状态为 ok。
  • 检查搜索条目的两种结构;列表缺失时应得到空的采集结果,而不是报错。
  • 保留原始值和时间戳。缺失的指标应继续留空。
  • 使用相同的查询和参数,让快照对比更清晰;并在报告旁记录这些设置的变更。
  • 监控运行频率、HTTP 错误和历史记录大小,同时遵守适用的平台规则和数据处理要求。

总之,只要重复执行同一搜索、按 aweme_id 识别视频,并比较随时间保存的指标,就足以获得可观察的结果。这种方法回答了一个具体而有限的实际问题:哪些已找到的视频在两次检查之间改变了公开计数器?同时,它也保留了原始数据,供审计和后续处理使用。

人们

尚未列出本文的人员。

继续阅读如何分析 TikTok 创作者主题:Python 实用流程
阅读下一篇文章

将阅读内容转化为可用的集成

探索 jsonscraper 社交数据 API、测试请求并构建下一个工作流。

查看 API