

# 公开的 LinkedIn 评论导出能否代表完整讨论？

在把一份 LinkedIn 评论导出当作完整讨论之前，先比较已保存行数、公开页面行数、完整性字段和停止原因。页面显示的评论数与收集到的顶层预览，统计的可能不是同一类对象。预览是公开来源界面上可见的评论。对评论的回复不在此 Actor 的行范围内。

页面显示的评论数、公开页面上暴露的条数，以及已保存的行数，是三项各自独立的计量。显示计数是页面界面所报告的总条数。公开页面暴露计数是开放网页上可见的顶层条目数。已保存行数计量的是 Actor 成功采集进你的数据集的行数。它们的单位可能不同。不要假定显示计数的构成，也不要为这些数字之间的任何缺口断言某个具体原因，因为原因可能仍未得到证明。

## 理解采集边界

要准确评估一份导出，你必须理解四个核心术语：

- 顶层评论：直接发表在主文章或动态信息流上的评论。
- 回复链：嵌套在一条已有顶层评论之下的回复。
- Actor：用于读取并提取网页的托管数据采集程序。
- Task：为采集 Actor 保存的一组运行输入。

Actor 采集网页上暴露的公开数据。如果平台把回复藏在交互菜单后面，或者必须登录账号才能显示完整讨论串的深度，这些隐藏条目就不在公开顶层导出的范围内。

数据集键包括 postUrl、postUrn、commentId、commentUrl、text、authorUrl 和 observedAt。这些键是你的行证据。输出对象 OUTPUT.inputResults 包含每个输入项的摘要字段。这些摘要字段是 status、statusReason、pageCommentCount、publicRowsOnPage、savedRows、isPublicPageComplete、isComplete 和 stopReason。

完整性字段 isComplete 描述的是这一次具体导出结果，而不是所有 Task 限制是否都已满足。字段 isPublicPageComplete 描述的是已暴露页面行的提取情况，而不是完整的对话讨论。缺失值仍然未知。如果某一行缺少 commentId，请把它保留为单独的未解决观察。绝不要做空白 ID 合并。

## 逐步核验导出覆盖范围的方法

按下面七个步骤评估公开评论导出是否满足你的研究需要。

1. 先命名你的目标指标。确定你需要的是已采集的顶层行、公开页面上暴露的行、含回复的完整讨论串，还是不同评论者的人数（每人只计一次）。
2. 按帖分组保存输出数据。把每条帖子的摘要键与其已采集的数据集行放在一起。不要在同一次运行里把不同帖子的指标混在一起。
3. 先核验输入状态。如果某个输入状态显示失败或受阻，不要把它记成零评论帖。将其计数标为未知。
4. 把已保存行与停止规则相比较。检查 stopReason 是否等于 max_comments_reached。即使页面上还有更多可见评论，数值上限也会提前停止采集。
5. 按各自的确切定义，把 publicRowsOnPage 和 isPublicPageComplete 与 pageCommentCount 相比较。公开页面完整性描述的是已暴露来源页面行的提取。导出完整性描述的是由此得到的采集结果。这两个字段都不会把顶层样本变成完整的回复树。
6. 建立一份覆盖台账。做一张表，每条帖子一行。根据每一项的状态和限制，为它指定一条纯文本决定。
7. 为完整讨论串选择经授权的来源。如果项目需要完整回复链，请使用经授权的账号集成或官方 API 工具。

当前默认 Task 输入把 collectAllAvailable 设为 true，且没有数值上限。若要做一次有界限的初次核对，把 collectAllAvailable 改为 false，并把 maxComments 设为 3。保持 includeAuthorDetails 为 false。

下面是一份有效的 JSON 纯文本配置样本，使用的是当前已保存的 Task 输入，来源为 https://www.linkedin.com/posts/timferriss_how-to-become-dramatically-more-productive-activity-7386884213343428608-wrF3. 请把整段 URL 字符串替换为你已知的公开帖子链接：

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

逐步核验导出覆盖范围的方法

一次已核对的对照运行显示：已保存 3 行、公开页面暴露 4 行、页面显示评论 4 条，isPublicPageComplete 等于 true，isComplete 等于 false，stopReason 等于 max_comments_reached。这只证明采集有界限，并不能证明完整讨论串。

有三个来源取值是为演示而编造的。三条帖子共用同一个虚构的观察时间：

- P1：pageCommentCount 为 12，publicRowsOnPage 为 6，savedRows 为 3，isPublicPageComplete 为 true，isComplete 为 false，stopReason 为 max_comments_reached。状态为 partial，statusReason 说明数值上限停止了这次导出。决定是：有上限的公开顶层样本；更大的上限可能保存更多已暴露的行，但不保证任何剩余计数。3 除以 12 所得的 25% 数值比，只是单位并不相同的数值比，不是全部不同人员（每人只计一次）的 25%，也不是已证明的对话召回。
- P2：pageCommentCount 为 20，publicRowsOnPage 为 5，savedRows 为 5，isPublicPageComplete 为 true，isComplete 为 true，stopReason 使用面向普通读者的说明：公开页面已无更多可提取内容。状态为 ok，statusReason 说明对已暴露公开页面行的提取已到末尾。决定是：接受已暴露页面样本，而不是一条完整的 20 条评论对话。相差的 15 个条目原因未经证明，也不被断言为隐藏回复。
- P3：所有计数均未知，来源结果为失败，status 为 failed，statusReason 为网络错误。决定是：采集未知；不作出零评论报告，也不设分母。

### 虚构台账

| 帖子 ID | 状态 | 状态原因 | 页面计数 | 公开行 | 已保存行 | 页面完整 | 导出完整 | 停止原因 | 决定 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| P1 | partial | 数值上限停止了这次导出 | 12 | 6 | 3 | true | false | max_comments_reached | 有上限的公开顶层样本 |
| P2 | ok | 已暴露公开页面行的提取已到末尾 | 20 | 5 | 5 | true | true | 公开页面已无更多可提取内容 | 已接受的暴露页面样本 |
| P3 | failed | 网络错误 | 未知 | 未知 | 未知 | 未知 | 未知 | 未知 | 采集未知 |

台账把 P1 的数值上限缺口、P2 的来源范围缺口和 P3 的失败核对分开。已接受的已保存行合计为 3 加 5，得到 8 条观察。P3 仍为未知，不能按零加入。读者可以把这 8 条已观察的行用于一项已说明范围的公开样本研究。不能声称这是 32 人中的 8 人，也不能声称这是全部评论中的 8 条。如果 P1 日后在更高上限下保存 6 行，请保留第二份快照，并在合并观察之前[仅按已核对的评论身份去重](/zh-Hans/articles/linkedin-%E5%B8%96%E5%AD%90-%E8%AF%84%E8%AE%BA-%E4%B8%AA%E4%BA%BA%E8%B5%84%E6%96%99-%E6%AD%A3%E7%A1%AE%E5%85%B3%E8%81%94/)。

## 下一步

打开 Task 预设 [收集公开 LinkedIn 帖子上暴露的全部评论](https://apify.com/chronometrica/linkedin-comments-scraper/examples/linkedin-all-publicly-exposed-comments)，使用 [LinkedIn Comments Scraper](https://apify.com/chronometrica/linkedin-comments-scraper) Actor，设置一个较小的数值上限，保存你的输出字段，并判断所观察到的公开页面样本是否满足你的研究需要。

## 来源和延伸阅读

- [LinkedIn Comments Scraper Actor](https://apify.com/chronometrica/linkedin-comments-scraper)
- [关于公开评论者数据的 Reddit 讨论](https://www.reddit.com/r/webscraping/comments/1d8lc31/how_would_you_scrape_the_linkedin_profiles_of/)