

# 如何檢查職位刊登的條款有否變更

比較同一份公開職位的兩次已儲存全文觀察，並保留有變更的逐字原文及兩個時間。一次觀察是某一時間已儲存的一列刊登資料。這一對可以顯示所選字句在兩個儲存時間之間並不相同。它不能顯示僱主編輯該刊登的確實時間。

一項條款是你選擇核對的一句決定用語。例子包括聘用比例、僱用類型、薪酬字句，以及工作地點。聘用比例以一份全職職位為基準，表示該聘用佔這份全職職位的份額，例如刊登字句「100%」或「50%」。

## 做這 8 個步驟

1. 選擇會改變你決定的條款。

閱讀這些條款在刊登中的原文字句。職稱、可選的職級標籤，或搜尋字詞，都不是完整要求。職級可以缺漏。如果所選字句不清楚，就保持不清楚。不要猜測任何值，不論是數字還是非數字。這些步驟只涵蓋公開條款比較。它們不解釋應徵者狀態、推薦人查核，或招聘意圖。

1. 先從你的舊儲存開始，再收集一列新資料。

舊正文必須已經在你的檔案中。[Indeed Jobs Scraper](https://apify.com/chronometrica/indeed-jobs-scraper) 是一個 Actor。Actor 是託管的資料收集程式。它收集目前的公開列。它不能重建舊說明。它不提供僱主編輯時間、申請人狀態，或自動條款標籤。這裡所述的比較由你來做。

寫在職位文字裡的日期不是編輯時間。每次儲存都要保留執行識別、來源識別、輸入、scrapedAt、descriptionStatus，以及原始文字。scrapedAt 是收集該列的時間。一次執行是 Actor 運行一次。

1. 比較字句之前，先配對同一則刊登。

先配對相同的來源命名空間，以及相同的 jobId。命名空間是擁有該識別碼的網站。然後核對 jobUrl、職位，以及公司。jobId 要以文字保留。如果試算表把它存成數字，長位數可能改變。單靠相同職稱，不能證明兩列是同一個版本。

不同的來源識別碼保持 unresolved。不確定的重新刊登也保持 unresolved。該配對請用已發布的[重複與重新刊登指南](https://chronometrica.com/zh-Hant/articles/%E7%A7%BB%E9%99%A4%E9%87%8D%E8%A4%87%E8%81%B7%E4%BD%8D%E5%88%8A%E7%99%BB%E4%B8%A6%E6%AD%B8%E7%B5%84%E5%8F%AF%E8%83%BD%E9%87%8D%E6%96%B0%E5%88%8A%E7%99%BB%E7%9A%84%E8%81%B7%E4%BD%8D/)。在關係確定之前，不要比較文字。把識別衝突留在你的筆記裡。

1. 所選條款必須有可比較的文字。

尋找字句差異之前，先讀 descriptionStatus。full 表示來源文字當時可用，並已儲存在 descriptionText。missing 表示該文字當時不可用。這個 Actor 沒有 snippet 狀態。full 不保證是僱主的整份文件。

舊文字 missing 而新文字 full，是新近可用的證據。這不是僱主更改了一項要求的證明。短摘錄對上全文，可以造成虛假差異。多出的字句，可能在你尚未持有它們時已經存在。先儲存可用狀態。然後才比較段落。

1. 保留原始文字，並做一份比較用副本。

不要改動原始的 descriptionText。只為空白處理另做第二份副本。在該副本中，當意思保持不變時，合併已聲明的空白。空白是指空格、tab，以及換行。只產生同樣這些分隔的標記，可以視為相同的空白。不要移除百分比、貨幣用字、單位、否定，或其他限定語。「not」這個字可以反轉一項規則。一個百分比數值可以改變決定。

逐字儲存舊段落的原文，以及新段落的原文。如果你知道它們在來源文字中的位置，就儲存這些位置。如果位置未知，寫 unknown。不要寫 0。

1. 從所列狀態中，為所選條款指定剛好一個。

使用以下 5 個狀態之一：

- 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 編輯了刊登。其他來源處理也可以改變你看到的字句。你無法得知兩次儲存之間有多少次編輯。該次數未知。未知不是 0，也不是 1。目前這次執行不提供自動歷史。

你第一次注意到的刊登是另一項工作。那項請用已發布的[新提示指南](https://chronometrica.com/zh-Hant/articles/%E9%81%BF%E5%85%8D%E9%87%8D%E8%A4%87%E7%9A%84%E6%96%B0%E8%81%B7%E4%BD%8D%E9%80%9A%E7%9F%A5/)。刊登數量也是另一項工作。數量請用已發布的[刊登趨勢指南](https://chronometrica.com/zh-Hant/articles/%E9%87%8D%E8%A4%87%E8%81%B7%E4%BD%8D%E5%BF%AB%E7%85%A7%E9%87%8F%E5%BA%A6%E6%8B%9B%E8%81%98%E8%B6%A8%E5%8B%A2/)。

1. 交付一筆配對紀錄。

包括識別、原始段落、可用狀態、比較規則、狀態、兩個時間，以及目前的來源核對。目前的來源核對，是你閱讀時僱主官方頁面所說的內容，或一則你尚未閱讀的註記。如果一項重要條款仍然不清楚，透過你自己的流程詢問僱主聯絡人。這些步驟不發送訊息。它們不讀取私人的申請狀態。

## 儲存這些欄位

使用 Actor 的這些列欄位。可選欄位可以未提供。未提供表示沒有給出該值。這不表示 0，也不表示僱主沒有該項。

| 欄位 | 它是甚麼 |
| --- | --- |
| jobId | 來源識別。以文字保留。 |
| title | 職位名稱。它不是完整識別。 |
| companyName | 僱主名稱，用於識別核對。 |
| locationRaw | 來源所顯示的地點文字。 |
| descriptionText | 為該列儲存的刊登字句。 |
| descriptionStatus | full 或 missing，表示來源文字是否可用。 |
| jobUrl | 刊登網址，用於識別核對。 |
| query | 該列使用的搜尋字詞。 |
| searchLocation | 搜尋使用的地點。 |
| scrapedAt | Actor 儲存該列的時間。 |

seniority、employmentType、salaryRaw、postedAt 和 postedAtRaw 是可選的。其中任何一項都可以缺漏。postedAt 若存在，是來源提供的刊登時間。它不是僱主的編輯時間。descriptionText 裡的日期也不是編輯時間。

儲存原始列、已運行的輸入，以及執行輸出。同時儲存列上限或失敗執行的證明。上限是達到 maxItems 時停止收集。一次成功但沒有結果列的執行，不能證明沒有職位存在。一次達到上限的執行，不能證明你收集了每一則刊登。

## 設定一次小規模的首次執行

Task 是已儲存的輸入預設。目前的公開 Task 是起始輸入。它不是比較會自行運行的證明。公開 build 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
}
```

設定一次小規模的首次執行

首次核對時，設定 1 個目標職位和 1 個市場。為這一對設定 country 和 searchTerm。只有需要 1 個地點時才加入 location。把範圍大的列上限改為 maxItems 2 和 maxPagesPerSearch 1。postedWithinDays 和 sortBy 只限制這次執行向來源要求哪些目前刊登。它們不返回上星期的字句。saveOnlyUniqueItems 可以為 1 個項目保留 1 列目前資料。它不重建較舊的字句。你仍然需要自己較舊的儲存。

對此 build 的一次相容核對返回了 2 個來源識別碼和網址。兩列都包含可用的說明文字，並儲存在 descriptionText。該執行達到了它的上限。該核對顯示文字收集受支援。它不是以下例子的實況發現。它不表示只存在 2 份職位。

## 演練 5 對虛構例子

下面 5 對是原創虛構。它們用來說明這些狀態。它們不是 Actor 結果，也不是關於僱主的實況發現。這些虛構時間沒有給出年份。不要把它們當作 build 核對時間。

| 配對 | 可用狀態 | 識別 | 差異 | 狀態 | 下一步核對 |
| --- | --- | --- | --- | --- | --- |
| J1 | 兩次都是 full | 相同來源識別碼和職位 | 聘用字句不同 | substantive_wording_change | 覆核這些段落。然後閱讀目前的僱主官方頁面。 |
| J2 | 兩次都是 full | 同一則刊登 | 只有換行 | formatting_only | 不要把空白當作一項新條款。 |
| J3 | 先 missing，後 full | 同一則刊登 | 文字變為可用 | newly_available_text | 保留新文字。不要聲稱條款已變更。 |
| J4 | 未使用 | 不同來源識別碼，相同職稱 | 識別尚未確定 | unresolved | 停止。使用重複與重新刊登指南。 |
| J5 | 兩次都是 full | 同一則刊登 | 所選條款相符 | no_observed_change | 只報告該條款。其他條款分開核對。 |

J1 在 10 月 1 日 10:00 UTC 有 full 文字：「Full-time appointment, 100%.」相同的來源識別碼和職位在 10 月 8 日 10:00 UTC 有 full 文字：「Career appointment, 50%.」兩次儲存都是 full，所以這不是新近可用的文字。空白規則不能解釋這項變更。「Full-time」和「Career」是不同的聘用字句。「100%」和「50%」是不同的比例。狀態是 substantive_wording_change。兩個時間相隔 7 日。報告一項在 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
```

演練 5 對虛構例子

你可能在新的觀察時間閱讀 J1 目前的僱主官方頁面，並看到 50%。該次閱讀仍然不能解釋私人的招聘選擇。它不能證明你較早對聘用內容的閱讀是正確的。該證明需要已儲存的舊來源文字。

J2 在兩個時間都是 full。唯一差異是已聲明空白規則之下的換行。虛構文字如下：

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

演練 5 對虛構例子

比較用副本合併了換行。兩份副本之後都讀作「Same words stay.」。意思沒有改變。狀態是 formatting_only。不要憑這些換行報告一項新的僱用條件。

J3 的舊列說明為 missing，新列說明為 full。舊的所選條款未被觀察到。狀態是 newly_available_text。你可以保留新段落作為新證據。你不可以說僱主更改了該條款。沒有計算字句差異，因為當時沒有舊字句。

J4 有不同的來源識別碼和相同的職稱。相同職稱不是相同識別。不要把兩份正文比較成同一份職位的兩個版本。在[重複與重新刊登指南](https://chronometrica.com/zh-Hant/articles/%E7%A7%BB%E9%99%A4%E9%87%8D%E8%A4%87%E8%81%B7%E4%BD%8D%E5%88%8A%E7%99%BB%E4%B8%A6%E6%AD%B8%E7%B5%84%E5%8F%AF%E8%83%BD%E9%87%8D%E6%96%B0%E5%88%8A%E7%99%BB%E7%9A%84%E8%81%B7%E4%BD%8D/)確定該關係之前，狀態是 unresolved。如果該指南不能確定這一對，就維持 unresolved。

J5 在兩個時間都有 full 文字，所選條款的字句相同。該條款的狀態是 no_observed_change。這不是每個欄位都保持相同的證明。另一項條款仍然可以不同。每項所選條款各自核對。

這 5 對分別是 1 次實質字句變更、1 次格式變更、1 次可用狀態變更、1 次未解決識別，以及 1 項未變更條款。那是 5 個狀態，每個狀態一對。這些計數都不是市場計數。

## 下一步

為同一個職位識別碼儲存一對全文，然後在目前的僱主官方頁面核對該項重要條款。用 [Indeed Jobs Scraper](https://apify.com/chronometrica/indeed-jobs-scraper) 收集新的公開列，並從這個已儲存的 [Indeed jobs Task](https://apify.com/chronometrica/indeed-jobs-scraper/examples/indeed-jobs-scraper) 開始，使用 1 個職位、1 個市場、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-Hant/articles/%E7%A7%BB%E9%99%A4%E9%87%8D%E8%A4%87%E8%81%B7%E4%BD%8D%E5%88%8A%E7%99%BB%E4%B8%A6%E6%AD%B8%E7%B5%84%E5%8F%AF%E8%83%BD%E9%87%8D%E6%96%B0%E5%88%8A%E7%99%BB%E7%9A%84%E8%81%B7%E4%BD%8D/)
- [新提示指南](https://chronometrica.com/zh-Hant/articles/%E9%81%BF%E5%85%8D%E9%87%8D%E8%A4%87%E7%9A%84%E6%96%B0%E8%81%B7%E4%BD%8D%E9%80%9A%E7%9F%A5/)
- [刊登趨勢指南](https://chronometrica.com/zh-Hant/articles/%E9%87%8D%E8%A4%87%E8%81%B7%E4%BD%8D%E5%BF%AB%E7%85%A7%E9%87%8F%E5%BA%A6%E6%8B%9B%E8%81%98%E8%B6%A8%E5%8B%A2/)
- [公開文章](https://www.reddit.com/r/UCSD/comments/1v1r8tp/uc_san_diego_staff_hiring_references_completed/)