返回博客

如何使用 Python 抓取 TikTok 帖子和视频指标

Alex Johnson
Alex Johnson

Senior Web Scraping Engineer

02-Sep-2026

TL;DR:

  • 一个 TikTok 视频抓取程序以已知的公共账户开始。 使用 scraper.tiktok.user.detail 解析用户名,然后将其 sec_uid 传递给 scraper.tiktok.user.work
  • 帖子响应是一个有限的样本。 记录的请求接受 cursorcount,但一个响应不应被描述为创建者的完整帖子历史。
  • 公共帖子指标需要上下文。 在播放、点赞、评论、分享、收藏和转发计数旁边存储收集时间,因为这些值可能会变化。
  • 照片帖子和可选字段需要宽容解析。 有效项可能会有空白的媒体或字幕字段,帖子类型应来自返回的记录而不是假设。
  • 稳定的导出将标识符保留为字符串。 保留原始 JSON 并为分析编写标准化的 CSV。
  • 免费开始。 新的 Scrapeless 账户包括免费信用;在 Scrapeless 仪表板中创建一个账户。

介绍:帖子列表是一个带时间戳的样本

创作者的公共动态混合了标识符、标题、媒体元数据、标签、音乐和累计参与计数。将该动态转换为有用的表格需要两个 API 调用和少量小心的标准化。

本指南构建了一个针对已知账号的 TikTok 视频抓取程序。它解析该账户的 sec_uid,请求有限数量的公共帖子,并为每个项目写入一行 CSV。该工作流不会将第一次响应标记为完整档案,也不会将公共播放计数视为唯一到达。

有关可用的个人资料、帖子和商店代理的地图,请阅读 TikTok 抓取程序 API 指南

您可以从已知账户收集的内容

scraper.tiktok.user.work 代理返回一个 items 数组,用于提供的 sec_uid。帖子项可以包含其 ID 和 URL、描述、贴纸文本、创建时间、公共参与计数、媒体详细信息、标签、语言、置顶和广告标志、音乐、字幕、权限和个人资料上下文。

该形状支持几种实用的输出:

  • 选定公共账户的帖子清单
  • 描述、标签、日期和帖子 URL 的表格
  • 一个时间点的参与快照
  • 置顶、促销或与电子商务相关帖子的审查队列
  • 一个用于后续内容分类的干净输入表

该代理不记录评论文本、观众人口统计、关注者列表、独特观众、转化或收入归因。这些字段不应作为推断替代出现在标准化输出中。

为什么使用 TikTok 抓取程序 API

一个管理代理从稳定的 HTTP 请求中返回结构化的 JSON。调用者使用命名字段而不是维护渲染页面的选择器,处理媒体特定的布局,或将每个视觉变化转换为解析器更新。

请求仍然需要明确的范围。TikTok 帖子抓取程序应从用户选择的账户开始,记录样本收集的时间,并保留足够的源上下文以审核每一行。HTTP 交换遵循 RFC 9110 定义的语义,而 Python 的 JSON 文档 描述了下面使用的序列化。

先决条件

  • 一个 Scrapeless 账户和来自 Scrapeless 仪表板 的 API 令牌
  • Python 3 及其标准库
  • 要检查的账户的公共用户名
  • 一个允许的目的,一个定义的样本大小,以及一个保留政策
  • 一个用于下面代码块的实时 API 令牌;导出为 SCRAPELESS_API_KEY

这些示例被标记为先决条件缺口,因为此文章中没有嵌入 API 令牌。它们是完整的请求路径,但读者必须提供自己的凭据和目标用户名。

TikTok 帖子抓取程序的工作原理

该工作流使用一个端点和两个代理:

POST https://api.scrapeless.com/api/v1/scraper/request

  1. unique_id 发送到 scraper.tiktok.user.detail
  2. 从个人资料响应中读取 sec_uid
  3. 将该值发送到 scraper.tiktok.user.work,并使用有限的 count
  4. 在不发明缺失字段的情况下标准化返回的 items

TikTok 的官方开发者文档还将账户授权的视频列表分离为专门的视频列表操作,这也提醒我们身份解析和内容检索是不同的步骤。请参见 TikTok 的列表视频文档 以获取该第一方接口。

请求参数

资料演员需要unique_id,不带前导@。其响应可以包含account_idunique_idsec_uid,以及公共资料字段和统计信息。

帖子演员需要sec_uid。它还接受cursor作为字符串以及count作为正整数。文档中的默认值是"0"35。文档确认了游标输入,但显示的响应并未建立通用的继续字段或完整历史保证。

使用 curl 快速捕捉

此第一个请求解决了帖子演员所需的帐户标识符。

注:下面的代码需要一个有效的 Scrapeless API 令牌位于 SCRAPELESS_API_KEY 和一个由读者选择的公共用户名。

bash Copy
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.user.detail",
    "input": {"unique_id": "tiktok"}
  }'

将返回的 sec_uid 复制到 scraper.tiktok.user.work 请求中,或让 Python 程序执行这两个调用。

响应信封

帖子响应包含 items 数组。将每个元素视为一个观察到的公共帖子记录。在构建表时,以下分组非常有用:

组别 示例字段 规范化规则
身份 帖子 ID,帖子 URL 将 ID 作为字符串存储并保留源 URL
内容 描述、贴纸文本、标签、语言 保留空文本和空列表
时间 创建日期 保留源值并添加单独的收集时间
互动 播放、喜欢、评论、分享、收藏、转发计数 记录为快照,而不是唯一的触达
格式 媒体、照片或视频详情、字幕 允许空白并检查返回的项目
标志 置顶、广告、电子商务视频 保留布尔值而不分配意图

开始使用 Scrapeless 抓取

使用 Scrapeless 提升您的网络抓取和自动化工作流程!
今天注册并获得 5 美元的免费积分无需信用卡

立即在 Scrapeless Dashboard 领取您的免费积分。

在 Python 中集成 API

下面的程序解决了资料,收集最多 20 个来自初始文档游标的项目,保存原始响应,并导出一个紧凑的指标表。Python 的 CSV 模块文档 解释了用于规范化文件的写入方式。

注:下面的代码需要一个有效的 Scrapeless API 令牌位于 SCRAPELESS_API_KEY;没有该外部凭证,请求部分无法执行。

python Copy
import csv
import json
import os
from datetime import datetime, timezone
from urllib.request import Request, urlopen

ENDPOINT = "https://api.scrapeless.com/api/v1/scraper/request"
TOKEN = os.environ["SCRAPELESS_API_KEY"]
USERNAME = os.environ.get("TIKTOK_USERNAME", "tiktok").lstrip("@")


def run_actor(actor, actor_input):
    payload = json.dumps({"actor": actor, "input": actor_input}).encode()
    request = Request(
        ENDPOINT,
        data=payload,
        headers={
            "x-api-token": TOKEN,
            "content-type": "application/json",
        },
        method="POST",
    )
    with urlopen(request, timeout=60) as response:
        return json.load(response)


profile = run_actor(
    "scraper.tiktok.user.detail",
    {"unique_id": USERNAME},
)

posts = run_actor(
    "scraper.tiktok.user.work",
    {"sec_uid": profile["sec_uid"], "cursor": "0", "count": 20},
)

collected_at = datetime.now(timezone.utc).isoformat()
items = posts.get("items") or []

with open("tiktok-posts-raw.json", "w", encoding="utf-8") as raw_file:
    json.dump(posts, raw_file, ensure_ascii=False, indent=2)

fieldnames = [
    "collected_at",
    "account_unique_id",
    "post_id",
    "post_url",
    "description",
    "created_at",
    "play_count",
    "like_count",
    "comment_count",
    "share_count",
    "collect_count",
    "repost_count",
    "is_pinned",
    "hashtags",
]

with open("tiktok-post-metrics.csv", "w", newline="", encoding="utf-8") as csv_file:
    writer = csv.DictWriter(csv_file, fieldnames=fieldnames)
    writer.writeheader()
    for item in items:
        writer.writerow({
            "collected_at": collected_at,
            "account_unique_id": profile.get("unique_id", USERNAME),
            "post_id": str(item.get("id") or item.get("post_id") or ""),
            "post_url": item.get("url") or item.get("post_url") or "",
            "description": item.get("description") or "",
            "created_at": item.get("create_time") or item.get("date") or "",
            "play_count": item.get("play_count"),
            "like_count": item.get("like_count"),
            "comment_count": item.get("comment_count"),
            "share_count": item.get("share_count"),
            "collect_count": item.get("collect_count"),
            "repost_count": item.get("repost_count"),
            "is_pinned": item.get("is_pinned"),
            "hashtags": "|".join(
                str(tag.get("name", tag)) if isinstance(tag, dict) else str(tag)
                for tag in (item.get("hashtags") or [])
            ),
        })

print(f"Saved {len(items)} sampled post records for @{USERNAME}")

规范器中的备用字段名称防止一个可选键导致导出崩溃。在修复生产模式之前,将它们与当前演员的响应进行比较,并保留原始 JSON,以便后续可以修订转换。

解读照片帖子、固定标志和空字段

空的视频 URL 并不能证明收集失败。TikTok 支持超出传统视频对象的内容格式,并且可选的媒体、音乐或字幕字段在有效响应中可能为空。根据返回的结构基于格式标签,并在证据不完整时保留 unknown 状态。

固定标志描述了在收集时资料上的位置。它并未确定创作者何时固定帖子、为何固定或在快照后是否保持固定。

同样的原则适用于公共指标。播放计数是一个与帖子一起暴露的累积平台计数器;它不是唯一人数的计数。喜欢、评论、分享、收藏和转发描述的是可见的互动,而不是活动归因。

谨慎处理游标和采样范围

文档请求接受 cursor,但可用的响应示例并未确认一个可以复制到每个客户端的单一分页规则。除非实时响应和当前文档提供经过验证的继续值,否则使用第一个响应作为有限样本。

记录请求游标、请求计数、返回项目计数和收集时间,放在输出旁边。这四个字段使范围可见。它们还防止仪表盘将“观察到的 20 个帖子”变为“所有帖子”,通过未标记的总计。

防止常见问题

  • unique_id 传递给帖子演员。 首先解决资料并使用其 sec_uid
  • 将长 ID 转换为数字。 将帐户和帖子标识符保持为字符串。
  • 将缺失视为零。 一个空的可选指标或媒体字段应该保持未知,直到其含义明确。
  • 将第一个响应称为完整历史。 将其标记为带有其游标、请求计数和收集时间的样本。
  • 丢弃源 URL。 帖子 URL 为审阅者提供了一条直接返回观察到的公共项目的路径。
  • 混合累积计数和区间增长。 单个快照提供级别;需要重复的时间戳快照来获取增量。

Scrapeless在Scraping API下打包演员。在设置生产收集日程之前,请查看当前定价页面

结论:在分析之前保存样本

一个可靠的TikTok视频抓取器解决已知账户,请求限定的帖子样本,并在扁平化之前保存响应。有效的输出不仅仅是一个指标CSV:它包括稳定的字符串标识符、来源URL、收集时间戳、原始JSON和对范围的诚实声明。

准备收集公共TikTok帖子指标了吗?

加入Scrapeless DiscordTelegram社区以比较实施笔记。当您准备好测试工作流程时,在Scrapeless Dashboard创建一个账户。

常见问题解答

问:什么是TikTok视频抓取器?

TikTok视频抓取器收集支持的公共帖子字段并以结构化形式返回。在本指南中的工作流程使用个人资料演员来解析sec_uid,并使用帖子演员返回items样本。

问:TikTok帖子抓取器能获取一个账户的每个帖子吗?

一个演员的响应不应被描述为每个帖子。请求文档包括cursorcount,但完整覆盖依赖于经过验证的继续规则、账户的可访问公共内容以及在预期范围内成功的收集。

问:哪些TikTok视频指标可以获取?

帖子项目可以包括公共播放、喜欢、评论、分享、收集和转发计数。这些是特定时刻的计数器,不代表独特的覆盖、销售或活动归因。

问:如何处理照片帖子?

照片帖子应从返回项目中存在的字段进行解析。保持媒体字段可为null,并且避免仅仅因为常规视频字段为空而声明抓取失败。

问:工作流程需要代理或浏览器解析器吗?

管理的演员在API请求后处理其收集表面。调用者提供有效的标识符,限制样本,验证响应并负责任地存储结果。

问:抓取公共TikTok帖子是合法吗?

合法性取决于管辖权、目的、数据、访问方式和适用条款。仅收集为允许使用所需的公共字段,最小化保留,并针对特定项目寻求法律建议。

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

最受欢迎的文章

目录