

# 如何移除重複職位刊登並將可能的重新刊登歸組

以來源和職位 ID 識別同一則刊登。只移除複製的匯入記錄。保留較後的觀察。以僱主、職責、地點和公開的僱主參考，把不同 ID 覆核為可能相符。保留每次歸組選擇的證據和理由。

## 核心區分與定義

刊登是在特定招聘網站上發布的一則職位帖文。職缺是僱主在現實世界中的一個底層空缺。觀察是在收集時擷取的一次數據讀取。完全複本是同一項觀察被匯入你的檔案兩次。

來源鍵結合平台來源和刊登 ID，例如 `linkedin:L101`。職位 ID 必須嚴格以文字保存。僱主參考是僱主提供的職位代碼；在有提供時，它會在職位描述或僱主頁面公開顯示。僱主可以重用這些公開代碼。覆核組收納附有已記錄理由的可能相符項目。組別是可能相符，不是已確認的空缺。

Actor 是託管的數據收集程式。

招聘網站以不同方式處理帖文。LinkedIn 把重新刊登的已關閉、已過期或已更改職位視為新的刊登實例，見 [LinkedIn 重新刊登指南](https://www.linkedin.com/help/linkedin/answer/a522249/repost-a-closed-or-expired-job)。此政策不能證明 ID 會普遍更改，也不能證明僱主的招聘意向。Indeed 把重複帖文與重新開放的職位分開，見 [Indeed 帖文完整性規則](https://www.indeed.com/help/employers/articles/job-posting-integrity-and-duplicates?co=US&hl=en)。這些規則不能證明所收集的重複刊登屬不當。Google 結構化數據規則界定僱主職位識別碼，並允許多個地點，詳見 [Google 職位刊登文件](https://developers.google.com/search/docs/appearance/structured-data/job-posting#identifier)。已核對的 Actor 合約（而非 Google 規則）界定 `jobId` 如何識別招聘網站上的職位帖文。

職位分析員在合併匯出時使用這些規則。讀者詢問 LinkedIn 上反覆重新刊登的職位是否真實空缺，見 [LinkedIn 職位重新刊登查詢](https://www.reddit.com/r/csMajors/comments/1s2pq11/linkedin_reposted_jobs/)。外部研究追蹤原始、不重複和重複的帖文，見 [Indeed 數據集分析](https://www.reddit.com/r/recruitinghell/comments/1r3a8jj/i_tracked_63336_us_job_postings_last_week_feb_26/)。這些總數是未經核實的外部背景。公開抓取工具把原始記錄擷取到數據集，見 [Apify 數據集指南](https://docs.apify.com/storage/dataset)。分析員使用這些工具收集行、移除完全重複項，並將可能的重新刊登歸組。

## Task 設定與收集設定

Task 是為 Actor 儲存的起始組態。Task 收集數據。它不分類重新刊登，也不排程執行。[將 LinkedIn 職位匯出為 CSV 或 Excel 的 Task](https://apify.com/chronometrica/linkedin-jobs-scraper/examples/export-linkedin-jobs-to-csv-or-excel) 使用 LinkedIn Actor。預設組態要求 25 個職位。[Indeed 重新刊登職位證據數據集 Task](https://apify.com/chronometrica/indeed-jobs-scraper/examples/indeed-repost-watch) 使用 Indeed Actor。其預設要求 15 頁共 500 個職位。兩項工具收集公開數據，不使用使用者登入 cookie。

收集測試樣本前先調整設定。設定你的搜尋查詢。將 `maxItems` 設為 3。將 `maxPagesPerSearch` 設為 1。將 `saveOnlyUniqueItems` 保持為 true。在 LinkedIn 上將 `fetchJobDetails` 設為 true，以收集完整描述。檢查傳回記錄上的 `descriptionStatus`。摘要片段不能確立全文相符。

`saveOnlyUniqueItems` 設定會移除單次執行內的重複刊登。它不會跨執行歸組刊登，也不會配對職缺。`maxItems` 設定作為共用的已儲存行上限。執行後覆核 OUTPUT 摘要。檢查 `jobsSaved`、`duplicatesSkipped`、`candidateItemsSeen` 和 `stopReason`。從候選項目減去已儲存職位，不會自動等於重複計數。

抓取工具以 `scrapedAt` 傳回收集時間戳。它以 `postedAtRaw` 傳回原始來源日期文字或相對時間標籤。它透過解析精確的來源日期，或從「6 days ago」這類相對文字推導時間戳，傳回 `postedAt`。保留來源精度，並同時保留兩個欄位。推導值不是精確的發布時間。覆核者從成功保留的觀察推導 `firstSeen` 和 `lastSeen` 值，而不是從內建的已復原歷史推導。收集空隙不能證明職位關閉、重新開放或職缺已填補。

## 分析員的 10 步方法

1. 保留原始匯出。編輯數據前先儲存未經更改的來源匯出。在工作副本中加入匯入檔名和行號，以便找回原始來源記錄。
2. 組成刊登鍵。結合來源名稱和文字職位 ID，例如 `linkedin:L101`。ID 以文字保存。不要跨招聘網站接合裸 ID，也不要合併空白 ID。
3. 找出複製的觀察。比較來源鍵、`scrapedAt` 和所有保留的來源值，找出完全複本。相等檢查排除匯入檔名、行號和覆核筆記。不同的來源值必須保持為獨立行以供覆核。
4. 保留較後的讀取。保留同一刊登的較後觀察。跨執行保留已更改的職責、職銜、地點和狀態欄位。不要把不同收集時間的欄位合併成一行。
5. 把缺少 ID 的記錄另置。把沒有職位 ID 的記錄移到獨立覆核表。已核對的來源 URL 或可提供身分線索。職銜、公司名稱、城市和空白欄位不能確立自動相符。
6. 建立覆核配對。只在同一已核對僱主內比較刊登。比較職銜、地點、完整職責和收集時間。修剪比較欄中的空格，但保留原始來源文字。保留團隊名稱、職級、地點和僱主參考。共用的標準僱傭文字不能證明刊登身分。不要作出自動配對的聲稱。
7. 比較刊登細節。比較完整職責、僱主參考、團隊、職級、工作類型和地點。同一僱主、職銜和城市可以屬於不同空缺。不同的僱主參考或不同職責支持它們是不同空缺。相符的僱主參考有助覆核，但僱主可以重用代碼。
8. 記錄覆核選擇。把配對標為 `same_listing`、`possible_same_vacancy`、`separate_listing` 或 `unresolved`。記錄證據、理由、覆核者姓名和覆核日期。`possible_repost` 分類需要較後的刊登 ID 和相符的職責。在不同招聘網站上同時發布的帖文是跨來源候選，不是自動的重新刊登。
9. 直接比較組成員。把每個新增成員與主要組參考比較。如果刊登 A 與刊登 B 相符，而刊登 B 與刊登 C 相符，刊登 A 不會自動與刊登 C 相符。把有衝突的刊登分開保留。
10. 分開點算記錄。把原始行、不同觀察、來源刊登鍵和可能覆核組計為各自的數字。沒有固定的時間窗或相似度分數能證明相符。

## 虛構逐步演算示例：Northshore Tools

所有示例行屬於僱主 Northshore Tools、職銜 Data Engineer、地點 Toronto。所有 ID 都是虛構標籤。僱主參考是覆核者筆記，不是 Actor 的原生欄位。表格顯示來自匯入檔的六項原始觀察。

| 匯入行 | 來源鍵 | 收集時間 | 保留的完整職責文字 |
| --- | --- | --- | --- |
| R1 | `linkedin:L101` | 2026-10-01T09:00:00Z | 匯報團隊，批次數據倉庫職責 |
| R2 | `linkedin:L101` | 2026-10-01T09:00:00Z | 匯報團隊，批次數據倉庫職責 |
| R3 | `linkedin:L101` | 2026-10-03T09:00:00Z | 匯報團隊，批次數據倉庫職責 |
| R4 | `linkedin:L202` | 2026-10-05T09:00:00Z | 匯報團隊，批次數據倉庫職責 |
| R5 | `linkedin:L303` | 2026-10-05T09:00:00Z | 產品團隊，低延遲數據職責 |
| R6 | `indeed:I90` | 2026-10-05T09:00:00Z | 匯報團隊，批次數據倉庫職責 |

行 R2 中所有底層保留的來源值與行 R1 相符，包括完整收集時間戳 `2026-10-01T09:00:00Z`。匯入行標籤不在來源值相等範圍內。行 R2 是完全複本。

行 R3 共用來源鍵 `linkedin:L101`，並包含在較後時間 `2026-10-03T09:00:00Z` 收集的相同來源值。它是同一刊登的較後讀取。將行 R3 與行 R1 一併保留。

### 歸組與計數步驟

- 原始匯入行：6 行。
- 移除完全複本：移除行 R2，因為所有來源值與行 R1 相符。
- 不同觀察：6 - 1 = 5 項有效觀察（R1、R3、R4、R5、R6）。
- 來源刊登鍵：4 個不重複刊登鍵（`linkedin:L101`、`linkedin:L202`、`linkedin:L303`、`indeed:I90`）。
- 可能覆核組：建立了 2 組。G1 組包含 `linkedin:L101`、`linkedin:L202` 和 `indeed:I90`，依據是相符的職責和覆核者筆記參考 NT-20。G2 組包含 `linkedin:L303`，依據是產品團隊職責和覆核者筆記參考 NT-21。

### 暫定覆核組決定表

| 覆核組 | 刊登鍵 | 覆核分類 | 覆核者證據與理由 |
| --- | --- | --- | --- |
| G1 | `linkedin:L101`、`linkedin:L202`、`indeed:I90` | `possible_same_vacancy` | 完整職責相符。覆核者記下描述中出現的僱主參考 NT-20。L202 是 L101 的可能重新刊登。I90 是跨來源候選。 |
| G2 | `linkedin:L303` | `separate_listing` | 職責指明產品團隊和低延遲系統。覆核者記下僱主參考 NT-21。與 G1 為分開的刊登。 |

已確認的職缺計數仍然未知。可能覆核組不能確認底層空缺的身分或目前是否仍有空缺。兩個暫定覆核組不是兩個已證明的空缺。

## 可執行的限制與分析界限

全文缺失的刊登保持標為 unresolved，直至人手覆核。當同一 ID 顯示[已更改的職責](/zh-Hant/articles/%E5%A6%82%E4%BD%95%E6%AA%A2%E6%9F%A5%E8%81%B7%E4%BD%8D%E5%88%8A%E7%99%BB%E6%A2%9D%E6%AC%BE%E6%9C%89%E5%90%A6%E8%AE%8A%E6%9B%B4/)時，在記錄中保留新的觀察。職銜相符但團隊或參考不同時，將刊登分開保留。地點不同時，覆核這些刊登是代表不同空缺，還是一則多地點帖文。

如果來源 URL 在核對期間失敗，記錄一次失敗的檢查。不要假設該職位已關閉或已填補。在筆記中保持有衝突的僱主參考可見。相對時間文字保持原有格式。小型測試執行中的重複計數為零，不能證明較大型執行沒有重複。

## 最後行動

用 [Apify LinkedIn Jobs Scraper Actor](https://apify.com/chronometrica/linkedin-jobs-scraper) 和 [將 LinkedIn 職位匯出為 CSV 或 Excel 的 Task](https://apify.com/chronometrica/linkedin-jobs-scraper/examples/export-linkedin-jobs-to-csv-or-excel) 執行小型測試。設定你的查詢，將 `maxItems` 設為 3，將 `maxPagesPerSearch` 設為 1，將 `saveOnlyUniqueItems` 設為 true，並將 `fetchJobDetails` 設為 true。

如有需要，用 [Apify Indeed Jobs Scraper Actor](https://apify.com/chronometrica/indeed-jobs-scraper) 和 [Indeed 重新刊登職位證據數據集 Task](https://apify.com/chronometrica/indeed-jobs-scraper/examples/indeed-repost-watch) 加入 Indeed 數據。保留來源名稱、文字 ID、URL、描述狀態和收集時間。套用覆核表格式，將可能的重新刊登歸組。

## 來源與延伸閱讀

- [LinkedIn 說明：重新刊登已關閉或已過期的職位](https://www.linkedin.com/help/linkedin/answer/a522249/repost-a-closed-or-expired-job)
- [Indeed 僱主說明：職位帖文完整性與重複](https://www.indeed.com/help/employers/articles/job-posting-integrity-and-duplicates?co=US&hl=en)
- [Google Search Central：職位刊登結構化數據識別碼指引](https://developers.google.com/search/docs/appearance/structured-data/job-posting#identifier)
- [Apify 文件：數據集儲存指南](https://docs.apify.com/storage/dataset)
- [Apify Actor：LinkedIn Jobs Scraper](https://apify.com/chronometrica/linkedin-jobs-scraper)
- [Apify Actor：Indeed Jobs Scraper](https://apify.com/chronometrica/indeed-jobs-scraper)
- [Apify Task 示例：將 LinkedIn 職位匯出為 CSV 或 Excel](https://apify.com/chronometrica/linkedin-jobs-scraper/examples/export-linkedin-jobs-to-csv-or-excel)
- [Apify Task 示例：Indeed 重新刊登職位證據數據集](https://apify.com/chronometrica/indeed-jobs-scraper/examples/indeed-repost-watch)
- [Reddit csMajors 討論：LinkedIn 重新刊登的職位](https://www.reddit.com/r/csMajors/comments/1s2pq11/linkedin_reposted_jobs/)
- [Reddit Recruiting Hell 討論：追蹤職位帖文](https://www.reddit.com/r/recruitinghell/comments/1r3a8jj/i_tracked_63336_us_job_postings_last_week_feb_26/)