
使用你自己已知的主页
Actor 是托管的数据采集程序。Task 是已保存的输入预设。TikTok Channel Scraper Actor 采集来源行。你决定哪些行可以用于你的工作。Actor 不会替你做这个决定。
当前的公开 Task 是 Bulk TikTok Profile Scraper。它保存的示例输入有两个公开 URL:
{
"startUrls": [
"https://www.tiktok.com/@mrbeast",
"https://www.tiktok.com/@nasa"
]
}把这些示例 URL 换成你自己已知的公开主页 URL。公开 Task 只是起始输入。它不能证明检查或决策会自动完成。
公开构建版本 0.1.27 已于 2026-10-13 完成检查。该检查日期不是行上的时间。`observedAt` 是来源行上的时间。判断一个值是否为当前值时,使用 `observedAt`。
只发送已知主页
输入字段是 `startUrls`。你可以发送 1 到 1,000 个已知主页 URL 或 handle。handle 是 @ 符号后面的公开名称。只发送你已经知道的主页。
此输入不会搜索用户。它不会发现国家。它不会采集帖子或评论。它不会获取私密联系方式。它不会登录。它不会绕过验证码或访问验证挑战。
重复的输入字符串只检查一次。一个结果行表示一个已尝试的主页。该行并不总是可用的主页。发送长列表之前,先运行一个目标主页。
先读取这些字段
在每一行上查看 `input`、`channelId`、`channelUrl`、`handle`、`status`、`statusReason`、`isBillable` 和 `observedAt`。`channelId` 是该主页的来源 id。`status` 是该次尝试的来源结果。当存在原因时,`statusReason` 说明该状态为何被设置。
可选字段可以包括 `followersCount`、`bioLink`、`description`、`detectedEmails` 和 `accountRegion`。当存在 `countPrecision` 时,它说明一个计数的质量。把它与该计数一起读取。不要忽略它。
`isBillable` 是一行上的计费数据。该数据说明这一行是否符合收费条件。符合条件表示这一行可以被收费。该数据不是实际收费的证明。计费收据才能证明一次收费。`isBillable` 不能证明该主页是谁。它不能证明每个字段都完整。`billableRows` 统计符合收费条件的行数。该计数不是付款证明。
在当前 schema 下保留每个来源状态。状态会改变你的下一步:
- `ok` 表示主页已返回。你仍需要匹配的身份和你要求的字段。可选字段仍可以为 null。
- `partial` 表示主页已返回,但该行不完整。在逐一检查每个必填字段之前,不要丢弃整行。
- `private` 表示私密部分仍然不可用。不要把该行当作公开的零值。
- `login_required` 表示来源要求登录。停止。此 Actor 不会登录。
- `not_found` 表示在这次检查中看不到该主页。它不说明何时或为何。它不能证明账号已被删除。
- `blocked` 表示来源访问被拦截。不要填充缺失字段。不要把这次拦截读成关注者数为零。
- `challenge` 表示来源显示了访问验证挑战。不要去解决它。
- `rate_limited` 表示来源限制了这次检查。保存该行。你可以计划以后做一次复查。不要循环重试。
- `parser_miss` 表示这次检查没有读到预期事实。不要编造这些事实。
- `invalid_input` 表示输入格式无效。只修正你能证明有误的格式。
- `failed` 表示这次尝试因另一个来源原因而失败。保存原因和时间。不要编造缺失的事实。
一个不可用的行不能证明账号已被删除。它也不能证明该账号没有关注者。
弄清一次对照运行做了什么、没有做什么
当前的 0.1.27 对照使用了一个主页。该行与目标 `channelId` 匹配。它与目标 `channelUrl` 或 handle 匹配。它与 `followersCount` 匹配。其状态为 `ok`。
可选的 `commerceCategory` 为 null。`isCommerce`、`isSeller` 和 `isPrivate` 为 false。null 表示未给出该值。false 表示来源给出了明确的否定。不要把 false 变成缺失。不要把 null 变成 false。不要把 false 的 `isCommerce` 复制到 null 的 `commerceCategory`。
那次对照没有测试私密主页。它没有测试被拦截的主页。它没有证明每个主页字段都完整。隐藏或缺失的电子邮箱不能被生成。如果 `detectedEmails` 为 null 或为空,这不能证明所有者没有公开联系方式。
把运行合计与你的列表对照
运行 OUTPUT 使用这些准确名称:
- `requestedChannels` 是一个数字。该数字统计已处理的输入尝试次数。该数字等于 `rows.length`。`rows.length` 是这些尝试行的数量。这个数字不是原始名册列表。原始名册列表由你持有。该列表保持分开。
- `acceptedProfileInputs` 是一个数字。该数字等于 `rows.length` 减去 `rejectedInputs`。
- `rejectedInputs` 是一个数字。该数字统计运行拒绝的输入。运行会拒绝无效输入和不支持的输入。`rejectedInputs` 不是一个列表。
- `datasetRows` 是返回的主页行数。这些行是已尝试的主页行。
- `usefulRows` 是 Actor 标为可用的返回行数。Actor 是为每一行做标记的程序。
- `billableRows` 是符合收费条件的返回行数。符合条件表示一行可以被收费。该数字不是付款证明。
- `nonUsefulRows` 是不可用的返回行数。
- `statusCounts` 是每种状态下的返回行数。`datasetRows` 和 `statusCounts` 描述返回行。它们不描述原始名册列表。
`datasetRows` 不是完整且已检查主页的数量。一次运行可以结束,但仍包含失败的目标。一个可用行仍可能缺少你要求的字段。一个符合收费条件的行仍可能缺少可选字段。要读取该行。不要停在合计数字上。
列出你的工作需要的字段
在丢弃一条返回数据不完整的主页之前,列出你的下一项任务需要的字段。你不需要的字段可以保持 null。你需要的字段必须存在,然后你才能接受该行。
对每个必填字段,保存来源值和一个可用性状态。只有来源实际支持该状态时才使用它:
- `present` 表示一个值已返回。false 是存在的。只有来源返回了零时,零才是存在的。
- `explicitly_empty` 表示来源返回了空值,例如一个空列表。
- `absent_or_unavailable` 表示该字段为 null,或该行无法提供它。
- `not_requested` 表示此任务不使用该字段。
空列表与 null 不同。null 是未知。不要把未知存成零。
这是你自己写的记录。它不是 Actor 的输出行:
field: followersCount
source_value: null
availability: absent_or_unavailable
observedAt: the time on that source row按此顺序检查每个主页
- 保留你已知主页的原始名册。名册是你的本地列表。给每个名册行一个自己的本地键。读取返回的状态。不要承诺隐藏的电子邮箱。不要承诺绕过拦截的方法。不要承诺修复每一次来源失败。同一个输入字符串只检查一次。你的名册数量和唯一尝试次数可以不同。本地键使每个名册行对应到正确的观察结果。
- 先运行一个目标主页。读取返回的身份、状态和 `observedAt`。当 `channelId` 存在时,检查它。检查目标 handle 和 URL。熟悉的显示名称不足以修正错误的目标。先匹配身份。本文不教你如何合并同一创作者的其他名称。身份匹配之后,由你决定数据是否可用。
- 把不良状态与空字段分开。状态为 `ok` 或 `partial` 且身份匹配时,可选的 `bioLink` 仍可以为 null。该主页仍可以有用。`blocked`、`challenge` 和 `login_required` 表示来源没有给予访问。`private` 表示私密部分仍然不可用。`not_found` 不告诉你主页从何时起不再可见。它也不告诉你原因。
- 单独判断每个必填字段。保存来源值和可用性状态。false 保持为 false。null 保持为未知。空列表与 null 分开。如果你的任务不需要该字段,使用 `not_requested`。不要因为一个你并未要求使用的字段而判定该主页失败。
- 把 OUTPUT 与名册对照。把 `acceptedProfileInputs` 与你的唯一输入对照。把已尝试的行与 `datasetRows` 对照。同时读取 `usefulRows`、`nonUsefulRows`、`rejectedInputs` 和 `statusCounts`。不要把 `datasetRows` 报告为完整主页。不要假定 `billableRows` 包含每个可选字段。
- 为每一次唯一尝试选择一个下一步状态。当身份匹配且每个必填字段都存在时,使用 `accepted_for_required_fields`。当身份匹配但缺少一个必填字段时,使用 `useful_but_required_gap`。当来源没有返回可用主页时,使用 `source_unavailable`。当 id、handle 或 URL 不是目标主页时,使用 `identity_mismatch`。当格式本身有误时,使用 `invalid_input`。只修正你能证明无效的格式。一次来源失败可以支持以后计划的一次复查。它不支持重试循环。它不支持去解决访问验证挑战。把 `observedAt` 和 `statusReason` 与该观察结果保存在一起。
- 在以后的刷新中,使用相同的来源身份和相同的必填字段。如果较旧的行有一个值,而新的行不可用,你就没有当前观察结果。旧值是历史。保留它的日期。把当前值标为未知。不要把旧值当作当前值继续沿用。不要把它改成零。不要把缺失的当前数据报告为完全下降到零。
- 写一份可用性报告。该报告列出每个主页、必填字段和每一个未解决状态。只把一行用于其必填字段都存在的工作。把采集缺口与关于所有者的说法分开。缺口不表示所有者缺少该事实。它也不表示所有者缺少该账号类型。
选择 accept、partial、retry 或 review
下一步状态告诉你数据情况。读者决策告诉你要做什么。使用以下四个决策之一:accept、partial、retry 或 review。
| 读者决策 | 下一步状态 | 原因 | 你要做什么 |
|---|---|---|---|
| accept | accepted_for_required_fields | 身份匹配。每个必填字段都存在。 | 只将该行用于那项工作。 |
| partial | useful_but_required_gap | 身份匹配。一个必填字段为未知。 | 保留该行。不要填补缺口。不要在需要该字段的地方使用它。 |
| retry | source_unavailable,并且仅作为以后计划的一次复查 | 输入仍可以有效,但这次尝试没有完成。`rate_limited` 或 `failed` 可以符合这种情况。 | 保存状态、原因和 `observedAt`。计划以后做一次复查。不要循环。 |
| review | identity_mismatch、invalid_input,或一个你不得强行处理的来源状态 | 这包括 `private`、`blocked`、`challenge`、`login_required`、`not_found` 和 `parser_miss`。 | 把该行保留在复核列表上。只修正已证明有误的格式。 |
在考虑另一次运行之前,先把该行放入复核列表。对于 `rate_limited` 或 `failed` 这类来源失败,允许以后做一次复查。不要用那次复查去解决访问验证挑战。不要用它来登录。不要用它来打开私密主页。`challenge` 留在复核中,因为此 Actor 不解决访问验证挑战。`login_required` 留在复核中,因为此 Actor 不登录。`private` 保持不可用。第二次调用不会使私密数据变成公开数据。
用原创虚构内容学习这些决策
本节中的表格和计数是原创虚构内容。它们不是产品结果。它们不显示真实成功率。
虚构名册有五个本地行:
| 本地键 | 输入 | 它是什么 |
|---|---|---|
| R1 | @green | 一个已知公开 handle 的第一份 |
| R2 | @green | R1 的完全重复项 |
| R3 | @blue | 第二个已知公开 handle |
| R4 | @closed | 一个返回为私密的已知 handle |
| R5 | @unknown | 一个返回为被拦截的已知 handle |
R1 和 R2 使用同一个输入字符串。该检查只接受该字符串一次。你仍然保留五个本地键。这次运行有四次已接受的唯一尝试,以及四行状态。此虚构中的 `acceptedProfileInputs` 为 4。此虚构没有显示被拒绝的输入。真实运行仍可能把 `rejectedInputs` 作为一个数字给出,所以你也必须读取该计数。
虚构的状态行是:
| 尝试 | 本地键 | channelId | status | followersCount | bioLink | 下一步状态 |
|---|---|---|---|---|---|---|
| 1 | R1 和 R2 | ID100 | ok | 1,000 | null | accepted_for_required_fields |
| 2 | R3 | ID200 | partial | null | present | useful_but_required_gap |
| 3 | R4 | 不可用 | private | 不可用 | 不可用 | source_unavailable |
| 4 | R5 | 不可用 | blocked | 不可用 | 不可用 | source_unavailable |
这个虚构任务需要两件事。`channelId` 必须与目标主页匹配。当前的 `followersCount` 必须存在。
R1 满足两条规则。id 是 ID100。当前关注者数是 1,000,所以该值存在。`bioLink` 为 null。此任务不要求 `bioLink`,所以这个 null 链接保持未知。你不要编造链接。R1 是你可以为此任务接受的那一个唯一主页。读者决策是 accept。
R2 不是第二个创作者。它与 R1 是同一输入,并对应同一观察结果。保留 R2 键,这样你的名册可以解释这个重复项。不要把 R2 计为另一个另有 1,000 个关注者的主页。
R3 匹配 ID200,所以身份正确。状态为 `partial`。关注者数为 null。null 不是零,而该任务要求这个计数。简介链接存在,但它不能填补缺失的计数。R3 是 `useful_but_required_gap`。读者决策是 partial。保留 R3,不要把它用于需要当前关注者数的工作。一个可用的来源行仍可能不符合你自己的字段规则。
R4 的状态为 `private`。它的必填事实不可用。R5 的状态为 `blocked`。它的必填事实不可用。两者都是 `source_unavailable`。读者决策是 review。不要把其中任一行读成已删除的账号。不要把其中任一行读成关注者数为零。此虚构没有为 R4 或 R5 给出 `channelId`。不要编造一个。
虚构的 `statusCounts` 对应这四行:一个 `ok`,一个 `partial`,一个 `private`,一个 `blocked`。如果这四行就是你的 `datasetRows`,计数是 4 次尝试。该计数仍然不是 4 个完整主页。一个唯一主页满足 id 和当前关注者规则。一行,即 R3,有必填缺口。两行,即 R4 和 R5,不可用。不要把 4 次尝试中接受的 1 个主页变成真实成功率。
对 ID100 的第二次虚构观察返回 `blocked`。保留较早的关注者值 1,000。保留该较早观察结果的日期。当前计数为未知。不要报告零。不要报告百分之 100 的下降。旧的 1,000 是历史。它不是当前计数,也不要把它作为当前值继续沿用。
再用一对虚构值,使 false 和 null 保持分开。一个单独的 `isSeller` 值 false 是存在的。来源给出的是否定。一个单独的 `isSeller` 值 null 是未知。它不表示否定。此虚构中没有任何状态能证明所有者没有公开联系方式。
只讨论是否接受主页数据以供使用
本文只说明如何接受主页数据。你检查身份、状态、时间,以及你的任务需要的字段。然后你接受该行,将其保持为 partial,计划一次复查,或进行 review。
按账号类型为主页排序是单独的任务。反馈是单独的任务。旧帖子计数是单独的任务。此方法不会抓取私密主页。它不会返回关注者列表。它不会发现联系方式。它不会建立增长历史。缺失的当前值是这次检查中的缺口。它不是一次测得的变化。
来源和延伸阅读
作者 Chronometrica · 更新日期
返回顶部 ↑
