

# 如何核对一份公开职位的条款是否发生了变化

比较同一公开职位的两次已保存全文观察，并保留发生变化的确切用词以及两个时间。一次观察是某一时间保存的一条职位记录。这一对记录可以表明，所选词语在两次保存时间之间并不相同。它不能表明雇主编辑该职位的准确时间。

一条条款是你选择核对的一句决策用语。例子包括任职比例、雇佣类型、薪酬表述和工作地点。任职比例指该任职占一份全职工作的份额，例如职位原文中的“100%”或“50%”。

## 完成这八个步骤

1. 选择可能改变你决定的条款。

阅读这些条款在原始职位中的用词。标题、可选的资历标签或搜索词并不是完整要求。资历可以缺失。如果所选短语不清楚，就保持不清楚。不要猜测一个值。这些步骤只涵盖公开条款比较。它们不解释候选人状态、推荐人核查或招聘意图。

1. 从你的旧保存开始，再采集一条新记录。

旧正文必须已经在你的文件中。[Indeed Jobs Scraper](https://apify.com/chronometrica/indeed-jobs-scraper) 是一个 Actor。Actor 是托管的数据采集程序。它采集当前的公开记录。它不能重建旧的职位描述。它不提供雇主的编辑时间、申请人状态或自动条款标签。这里所述的比较由你来做。

写在职位正文里的日期不是编辑时间。对每次保存，保留运行标识、来源标识、输入、scrapedAt、descriptionStatus 和原始文本。scrapedAt 是采集该条记录的时间。一次运行是 Actor 的一次执行。

1. 在比较用词之前，先匹配同一条职位。

先匹配同一来源命名空间和同一 jobId。命名空间是拥有该 ID 的网站。然后核对 jobUrl、职位和公司。将 jobId 作为文本保留。如果表格把它存成数字，很长的 ID 的各位数字或其数值可能会改变。仅标题相同，不能证明两行是同一版本。

不同的来源 ID 保持未解决。不确定的重新发布也保持未解决。该匹配请使用已发布的[重复与重新发布指南](https://chronometrica.com/zh-Hans/articles/%E5%8E%BB%E9%99%A4%E9%87%8D%E5%A4%8D%E8%81%8C%E4%BD%8D%E5%88%97%E8%A1%A8-%E5%BD%92%E7%BB%84%E5%8F%AF%E8%83%BD%E7%9A%84%E9%87%8D%E6%96%B0%E5%8F%91%E5%B8%83/)。在关系确定之前，不要比较文本。把身份冲突记在你的笔记中。

1. 要求所选条款具有可比较的文本。

在寻找用词差异之前，先阅读 descriptionStatus。full 表示来源文本可用，并已保存在 descriptionText 中。missing 表示该文本不可用。这个 Actor 没有摘要状态。full 并不保证是雇主的整份文件。

旧文本缺失、新文本为 full，是新获得的证据。它不是雇主改变了某项要求的证明。短摘录对照完整正文可能制造虚假差异。那些多出来的词，可能在你尚未持有它们时就已经存在。先保存可用状态。然后再比较段落。

1. 保留原始文本，并制作一份比较用副本。

不要改动原始 descriptionText。只为处理间距制作第二份副本。在该副本中，当含义保持不变时，把已声明的空白连接起来。空白指空格、制表符和换行。你可以把只产生这些相同分隔的标记视为相同的间距。不要删除百分数、货币用词、单位、否定或其他限定语。“not”可以颠倒一条规则。一个百分数值可以改变决定。

保存确切的旧段落和确切的新段落。在你知道它们在来源文本中的位置时，保存这些位置。如果某一位置未知，就写下 unknown。不要写零。

1. 为所选条款归入一种状态。

使用以下五种状态之一：

- no_observed_change
- formatting_only
- substantive_wording_change
- newly_available_text
- unresolved

当同一职位具有完整且可比较的文本，且所选词语在含义上不同时，使用 substantive_wording_change。当只有已声明的间距不同时，使用 formatting_only。当该所选条款相同时，使用 no_observed_change。该状态不涵盖你没有阅读的字段。当旧的来源文本不可用、后来变为可用时，使用 newly_available_text。条款缺失不是文本缺失。旧的完整可比较文本中没有所选条款，而新的完整文本加入了该条款，这可以是 substantive_wording_change。当身份尚未确定时，使用 unresolved。

文本差异指向一次复核。它本身不能证明一项新的雇佣条件。在你依据任职或薪酬表述采取行动之前，先阅读雇主当前的官方页面。

1. 用平实的话报告时间界限。

写明该变化是在旧的 scrapedAt 与新的 scrapedAt 之间被观察到的。不要写雇主在新的 scrapedAt 编辑了该职位。其他来源处理也可能改变你看到的用词。你无法判断两次保存之间发生了多少次编辑。该次数是未知的。未知不是零，也不是一。当前运行不提供自动历史。

你第一次注意到的一条职位，属于另一项任务。请使用已发布的[新提醒指南](https://chronometrica.com/zh-Hans/articles/%E4%B8%8D%E9%87%8D%E5%A4%8D%E7%9A%84%E6%96%B0%E8%81%8C%E4%BD%8D%E6%8F%90%E9%86%92/)。职位条数也属于另一项任务。条数请使用已发布的[职位趋势指南](https://chronometrica.com/zh-Hans/articles/%E7%94%A8%E9%87%8D%E5%A4%8D%E8%81%8C%E4%BD%8D%E5%BF%AB%E7%85%A7%E8%A1%A1%E9%87%8F%E6%8B%9B%E8%81%98%E8%B6%8B%E5%8A%BF/)。

1. 交付一条成对记录。

包含身份、原始段落、可用状态、比较规则、状态、两个时间，以及当前来源核对。当前来源核对是你阅读时雇主官方页面所说的内容，或一条你尚未阅读的说明。如果某一项重要条款仍不清楚，请通过你自己的流程询问雇主联系人。这些步骤不发送消息。它们不读取私人申请状态。

## 保存这些字段

使用 Actor 的这些行字段。可选字段可以不存在。不存在表示该值未被提供。它不表示零，也不表示雇主没有该项。

| 字段 | 它是什么 |
| --- | --- |
| jobId | 来源身份。将其作为文本保留。 |
| title | 职位名称。它不是完整身份。 |
| companyName | 雇主名称，用于身份核对。 |
| locationRaw | 地点文本，按来源所显示的样子。 |
| descriptionText | 为该行保存的职位用词。 |
| descriptionStatus | full 或 missing，表示可用的来源文本。 |
| jobUrl | 职位地址，用于身份核对。 |
| query | 用于该行的搜索词。 |
| searchLocation | 搜索中使用的地点。 |
| scrapedAt | Actor 保存该行的时间。 |

seniority、employmentType、salaryRaw、postedAt 和 postedAtRaw 是可选的。其中任何一项都可以缺失。postedAt 在存在时，是来源给出的发布时间。它不是雇主的编辑时间。descriptionText 内的日期也不是编辑时间。

保存原始行、所运行的输入，以及运行输出。同时保存行上限的证明，或一次失败运行的证明。上限是 maxItems 停止条件。一次成功的空运行并不能证明没有职位存在。一次达到上限的运行并不能证明你采集了每一条职位。

## 设定一次小型的首次运行

Task 是已保存的输入预设。当前公开 Task 是一份起始输入。它不是比较会自行运行的证明。公开版本 1.2.14 已于 2026-10-13T05:55:51.545104+00:00 接受检查。它接受 searchTerm、country、location、maxItems、maxPagesPerSearch、postedWithinDays、sortBy 和 saveOnlyUniqueItems。

已保存的 Task 输入是：

```json
{
  "country": "us",
  "searchTerm": "software engineer",
  "maxItems": 100,
  "postedWithinDays": "7",
  "sortBy": "date",
  "maxPagesPerSearch": 2,
  "saveOnlyUniqueItems": true
}
```

设定一次小型的首次运行

对于首次核对，设定一个目标职位和一个市场。为这一对设定 country 和 searchTerm。只有在你需要一个地点时才添加 location。用 maxItems 2 和 maxPagesPerSearch 1 替换宽泛的行上限。postedWithinDays 和 sortBy 只限制该运行请求哪些当前职位。它们不返回上周的用词。saveOnlyUniqueItems 可以为一个项目保留一条当前记录。它不重建更早的用词。你仍然需要你自己更早的保存。

对该版本的一次兼容检查返回了两个来源 ID 和 URL。两行都有完整的 descriptionText。该运行达到了上限。该检查表明文本采集是受支持的。它不是下方例子的实时发现。它并不表示只存在两份职位。

## 演算这五对虚构例子

下方五对是原创虚构。它们用来讲授这些状态。它们不是 Actor 的结果，也不是雇主方面的发现。这些虚构时间没有给出年份。不要把它们当作版本检查的时间。

| 配对 | 可用情况 | 身份 | 差异 | 状态 | 下一步核对 |
| --- | --- | --- | --- | --- | --- |
| J1 | 两次均为 full | 相同的来源 ID 和职位 | 任职用词不同 | substantive_wording_change | 复核这些段落。然后阅读雇主当前的官方页面。 |
| J2 | 两次均为 full | 同一条职位 | 仅换行 | formatting_only | 不要把间距当作一条新条款。 |
| J3 | 先为 missing，后为 full | 同一条职位 | 文本变为可用 | newly_available_text | 保留新文本。不要声称条款已改变。 |
| J4 | 未使用 | 不同的来源 ID，相同的标题 | 身份尚未确定 | unresolved | 停止。使用重复与重新发布指南。 |
| J5 | 两次均为 full | 同一条职位 | 所选条款相符 | no_observed_change | 只报告该条款。其他条款另行核对。 |

J1 在 10月1日 10:00 UTC 有全文：“Full-time appointment, 100%.”同一来源 ID 和职位在 10月8日 10:00 UTC 有全文：“Career appointment, 50%.”两次保存都是 full，因此这不是新获得的文本。间距规则不能解释这一变化。“Full-time”和“Career”是不同的任职用词。“100%”和“50%”是不同的比例。状态是 substantive_wording_change。两个时间相隔七天。报告在 10月1日 10:00 UTC 与 10月8日 10:00 UTC 之间观察到的一次变化。不要把 10月8日称为雇主的编辑时间。不要解释用词为何改变。两次保存之间的编辑次数是未知的。

J1 的一条成对记录可以像这样：

```text
identity: same fictional source jobId both times; role matches; company and jobUrl are not supplied
old scrapedAt: October 1 10:00 UTC
new scrapedAt: October 8 10:00 UTC
descriptionStatus: full / full
old passage: Full-time appointment, 100%.
new passage: Career appointment, 50%.
positions: unknown
comparison rule: raw text kept; spacing rule does not remove percentages or appointment words
state: substantive_wording_change
time reading: change observed between the two scrapedAt values
current source check: not done in the fiction
```

演算这五对虚构例子

你可能会在新的观察时间阅读 J1 的雇主当前官方页面，并看到 50%。这一阅读仍然不能解释非公开的招聘决定。它不能证明你更早对任职表述的理解是正确的。要得到该证明，你需要已保存的旧来源文本。

J2 在两个时间都是 full。唯一的差异是在已声明空白规则下的换行。虚构文本是：

```text
old: "Same words stay."
new: "Same words\nstay."
```

演算这五对虚构例子

比较用副本把换行连接起来。两份副本随后都读作“Same words stay.”含义没有改变。状态是 formatting_only。不要根据这些换行报告一项新的雇佣条件。

J3 的旧行缺少描述，新行有完整描述。旧的所选条款未被观察到。状态是 newly_available_text。你可以把新段落作为新证据保留。你不可以说雇主改变了该条款。用词差异未被计算，因为这些用词在已保存的旧记录中不可用。

J4 具有不同的来源 ID 和相同的标题。标题相同不是身份相同。不要把两段正文当作一份职位的两个版本来比较。在[重复与重新发布指南](https://chronometrica.com/zh-Hans/articles/%E5%8E%BB%E9%99%A4%E9%87%8D%E5%A4%8D%E8%81%8C%E4%BD%8D%E5%88%97%E8%A1%A8-%E5%BD%92%E7%BB%84%E5%8F%AF%E8%83%BD%E7%9A%84%E9%87%8D%E6%96%B0%E5%8F%91%E5%B8%83/)确定该关系之前，状态是 unresolved。如果该指南不能确定这一对，就让它保持 unresolved。

J5 在两个时间都有全文，且所选条款的用词相同。对该条款，状态是 no_observed_change。这不是每个字段都保持相同的证明。另一条条款仍可能不同。逐一核对每个所选条款。

这五对给出一次实质性用词变化、一次仅格式变化、一次可用状态变化、一次未解决的身份，以及一条未变化的条款。这是五种状态，每种各一对。这些计数都不是市场计数。

## 下一步

为同一个职位 ID 保存一对全文，然后在雇主当前的官方页面上核对那项重要条款。用 [Indeed Jobs Scraper](https://apify.com/chronometrica/indeed-jobs-scraper) 采集新的公开记录，并从这份已保存的 [Indeed jobs Task](https://apify.com/chronometrica/indeed-jobs-scraper/examples/indeed-jobs-scraper) 开始：一个职位、一个市场、maxItems 2，以及 maxPagesPerSearch 1。

## 来源和延伸阅读

- [Indeed Jobs Scraper Actor](https://apify.com/chronometrica/indeed-jobs-scraper)
- [Indeed Jobs Scraper Task](https://apify.com/chronometrica/indeed-jobs-scraper/examples/indeed-jobs-scraper)
- [重复与重新发布指南](https://chronometrica.com/zh-Hans/articles/%E5%8E%BB%E9%99%A4%E9%87%8D%E5%A4%8D%E8%81%8C%E4%BD%8D%E5%88%97%E8%A1%A8-%E5%BD%92%E7%BB%84%E5%8F%AF%E8%83%BD%E7%9A%84%E9%87%8D%E6%96%B0%E5%8F%91%E5%B8%83/)
- [新提醒指南](https://chronometrica.com/zh-Hans/articles/%E4%B8%8D%E9%87%8D%E5%A4%8D%E7%9A%84%E6%96%B0%E8%81%8C%E4%BD%8D%E6%8F%90%E9%86%92/)
- [职位趋势指南](https://chronometrica.com/zh-Hans/articles/%E7%94%A8%E9%87%8D%E5%A4%8D%E8%81%8C%E4%BD%8D%E5%BF%AB%E7%85%A7%E8%A1%A1%E9%87%8F%E6%8B%9B%E8%81%98%E8%B6%8B%E5%8A%BF/)
- [公开帖子](https://www.reddit.com/r/UCSD/comments/1v1r8tp/uc_san_diego_staff_hiring_references_completed/)