

# 如何研究 LinkedIn 评论作者的公开角色

收集带有公开作者信息的顶层 LinkedIn 评论，然后只为已写明的头衔角色编码。

顶层评论直接位于帖子上。对另一条评论的回复不在本次收集范围内。你得到的是这些顶层评论上已出现的公开字段。你得不到完整个人资料。

为每条可用评论保存一行。然后做第二张表，记录观察到的个人账户身份。个人账户身份是一个公开账户：其作者类型为 person，并且你已核对其安全键。它是一个观察到的账户。它不能证明对应一个真实的人。

用个人账户身份计算角色占比。用评论行表示活动。在报告中保留未知角色。把未解析的行排除在该占比之外。

本方法只覆盖你保存的公开评论。它不列出反应。它不提供私人联系方式、完整个人资料、全部回复或自动消息。头衔是自我描述工作的证据。它不能证明此人有权为组织做出或批准采购决定。

Actor 是一个托管的数据收集程序。公开的 [LinkedIn Comments Scraper](https://apify.com/chronometrica/linkedin-comments-scraper) 可以收集这些顶层行。作者字段是可选的。Task 是已保存的输入预设。该预设只收集行。角色工作仍由你按下文完成。同一套编码步骤适用于任何已经带有这些公开字段的表。

边界：只报告已保存的顶层公开评论。不要把该表当成全部评论者、全部客户或买家名单。

一个公开讨论串询问评论某帖子的人的个人资料和职位详情（[讨论串](https://www.reddit.com/r/webscraping/comments/1d8lc31/how_would_you_scrape_the_linkedin_profiles_of/)）。本文回答的是这个公开评论问题。它不建立反应列表。它不发送消息。

## 把评论和账户分开

一行已保存记录是一条可用的顶层评论。它不是一个人。它不是一次反应。它不是一份完整个人资料。它不是一整条讨论串。

这些是行字段：

- `commentId`
- `commentUrl`
- `postUrl`
- `postUrn`
- `authorType`
- `authorUrl`
- `authorId`
- `authorUrn`
- `authorPublicIdentifier`
- `authorName`
- `authorHeadline`
- `authorLocation`
- `authorCurrentOrganizations`
- `text`
- `observedAt`

`authorUrn` 和 `postUrn` 是 URN 值。URN 是来自公开来源的带类型文本标识符。`authorId` 也是公开来源标识符。这些标识符是公开的。它们不是密钥。

`authorType` 有三个已核对的值：`person`、`organization` 或 `null`。`null` 表示未给出类型。不要把 `null` 读成 person。

`observedAt` 是你观察到该行的时间。它不是帖子发布的时间。如果两个时间都有，都写进笔记。不要对调。

`authorCurrentOrganizations` 可以包含不止一条公开记录。保留每一条。不要编造一个雇主。如果该字段为 null 或为空，组织证据就是未知。未知不是零。未知不表示失业。未知不表示没有公司。

作者详情可能缺失。一次请求可以返回头衔为空或组织为空的行。把这些单元格留为未知。不要用评论文本填补它们。

只用一张评论表。为角色编码不需要第二个数据集。

## 设定一次小规模运行

1. 选择已知的公开帖子。收集之前先写下研究问题。写明收集时间。为每个帖子写明上限。当推广评论、帖子作者评论和组织账户会改变研究时，标出这些行。推广评论主要推广产品或服务。保留已标记的行。不要删除它们。如果你把帖子作者账户排除在占比之外，要说明这一点并更改合计。
2. 打开作者详情，收集一个小样本。2026年10月13日核对过的已保存任务是 [LinkedIn Comment Authors with Public Profile Details](https://apify.com/chronometrica/linkedin-comments-scraper/examples/linkedin-comment-author-profile-details)。其已保存输入为：

```json
{"startUrls": ["https://www.linkedin.com/posts/timferriss_how-to-become-dramatically-more-productive-activity-7386884213343428608-wrF3"], "maxComments": 100, "collectAllAvailable": false, "includeAuthorDetails": true}
```

设定一次小规模运行

把该示例帖子换成你要研究的公开帖子。第一次运行时，把 `maxComments` 设为 3。保持 `collectAllAvailable` 为 false。false 使数量上限保持生效。保持 `includeAuthorDetails` 为 true。

作者详情是与评论行分开的一次请求。一次成功的额外详情可能导致单独的计费事件。计费事件是一条收费记录。并非每次请求都会产生收费。详情字段仍可能返回为空。本文不写价格。

1. 保存评论行和本次运行的 OUTPUT。在为任何角色编码之前，先阅读每个帖子的 OUTPUT。

运行级 OUTPUT 包含 `savedRows`、`authorProfileRequests`、`authorDetailEvents` 和 `rowsWithAuthorDetails`。阅读它们，以查看记录了多少行和多少次详情请求。当详情缺失时，`rowsWithAuthorDetails` 可以低于评论数。不要把这些计数用作角色合计。不要把它们读成账单。

每个帖子有一条 `inputResults` 记录。在那里阅读这些字段：

- `status`
- `statusReason`
- `pageCommentCount`
- `publicRowsOnPage`
- `savedRows`
- `isPublicPageComplete`
- `isComplete`
- `stopReason`

使用该帖子 `inputResults` 内部的 `stopReason`。OUTPUT 根上的 `stopReason` 不是该帖子的上限状态。

`isPublicPageComplete` 为 true 表示已提取暴露的公开页面。这不表示已保存完整讨论。`isComplete` 为 false 表示已保存的收集不完整。上限、公开预览限制、来源限制或收费限制都可能导致这一结果。阅读每个输入的状态、原因和 stopReason。运行状态成功并不使该表完整。`pageCommentCount` 和 `publicRowsOnPage` 是页面计数。这些页面计数不是观察到的个人账户数。

2026年10月13日，一次有范围的检查从 1 个帖子保存了 3 条评论。它发出了 3 次作者详情请求。暴露页面计数为 4 时，上限停止了该次运行。对该帖子，`isPublicPageComplete` 为 true，`isComplete` 为 false，`stopReason` 为 `max_comments_reached`。这 3 条已保存行不是整段讨论。它们只表明可以返回公开的作者详情。它们不是角色报告。不要把它们用作分步演算示例。

## 建立两张表

保留一张评论表。给每一行自己的 `commentId`。

如果缺少 `commentId`，仍把该行保留为它自己的来源观察。给它一个你编制的标签，例如 `missing-comment-1`。绝不要合并两个空白的评论 id。绝不要因为评论文本相同就合并两行。文本相同不是同一条评论。

只有在确认类型之后，才建立个人账户表。

1. 阅读 `authorType`。
2. 只有当 `authorType` 为 `person` 时，才按标识符合并。
3. 优先用 `authorUrn` 或 `authorId` 作为安全键。
4. 如果这些标识符不存在，一个已核对的公开个人资料 URL 可以作为一个临时标签。要说明 URL 标签弱于稳定标识符。URL 标签不是未解析。
5. 未解析表示没有安全键。没有 `authorUrn`，没有 `authorId`，也没有已核对的个人资料 URL。当已存在已核对的 URL 时，不要只因为缺少稳定标识符就把一行称为未解析。
6. 绝不要按 `authorName` 合并行。
7. 绝不要把空白标识符彼此合并。

`organization` 账户留在单独的一组。把它们的标识符与个人标识符分开。它们不进入个人账户合计。在合计旁边写明它们的数量。

如果 `authorType` 为 `null`，不要把该行当作个人账户。如果该行也没有安全的个人键，它保持未解析。不要把它归到邻近的姓名上。

未知角色和未解析身份是不同的。未知角色表示你找到了个人账户，但头衔没有写明角色。该账户仍留在个人账户合计中。未解析身份留在合计之外。

## 为你能看到的头衔编码

计数之前先写编码手册。编码手册是一份简短的类别清单，以及每一类需要的头衔证据。

使用这条规则。

- `operations`：头衔写明运营工作。
- `technical`：头衔写明软件或工程工作。
- `marketing`：头衔写明营销工作。
- `mixed`：头衔写明上述职能中的不止一种，且规则无法选定一种。
- `unknown`：头衔缺失，或头衔没有写明职能。口号属于 unknown。

在类别旁边保存准确的头衔文本。使用整段已写明的职能。不要从口号推断职位。不要从评论语气推断角色。评论文本不是角色证据。

每个个人账户身份使用一个主要类别。这样占比各计一次。你可以在第二个字段保留额外标签。不要把这些标签加成更多账户。

当同一账户有相互冲突的文本时，保留两份带日期的头衔快照。为每份快照保留准确的证据文本。不要挑选能使图表更整齐的头衔。报告要声明一条规则，用来选定哪一次带日期的观察、也就是哪一份头衔快照，作为报告所用的头衔证据。如果无法使用该规则，主要角色仍为 `unknown`。只把 `conflict pending review` 用于单独的读者复核状态。不要把不同时间的角色编码为 `mixed`。只有当选定的头衔写明多个角色且编码手册无法选定一个角色时，才编码为 `mixed`。当选定的头衔没有显示一个明确职能时，编码为 `unknown`。

角色类别是你为已写明职能所加的标签。它不是已核对的资质。

## 先各计一次，再相除

在活动表中计数重复评论。在角色表中，每个观察到的个人账户身份只计一次。

分母是你用来相除的合计。分子是你要除的计数。占比是分子除以所写明的分母。

对角色报告，分母是观察到的个人账户身份数。组织行在其外。未解析行在其外。未知角色账户留在其内。

已知角色覆盖率使用第二份报告，而不是新的受众。其分子是主要角色不是 `unknown` 的个人账户身份。其分母是全部观察到的个人账户身份。`mixed` 不是 `unknown`。

你也可以只在已知角色组内展示占比。该视图的分母更小。把该分母写在表上。在旁边保留未知计数。不要把这些占比与更大分母得出的占比比较。账户没有变。合计变了。

[请第二位读者用同一份编码手册为几条头衔编码](/zh-Hans/articles/%E6%A3%80%E6%9F%A5%E4%B8%A4%E4%BD%8Dreddit%E8%AF%84%E8%AE%BA%E7%BC%96%E7%A0%81%E5%91%98%E7%9A%84%E4%B8%80%E8%87%B4%E6%80%A7/)。复核你们编码不同的行。这检查的是一致性。它不能证明该职位是真实的。

## 虚构的分步演算示例

本节中的帖子、标签、姓名、头衔和计数都是虚构的。它们不是 2026年10月13日的那次检查。它们不是真实的人。

一个编造的帖子产生 8 条评论行。虚构的 `commentId` 值为 `c1` 到 `c8`。这 8 行都没有空白的 `commentId`。个人行的个人标识符已核对。`c8` 没有安全键。

| commentId | authorType | 账户标签 | 头衔 |
| --- | --- | --- | --- |
| c1 | person | p1 | 运营经理 |
| c2 | person | p1 | 运营经理 |
| c3 | person | p2 | 软件工程师 |
| c4 | person | p2 | 软件工程师 |
| c5 | person | p3 | 营销专员 |
| c6 | person | p4 | 更好未来的建设者 |
| c7 | organization | org1 | 不用于个人角色 |
| c8 | null | 无安全键 | 无 |

个人账户表：

| 账户 | authorType | 评论数 | 头衔证据 | 主要角色 |
| --- | --- | --- | --- | --- |
| p1 | person | 2 | 运营经理 | operations |
| p2 | person | 2 | 软件工程师 | technical |
| p3 | person | 1 | 营销专员 | marketing |
| p4 | person | 1 | 更好未来的建设者 | unknown |

`org1` 的 `authorType` 为 `organization`，并有 1 条评论。它留在个人账户表之外。`c8` 的 `authorType` 为 `null`，且没有安全键。它是 1 条未解析评论。绝不要把 `c8` 归到 `p4`。

这 8 条评论包含 4 个观察到的个人账户身份、1 个组织作者和 1 行未解析作者。不要说恰好有 6 个人。未解析行可能重复某个个人账户。`org1` 是组织。

角色占比以 4 个观察到的个人账户身份为分母。

| 主要角色 | 分子 | 分母 | 占比 |
| --- | --- | --- | --- |
| operations | 1 | 4 | 25% |
| technical | 1 | 4 | 25% |
| marketing | 1 | 4 | 25% |
| unknown | 1 | 4 | 25% |

运营占比是 1 除以 4。即 25%。同一计算使 technical、marketing 和 unknown 也各为 25%。这四个占比使用同一个分母，因此相加为 100%。

已知角色覆盖率以 3 为分子、以 4 为分母。3 除以 4 是 75%。未知账户仍可见，为这 4 个中的 1 个。

第二个视图只使用 3 个已知角色账户。每个已知组是 1 除以 3，约为 33.3%。在该视图旁边保留未知计数。该未知账户是 1，并且在这个分母之外。

| 主要角色 | 分子 | 分母 | 占比 |
| --- | --- | --- | --- |
| operations | 1 | 3 | 33.3% |
| technical | 1 | 3 | 33.3% |
| marketing | 1 | 3 | 33.3% |
| unknown | 1 | 在此分母之外 | 不在 33.3% 的占比之中 |

不要把 33.3% 与 25% 比较。这些数字使用不同的分母。它们不是受众的变化。

评论活动是另一个合计。它加总为 8。

| 分组 | 评论数 |
| --- | --- |
| operations | 2 |
| technical | 2 |
| marketing | 1 |
| 未知角色 | 1 |
| 组织 | 1 |
| 未解析 | 1 |
| 合计 | 8 |

`p1` 和 `p2` 各写了 2 条评论。如果角色报告使用全部 8 条评论行，就会把这两个账户各计两次。用活动表衡量评论数量。账户构成以这 4 个个人账户身份为准。

虚构覆盖说明：上限是 8。观察到的来源页面计数是 12。在 `inputResults` 中，`stopReason` 为 `max_comments_reached`，`isComplete` 为 false。这份虚构说明不指定 `status` 或 `statusReason`。

决定：把这张 4 个账户的角色表保留为观察到的样本。只有研究需要更多覆盖时才继续收集。绝不要把这个样本称为全部 12 名参与者。不要把 12 读成 12 个个人账户身份。

虚构发现：在这个有上限的样本中，每个主要角色占 4 个观察到的个人账户身份的 25%。已知角色覆盖率是 75%。该发现只关于这个样本。它不描述全部客户。它不表明谁可以购买。

## 你要交出什么

交出这些项目。

- 个人账户表，每个账户一个主要角色。
- 编码手册，以及用作证据的准确头衔文本。
- 组织计数，位于个人账户分母之外。
- 未解析身份计数，并为任何缺失的 `commentId` 附上读者编制的标签。
- 来自 `inputResults` 的每个帖子的覆盖说明。
- 一条范围有限的发现，并写明分母和收集上限。

写明收集时间。不要用帖子的发布时间替换它。如果头衔或组织列表为空，显示未知。不要把未知变成零。

如果 `isComplete` 为 false，要说明该表不是整段讨论。如果两份头衔快照不一致，两份都显示。不要藏起你没有编码的那一份。

## 下一步

在 [LinkedIn Comments Scraper](https://apify.com/chronometrica/linkedin-comments-scraper) 中使用一个已知的公开帖子。把作者详情设为 true。把上限设为 3。把无限制设为 false。检查每个输入的 OUTPUT。把编码手册应用到已核对的账户表。参见 [LinkedIn Comment Authors with Public Profile Details](https://apify.com/chronometrica/linkedin-comments-scraper/examples/linkedin-comment-author-profile-details)。

## 来源和延伸阅读

- [LinkedIn Comments Scraper](https://apify.com/chronometrica/linkedin-comments-scraper)
- [LinkedIn Comment Authors with Public Profile Details](https://apify.com/chronometrica/linkedin-comments-scraper/examples/linkedin-comment-author-profile-details)
- [关于 LinkedIn 评论者个人资料和职位的公开问题](https://www.reddit.com/r/webscraping/comments/1d8lc31/how_would_you_scrape_the_linkedin_profiles_of/)