

# 如何关联 LinkedIn 个人资料、帖子和评论且避免错误匹配

通过匹配兼容的、带类型的帖子键，关联 LinkedIn 帖子、评论和作者数据。然后把每位评论作者匹配到至多一份已核对的个人资料。

已核对的行，是你读过它的状态和键之后予以接受的源行。保留每一条没有匹配的评论。左连接会保留每一条起始行，即使不存在匹配。在评论行上统计评论。在帖子行上统计帖子。先完成这些计数，再把合计合在一起。

Actor 是一个托管的数据采集程序。Task 是一份已保存的 Actor 输入示例。数据集是一组输出行。连接把具有匹配值的行合在一起。这些 Actor 采集源行。你来做连接和表。没有任何 Actor 返回已连接的数据集。

主要限制是兼容性。键是用来匹配行的值。公开来源必须暴露兼容的键。缺失的键保持未解析。冲突的键保持未解析。未解析表示该行保留，并且得不到匹配。一个公开计数并不是评论或人员的完整列表。

使用一条已知的公开帖子 URL。URL 是页面的网址。采集公开的顶层评论及其父键。顶层评论是帖子上的评论，不是回复。采集同一帖子的一份快照。快照在一个观察时间记录公开数据。如果某位个人作者仍需要资料证据，就采集一份已核对的公开个人资料。

Null 表示缺失值，不是零。不要匹配 null。不要匹配空白单元格。不要匹配姓名、照片或头衔。

## 先选定行粒度

行粒度表示一行代表什么。采集行之前先选定粒度。

证据粒度是一条选定的评论观察。一条评论观察，是来自一份快照的一条已保存顶层评论。计数粒度是一条选定的帖子。评论计数和帖子计数是不同的度量。把两者相加之前，先在文件里写下两种含义。

写下已知的来源 URL。写下报告期间。报告截止时间是你纳入的最后观察时间。截止时间之后的行仍留在原始数据集中。它不进入本报告。

本方法只用于已知的公开帖子 URL、这些帖子的公开顶层评论，以及已核对的个人资料。不要把它用于账号搜索、一个账号的全部帖子、反应列表、回复、发送消息、职位标签或文本评分。

## 术语

URN 是一种带类型的文本标识符。在 `urn:li:activity:1001` 中，URN 类型是 `activity`。类型是键的一部分。`ugcPost` 是另一种帖子类型。在这些 Actor 中，`member` 是个人账号类型。`organization` 不是个人账号类型。

[LinkedIn URN 指南](https://learn.microsoft.com/en-us/linkedin/shared/api-guide/concepts/urns)说明了官方 LinkedIn API 的 URN 类型。该 API 使用 `person` URN。Actor 的资料键使用 `member`。这两种架构并不相同。不要把一个 LinkedIn API 中的标识符复制到另一个 API 中，并称它们相等。

JSON 是一种文本数据格式。你将使用 JSON 或文本列，这样长标识符不会丢失位数。

布尔字段的值是 true 或 false。默认值是你不改该字段时使用的值。输入架构是 Actor 接受的已发布字段列表。父键是存在评论行上的帖子键。回退表示只有当前一个键缺失时，才尝试下一个键。规范来源 URL 是你已确认的那一条来源 URL，不是该 URL 的第二种形式。

兼容的键具有相同的 URN 类型和相同的值。冲突表示一个键指向两个目标，或者两个键指向两个不同的目标。当同类型的键指向同一条帖子时，仅 URN 类型不同并不构成冲突。

## 三个 Actor 返回什么

三个公开 Actor 提供源行。连接仍由你来建立。

[LinkedIn Post Scraper](https://apify.com/chronometrica/linkedin-post-scraper) 的构建版本是 1.0.60。[LinkedIn Comments Scraper](https://apify.com/chronometrica/linkedin-comments-scraper) 的构建版本是 1.0.47。[LinkedIn Profile Scraper](https://apify.com/chronometrica/linkedin-profile-scraper) 的构建版本是 1.0.28。每次运行前先阅读各 Actor 页面。较新的构建版本可能改变字段。

每个 Actor 都读取公开页面。它们都不使用你的 LinkedIn 登录。它们都不返回一个账号的全部帖子。

| Actor | 你必须提供的输入 | 一行输出代表什么 |
| --- | --- | --- |
| 个人资料 | `startUrls`，一个字符串列表，至少包含一条公开的 `/in/` URL。架构没有声明上限。 | 每个不重复的输入字符串对应一次当前尝试。`status` 为 `ok` 或 `failed`。失败的尝试仍作为一行保留。 |
| 帖子 | `startUrls`，一个字符串列表，至少包含一条公开的 `/posts/` URL。架构没有声明上限。输入是 URL，不是帖子 ID。 | 每个不重复的输入字符串对应一次当前帖子尝试。`status` 为 `ok`、`failed` 或 `invalid_url`。两种 URL 形式可以产生两次尝试。 |
| 评论 | `startUrls`，1 到 100 条公开的 `/posts/` URL，或带类型的 `/feed/update/` URL。 | 一条已保存的公开顶层评论。失败的输入不会制造虚假的评论行。 |

评论输入还有 `maxComments`、`includeAuthorDetails` 和 `collectAllAvailable`。`maxComments` 是 1 到 1000 的整数。它的默认值是 100。`maxComments` 是每个帖子或每项输入最多保存的评论数。它不是多次输入的一次运行的总上限。`includeAuthorDetails` 是布尔值。它的默认值是 false。`collectAllAvailable` 是布尔值。它的默认值是 false。`collectAllAvailable` 只去掉数字保存上限。它不去掉公开限制。它不采集回复。

评论计数和输入状态在 `OUTPUT` 中。`OUTPUT` 是本次运行的摘要。它不是评论行。在它内部，`inputResults` 带有 `status`、`statusReason`、`pageCommentCount`、`publicRowsOnPage`、`savedRows`、`isPublicPageComplete`、`isComplete` 和 `stopReason`。

`pageCommentCount` 是该页面报告的计数。`publicRowsOnPage` 是在该页面上看到的公开行数。`savedRows` 是已存储的行数。这三个数字可以不同。`isPublicPageComplete` 说明 Actor 是否把该公开页面标为完整。`isComplete` 说明已保存的集合是否完整。`stopReason` 说明保存为何停止。部分结果可能来自保存上限、公开预览或计费上限。未知计数保持为 null。不要在它的位置写入 0。

评论 Actor 可以接受带类型的 feed-update URL。帖子 Actor 要求 `/posts/` URL。如果你只知道 feed URL，就保留评论的父键。在采集帖子快照之前，先取得一条已核实、能够匹配的 `/posts/` URL。不要编造 `/posts/` slug。

使用这些 Task，然后修改示例输入。未修改的示例无法连接。帖子 Task 的示例与评论 Task 的示例不是同一条帖子。

| Task | 用途 | 首次运行前要修改的内容 |
| --- | --- | --- |
| [用于安全数据连接的 LinkedIn 帖子 ID 与评论 ID](https://apify.com/chronometrica/linkedin-comments-scraper/examples/linkedin-post-comment-join-data) | 公开顶层评论和父键。 | 替换示例帖子。把 `maxComments` 从 100 改为 3。保持 `collectAllAvailable` 为 false。作者详情保持关闭。 |
| [带公开资料详情的 LinkedIn 评论作者](https://apify.com/chronometrica/linkedin-comments-scraper/examples/linkedin-comment-author-profile-details) | 当你需要作者键或其他公开作者事实时，可选用的替代项。 | 替换示例帖子。使用三条评论。保持不限量关闭。把 `includeAuthorDetails` 设为 true。 |
| [用于数据连接的 LinkedIn 帖子 ID 与作者键](https://apify.com/chronometrica/linkedin-post-scraper/examples/linkedin-post-id-author-join-data) | 同一条来源帖子的快照。 | 用同一条已知的 `/posts/` URL 替换示例。 |
| [用于数据连接的 LinkedIn 个人资料 ID 与 URN](https://apify.com/chronometrica/linkedin-profile-scraper/examples/linkedin-profile-identity-join-data) | 为每位仍需要资料证据、且受支持的不重复评论作者，采集一份已核对的公开个人资料。 | 用一条已采集的 `/in/` 作者链接替换示例。去掉重复的 URL。排除组织 URL。 |

不要把两个评论 Task 追加成两套评论。为该帖子选择一个评论 Task。详情 Task 仍可能返回一条没有作者 ID 的评论。一次有用的详情请求可能产生单独的计费事件。该请求不保证返回 ID。它也不保证产生费用。

作者详情默认关闭。在该默认输出中，稳定的评论作者键常常为 null。公开标识符和公开 URL 以后可能改变。一份资料快照显示的是该资料在其自身时间的状态。[它不能证明此人在更早的评论时间担任一项工作](/zh-Hans/articles/%E9%A2%86%E8%8B%B1%E4%B8%AA%E4%BA%BA%E8%B5%84%E6%96%99-%E5%85%B3%E7%B3%BB%E4%B8%BB%E5%BC%A0%E5%AE%A1%E9%98%85/)。本方法不指派职位角色。

[运行文档](https://docs.apify.com/api/v2/actors-runs-post)说明了运行上限和超时。大规模运行前先阅读它。不要把访问令牌放进表格。

## 如何把评论匹配到帖子

按所述顺序匹配。保持同类型规则。匹配键指向一条帖子。先检查所有可用的兼容键是否冲突。不要跳过一个相互矛盾的较低优先级键。只有在该检查之后，才按所述顺序选择第一个受支持的匹配依据。记录该依据。依据列由读者建立。Actor 不返回它。

1. 带类型的 `postUrn` 相等。
2. `activityId` 相等，且只在 activity 类型内部比较。
3. `ugcPostId` 相等，且只在 ugcPost 类型内部比较。
4. 一条已核对的规范来源 URL。

评论字段是 `postUrn`、`activityId`、`ugcPostId` 和 `postUrl`。帖子字段是 `postUrn`、`activityId`、`ugcPostId` 和 `url`。其中任何一个都可以是 null。

先用带类型的 URN，再用单独的 ID。一条帖子上可以同时存在 activity 值和 ugcPost 值，而且两者仍然不同。这是正常的。不要把 activity 值与 ugcPost 值相比较。跨类型的相同数字不是证据。

虚构示例中的帖子 A 有 activity `1001` 和 ugcPost `2001`。这是一条帖子的两个键，不是冲突。当一个键指向两条帖子，或者可用的键指向两条不同的帖子时，才存在冲突。回退顺序不允许较弱的键覆盖该冲突。让该评论保持未解析。

只有带类型的键缺失时才使用 URL。两条 URL 都必须是你已核对的同一条规范来源 URL。如果你无法核对这一点，就让该行保持未解析。URL 依据弱于带类型的键。写下该依据和两个观察时间。

在这次连接之前，把重复的帖子快照减到一条选定的查找行。如果查找表中一条帖子仍有两行成功记录，连接就会复制评论。修正查找表。不要删除被复制的评论行，同时却不改查找表。

缺少帖子快照就是缺少匹配。它不是一条空帖子。一条成功的帖子但没有已保存评论，是另一种结果。一次失败的帖子尝试，是另一种结果。你没有运行的一项输入，是另一种结果。

## 如何匹配个人资料

只有在作者表示个人账号之后，才把资料匹配到评论作者。评论字段是 `authorType`。它可以是 `person`、`organization` 或 null。帖子 Actor 可以把帖子作者类型写成 `Person`。每个来源值都按到达时的原样保留。对这一含义检查，`person` 和 `Person` 都表示个人账号。不要要求大小写字母相同。不要为了让字母一致而修改已存储的文本。

组织作者留在个人资料连接之外。组织 URL 不能变成 `/in/` 资料行。`urn:li:member:11` 和 `urn:li:organization:11` 是不同的键。不要去掉 URN 类型来强行匹配。

个人检查之后，按此顺序匹配：

1. member ID 相等：资料的 `profileId` 对评论的 `authorId`。
2. member URN 相等：资料的 `profileUrn` 对评论的 `authorUrn`。
3. 较弱的回退：`publicIdentifier` 对 `authorPublicIdentifier`，或者资料 `url` 与评论 `authorUrl` 中的规范 `/in/` URL。

不要匹配 null。不要匹配空白单元格。如果 member ID 指向资料 X，而 URL 指向资料 Y，该行就是冲突。不要用较弱的 URL 挑选胜出者。

URL 或公开标识符可以在不同快照之间改变。如果你使用这个较弱依据，就写下两个 `observedAt` 值和该依据。null URL 保持未解析。姓名、照片和头衔不是键。不要按姓名搜索来填补缺失的链接。

同样的资料字段可以与帖子作者字段 `authorId`、`authorUrn`、`authorPublicIdentifier`、`authorUrl` 和 `authorType` 比较。该比较只检查帖子作者角色。它是可选的。它不是评论作者。绝不要用帖子作者替换评论作者。绝不要把一个账号的每条帖子连接到该账号的每条评论。

```text
one post snapshot
    -> many comment observations

one person profile
    -> many comments by that person

optional post-author match
    -> the post row only
    -> not the comment author
```

如何匹配个人资料

一个人可以写许多条评论。一条帖子可以有许多条评论。这两个方向是分开的。

评论身份使用 `commentId`、`commentUrl`、父键和 `observedAt`。ID 或链接可以是 null。保留该观察。不要编造稳定 ID。不要把相同文本当成同一条评论。不要把表格行号当成 ID。跨运行时，只有父键和 `commentId` 都稳定且相等，才选定一条观察。没有稳定 `commentId` 的行保持为各自独立的观察。

资料和帖子状态使用 `status`、`statusReason` 和 `observedAt`。把失败的资料行留在源文件中。不要把它当成一次成功的资料匹配。

## 连接前先选定一份快照

查找行是你允许连接使用的那一份快照。每条已核对的帖子至多选择一行成功的帖子。每位已核对的人至多选择一行成功的资料。在连接之前完成这件事。

保留原始数据集。不要把两份快照混成一行新记录。把选择规则写在文件里。一条清楚的规则是：报告截止时间之前最新的成功快照。

如果一个人有两份成功的资料快照，就选择一份。如果两份都留在查找表中，该人的每条评论都会按每份快照复制一次。多出来的连接行是查找表错误。修正查找表。不要删掉副本，然后称表格正确。

然后从选定的评论观察建立左连接。先把每条评论连接到一条来源帖子。再把它的个人作者连接到至多一份资料。没有帖子匹配的评论仍然保留。没有资料匹配的评论仍然保留。

连接后的证据表必须与选定的评论观察行数相同。行数更多，表示某个查找键仍指向不止一行。

这些由读者建立的字段属于证据行：匹配依据、匹配结果、选定的快照规则，以及你比较过的来源时间。把它们标为读者自建。不要把它们说成 Actor 字段。

把长 ID 保持为文本。电子表格可能改变一个长数字并丢掉位数。导出 JSON，或者在导入前把每个 ID 列设为文本。JSON 的定义见上文。[数据集文档](https://docs.apify.com/storage/dataset)给出了导出路径：选择该数据集，选择 Export，选择格式，再选择 Download。单独保存 `OUTPUT`。数据集导出不包含 `OUTPUT`。

## 步骤

1. 写下粒度、已知 URL、报告截止时间，以及每种计数的含义。证据文件中，每条选定的评论观察占一行。计数文件中，每条选定的帖子占一行。在写完这些内容之前，评论合计与显示的帖子计数保持分开。
2. 打开[用于安全数据连接的 LinkedIn 帖子 ID 与评论 ID](https://apify.com/chronometrica/linkedin-comments-scraper/examples/linkedin-post-comment-join-data)。用一条已知的公开帖子 URL 替换示例 URL。把 `maxComments` 设为 3。保持 `collectAllAvailable` 为 false。让作者详情保持关闭。开始运行。在解释一个小集合或空集合之前，先打开 `OUTPUT`。行数少，可能表示保存上限、失败的输入、公开限制，或公开评论集合本来就短。仅凭行数不能说明是哪一种。
3. 如果默认评论行不含你需要的作者键，就改用[带公开资料详情的 LinkedIn 评论作者](https://apify.com/chronometrica/linkedin-comments-scraper/examples/linkedin-comment-author-profile-details)，不要用第一个评论 Task。替换示例帖子。使用三条评论。保持不限量关闭。把 `includeAuthorDetails` 设为 true。不要把两份输出粘在一起。详情仍可能缺失。额外的详情请求可能单独计费，而且仍可能不返回 ID。
4. 打开[用于数据连接的 LinkedIn 帖子 ID 与作者键](https://apify.com/chronometrica/linkedin-post-scraper/examples/linkedin-post-id-author-join-data)。用同一条 `/posts/` URL 替换它的示例。不要传入帖子 ID。不要传入 feed-update URL。如果你只有 feed-update URL，就保留评论父键，并停止帖子采集，直到你有一条已核实的 `/posts/` URL。不要编造 slug。把 `ok`、`failed` 和 `invalid_url` 行分开保留。保留 `observedAt`。缺少帖子快照仍然是缺少匹配。
5. 阅读评论作者键。如果评论行已经包含本报告需要的每项作者事实，就跳过资料 Actor。如果没有，就用[用于数据连接的 LinkedIn 个人资料 ID 与 URN](https://apify.com/chronometrica/linkedin-profile-scraper/examples/linkedin-profile-identity-join-data)采集不重复的公开 `/in/` URL。去掉重复的 URL。排除组织 URL。不要按姓名、照片或头衔搜索。把失败的资料尝试留在源文件中。失败的尝试不是已匹配的人。
6. 选定查找表。每条已核对的帖子保留一份成功的帖子快照。每位已核对的人保留一份成功的资料快照。对于重复的评论运行，每个稳定父键加上 `commentId` 只保留一条观察。没有 `commentId` 的行保持为各自独立的观察，即使文本相同。保留每一份原始数据集。写下截止规则。连接之前，先在查找表中解决重复键和冲突。
7. 把每条选定评论左连接到一条帖子。先用相等的带类型 `postUrn`，再用相等的 activity ID，再用相等的 ugcPost ID，再用一条已核对的规范 URL。不要跨越 URN 类型。然后把个人作者连接到至多一份资料。先用 member ID，再用 member URN，再用带日期的公开标识符或规范 `/in/` URL。写下读者自建的依据、结果，以及两个来源时间。不要用来源帖子的作者填补评论作者。不要把一个账号的全部帖子连接到该账号的全部评论。
8. 统计证据行。这个数字必须等于选定的评论观察数。如果更大，查找表中一个键仍对应许多行。修正该查找表并重新连接。不要把删除重复证据行当作唯一修复。另外分别统计未匹配的父级、缺失的个人键、失败的资料、组织作者和冲突。
9. 按已解析的帖子键给评论观察分组。只把 `commentsCount` 放在一条选定的帖子行上。把该次运行的 `OUTPUT` 覆盖情况放在帖子旁边。保留没有已保存评论的帖子。把一次成功的空采集、一次失败的尝试，以及你没有运行的输入，保留为不同的事实。把作者键计为观察到的账号。不要把它们称为各计一次的不同人员。不要把它们称为评论者或浏览者的完整集合。
10. 导出证据表、未解析表、按帖子计数的表，以及一份来源摘要。使用上文的数据集导出路径。把 `OUTPUT` 保存在旁边。把 ID 保持为文本。在每一条结果行上显示来源键、读者自建的依据，以及缺失的证据。只有当你拥有针对该确切缺口的受支持来源 URL 时，才填补缺口。否则让它保持未知。

证据计数是第 8 步。帖子计数是第 9 步。不要把帖子计数用作评论计数。

## 一次公开核对证明了什么

一次公开核对从一条已知帖子保存了三条评论。来源显示四条评论，并暴露了四行。上限保存了三条。这三条已保存父键都匹配到同一条来源帖子。一位评论作者匹配到单独的一行个人资料。所有这些已核对的匹配都成功了。

该次运行的评论 `OUTPUT` 中，`isPublicPageComplete` 为 true，`isComplete` 为 false，`stopReason` 为 `max_comments_reached`。合在一起读，Actor 把该公开页面标为完整，而保存仍不完整，因为已达到保存上限。

该核对只证明这些行和该摘要。它不证明以后的每一条帖子。它不是对 ugcPost 匹配、组织作者、null 键或冲突的一次新的实时测试。这些情形使用上文的字段规则和下文的虚构计数。

## 虚构的帖子、评论与计数

本节中的每个值都是虚构的。C1 到 C6 是教学标签。这些短 ID 是教学 ID。它们不是采集到的 LinkedIn 值。不要把下面任何一个 URN 当成真实的资料、帖子或评论。

报告截止时间在 `time-2` 之后。选定的 member12 快照是较晚的那份成功快照。帖子作者类型在 A 和 B 上存储为 `Person`。评论作者类型在 C1 到 C4 上存储为 `person`。这些含义相符。存储的字母仍然不同。帖子 C 存储为组织作者。

| 帖子 | 带类型的帖子 URN | activity ID | UGC ID | commentsCount |
| --- | --- | --- | --- | --- |
| A | `urn:li:activity:1001` | `1001` | `2001` | 10 |
| B | `urn:li:activity:1002` | `1002` | null | 20 |
| C | `urn:li:ugcPost:1001` | null | `1001` | null |

Member11 有一行成功且已选定的资料。Member12 有两份成功快照。连接前先选择一份。Member13 有一次失败的资料尝试。A 和 B 由 member11 撰写。C 由 organization11 撰写，不是由 member11 撰写。

| 快照 | 身份 | status | observedAt | 是否选入查找表 |
| --- | --- | --- | --- | --- |
| 较早 | member12 | `ok` | `time-1` | 否 |
| 较晚 | member12 | `ok` | `time-2` | 是 |

| 评论 | 父级证据 | 匹配到的来源帖子及依据 | 作者证据 | 资料结果 |
| --- | --- | --- | --- | --- |
| C1 | `urn:li:activity:1001` | A，带类型的 URN 相等 | `urn:li:member:11` | member11 已匹配 |
| C2 | `urn:li:ugcPost:2001` 加上 activity ID `1001` | A，activity ID；相等的 UGC ID 加以确认 | `urn:li:member:12` | member12 已匹配 |
| C3 | `urn:li:activity:1002` | B，带类型的 URN 相等 | `urn:li:member:12` | member12 已匹配 |
| C4 | `urn:li:activity:1002` | B，带类型的 URN 相等 | `urn:li:member:13` | 未解析：资料失败 |
| C5 | `urn:li:ugcPost:1001` | C，带类型的 URN；不是 A 的 activity 数字 | `urn:li:organization:11` | 在个人资料范围之外 |
| C6 | `urn:li:activity:9999` | 未解析：父级不在已选帖子中 | null | 未解析：缺少作者键 |

C2 不能按带类型的 activity URN 匹配，因为该父 URN 是 ugcPost URN。activity ID `1001` 匹配帖子 A。ugcPost ID `2001` 也匹配帖子 A。两个同类型键一致，所以这是确认，不是冲突。你写下的依据是 activity ID。

C5 匹配帖子 C，因为两边都使用 ugcPost `1001`。帖子 A 也包含数字 `1001`，但这些数字是 activity ID。相同的数字不会把 C5 移到 A 上。

证据表保留六行。匹配表和未解析表是视图。当一侧匹配而另一侧不匹配时，它们可以重复一条评论。不要把这些视图加在一起，并把合计称为评论总数。

| 评论 | 匹配侧 | 目标 | 依据（读者自建） | 保留的时间 |
| --- | --- | --- | --- | --- |
| C1 | 帖子 | A | 带类型的 URN 相等 | 评论时间与帖子 A 的时间 |
| C1 | 个人资料 | member11 | 个人检查之后，member URN 相等 | 评论时间与所选资料的时间 |
| C2 | 帖子 | A | activity ID；UGC ID 加以确认 | 评论时间与帖子 A 的时间 |
| C2 | 个人资料 | member12 | 个人检查之后，member URN 相等 | 评论时间与 `time-2` |
| C3 | 帖子 | B | 带类型的 URN 相等 | 评论时间与帖子 B 的时间 |
| C3 | 个人资料 | member12 | 个人检查之后，member URN 相等 | 评论时间与 `time-2` |
| C4 | 帖子 | B | 带类型的 URN 相等 | 评论时间与帖子 B 的时间 |
| C5 | 帖子 | C | 带类型的 ugcPost URN 相等 | 评论时间与帖子 C 的时间 |

匹配视图有 8 行。C1、C2 和 C3 各有两个成功侧。C4 和 C5 只有帖子侧。8 不是评论总数。6 才是评论总数。

| 评论 | 未解析部分 | 原因 | 保留的键 |
| --- | --- | --- | --- |
| C4 | 个人资料 | 资料尝试失败 | `urn:li:member:13` |
| C5 | 个人资料 | 组织在个人资料范围之外 | `urn:li:organization:11` |
| C6 | 来源帖子 | 父级不在已选帖子中 | `urn:li:activity:9999` |
| C6 | 个人资料 | 缺少作者键 | null |

C6 有两个未解析部分，以及一行证据。把它作为一条评论只计一次。

| 帖子 | 已采集的评论行 | commentsCount，只计一次 | 帖子作者角色，单独列出 |
| --- | --- | --- | --- |
| A | 2 | 10 | member11 |
| B | 2 | 20 | member11 |
| C | 1 | null | organization11 |
| 未匹配的父级 | 1 | 没有选定的帖子，因此没有显示的计数 | 无 |

逐项核对每个合计：

- 选定的评论观察：6。
- 左连接之后的证据行：6。
- 父帖子匹配：5，即 C1、C2、C3、C4 和 C5。
- 未匹配的父级：1，即 C6。
- 匹配到成功个人资料的评论行：3，即 C1、C2 和 C3。
- 用到的成功个人资料：2，即 member11 和 member12。
- 未解析的个人结果：2，即 C4 上失败的资料，以及 C6 上缺失的作者键。
- 处于个人资料范围之外的组织作者：1，即 C5。
- 已识别的 member 键：3，即 member11、member12 和 member13。
- 这 3 个 member 键不是 2 份资料，也不是 3 名已证实的人员。
- 按父级统计的已采集行：A 有 2，B 有 2，C 有 1，未匹配的父级有 1。
- 2 加 2 加 1 加 1 等于 6。

`commentsCount` 留在帖子行上。如果你把它复制到每一条已采集评论上，再把这些副本相加，A 会两次贡献 10，B 会两次贡献 20。那是 20 加 40，即 60。正确的、已知的显示合计对每条选定帖子只使用一次：10 加 20 等于 30。帖子 C 是 null。不要把 null 改成 0。不要称 30 为完整。已采集观察的度量不同：5 个已匹配父级加 1 个未匹配父级等于 6。

这张虚构表格没有 `OUTPUT`。真实覆盖情况仍需要该次运行中的 `pageCommentCount`、`publicRowsOnPage`、`savedRows`、`isPublicPageComplete`、`isComplete`、`stopReason`、`status` 和 `statusReason`。显示计数为 10 且已采集 2 行，本身并不是覆盖率。

如果两份 member12 快照都留在查找表中，C2 会被复制，C3 也会被复制。证据表会从 6 行增加到 8 行。先选择 `time-2` 快照。证据表回到 6 行。在两份快照仍留在查找表中时删除那两行多余证据，并不能修复下一次连接。

Member11 写了两条选定帖子 A 和 B，以及一条选定评论 C1。如果你把这两条由其撰写的帖子直接连接到 member11 所写的评论，C1 会出现两次。在同时谈论两边之前，先分别统计每个分支。帖子作者分支有 2 条帖子。评论作者分支有 1 条评论。父级匹配只把 C1 留在帖子 A 上。C1 匹配 member11，是因为评论作者键是 member11，不是因为 member11 写了帖子 A。

Member12 显示允许的方向。一份选定资料匹配两条评论。C2 留在 A 上。C3 留在 B 上。共享的资料不会把任何一条评论移到另一条帖子上。

仅有一份成功的帖子快照，并不能证明评论集合为空。只有一项已核对且成功的评论输入，并且保存行数为 0，才是观察到的空结果。上限仍然限制该结果。来源限制仍然限制该结果。失败的输入保持未知。未尝试的输入保持未知。观察到的空结果并不是显示为 null 的 `commentsCount`。六行示例的合计不变。C6 是一个未匹配的父键。它不是一次失败的帖子尝试。

另外三条虚构规则位于这六行之外。不要把它们加进上面的合计。

member 键为 null 的一个人，当当前 `/in/` URL 完全相同时，可以匹配一份已核对的资料。写下较弱的 URL 依据和两个观察时间。null URL 保持未解析。如果 member ID 指向 X 而 URL 指向 Y，就保留冲突，不要使用该 URL。`commentId` 为 null 的评论保持为自己的一条观察。相同文本不能补上缺失的 ID。表格行号也不能补上它。

完成的文件显示什么匹配了、为何匹配，以及什么仍然未知。它不对人员排名。它不判断一条帖子是否成功。

## 下一步

用[用于安全数据连接的 LinkedIn 帖子 ID 与评论 ID](https://apify.com/chronometrica/linkedin-comments-scraper/examples/linkedin-post-comment-join-data)从一条已知帖子采集三条公开评论。在 [LinkedIn Post Scraper](https://apify.com/chronometrica/linkedin-post-scraper) 中使用同一条帖子。在用 [LinkedIn Profile Scraper](https://apify.com/chronometrica/linkedin-profile-scraper) 添加受支持的个人资料之前，先检查缺失的键。

## 来源和延伸阅读

- [LinkedIn Post Scraper](https://apify.com/chronometrica/linkedin-post-scraper)
- [用于数据连接的 LinkedIn 帖子 ID 与作者键](https://apify.com/chronometrica/linkedin-post-scraper/examples/linkedin-post-id-author-join-data)
- [LinkedIn Comments Scraper](https://apify.com/chronometrica/linkedin-comments-scraper)
- [用于安全数据连接的 LinkedIn 帖子 ID 与评论 ID](https://apify.com/chronometrica/linkedin-comments-scraper/examples/linkedin-post-comment-join-data)
- [带公开资料详情的 LinkedIn 评论作者](https://apify.com/chronometrica/linkedin-comments-scraper/examples/linkedin-comment-author-profile-details)
- [LinkedIn Profile Scraper](https://apify.com/chronometrica/linkedin-profile-scraper)
- [用于数据连接的 LinkedIn 个人资料 ID 与 URN](https://apify.com/chronometrica/linkedin-profile-scraper/examples/linkedin-profile-identity-join-data)
- [LinkedIn URN 与 ID](https://learn.microsoft.com/en-us/linkedin/shared/api-guide/concepts/urns)
- [Apify 数据集文档](https://docs.apify.com/storage/dataset)
- [运行 Actor 文档](https://docs.apify.com/api/v2/actors-runs-post)
- [评论者资料](https://www.reddit.com/r/webscraping/comments/1d8lc31/how_would_you_scrape_the_linkedin_profiles_of/)
- [来自一条帖子的资料](https://www.reddit.com/r/webscraping/comments/15rr4vc/noob_question_is_it_possible_to_scrape_profiles/)
- [评论者表格](https://www.reddit.com/r/linkedin/comments/rczilj/exporting_data_about_who_is_reacting_and/)