

# Cómo quitar avisos de empleo duplicados y agrupar posibles republicaciones

Identificá el mismo aviso por su origen y su ID de empleo. Quitá solo los registros de importación copiados. Conservá las observaciones posteriores. Revisá los ID distintos como posibles coincidencias según el empleador, las tareas, la ubicación y las referencias públicas del empleador. Conservá la evidencia y el motivo de cada decisión de agrupación.

## Distinciones centrales y definiciones

Un aviso es una publicación de una bolsa, publicada en una bolsa de empleo específica. Una vacante es una posición abierta subyacente del empleador en el mundo real. Una observación es una sola lectura de datos capturada en el momento de la recolección. Una copia exacta es exactamente la misma observación importada dos veces en tu archivo.

Una clave de origen combina la plataforma de origen y el ID del aviso, por ejemplo `linkedin:L101`. Conservá los ID de empleo estrictamente como texto. Una referencia del empleador es un código de empleo provisto por el empleador, visible de forma pública en la descripción del empleo o en la página del empleador cuando está disponible. Los empleadores pueden reutilizar estos códigos públicos. Un grupo de revisión reúne posibles coincidencias con los motivos registrados. Los grupos son posibles coincidencias, no vacantes confirmadas.

Un Actor es un programa alojado de recolección de datos.

Las bolsas de empleo tratan las publicaciones de distintas maneras. LinkedIn trata un empleo cerrado, vencido o modificado que se vuelve a publicar como una nueva instancia de publicación, según la [guía de republicación de LinkedIn](https://www.linkedin.com/help/linkedin/answer/a522249/repost-a-closed-or-expired-job). Esta política no prueba cambios universales de ID ni la intención de contratación del empleador. Indeed separa las publicaciones duplicadas de los puestos reabiertos, como se indica en las [reglas de integridad de publicaciones de Indeed](https://www.indeed.com/help/employers/articles/job-posting-integrity-and-duplicates?co=US&hl=en). Estas reglas no prueban que los avisos repetidos recolectados sean indebidos. Las reglas de datos estructurados de Google definen identificadores de empleo del empleador y permiten varias ubicaciones, como se detalla en la [documentación de publicaciones de empleo de Google](https://developers.google.com/search/docs/appearance/structured-data/job-posting#identifier). El contrato comprobado del Actor, y no las reglas de Google, define cómo `jobId` identifica las publicaciones de la bolsa.

Los analistas de empleo usan estas reglas al combinar exportaciones. Los lectores preguntan si los puestos republicados de forma repetida en LinkedIn son vacantes reales, como se ve en una [consulta sobre empleos republicados en LinkedIn](https://www.reddit.com/r/csMajors/comments/1s2pq11/linkedin_reposted_jobs/). La investigación externa sigue publicaciones en bruto, distintas y repetidas, como se muestra en un [análisis de un conjunto de datos de Indeed](https://www.reddit.com/r/recruitinghell/comments/1r3a8jj/i_tracked_63336_us_job_postings_last_week_feb_26/). Esos totales son contexto externo no verificado. Los scrapers públicos capturan registros en bruto en conjuntos de datos, como se explica en la [guía de conjuntos de datos de Apify](https://docs.apify.com/storage/dataset). Los analistas usan estas herramientas para recolectar filas, quitar duplicados exactos y agrupar posibles republicaciones.

## Configuración de la tarea y de la recolección

Una Task es una configuración inicial guardada para un Actor. Una Task recolecta datos. No clasifica republicaciones ni programa ejecuciones. La [Export LinkedIn Jobs to CSV or Excel Task](https://apify.com/chronometrica/linkedin-jobs-scraper/examples/export-linkedin-jobs-to-csv-or-excel) usa el Actor de LinkedIn. La configuración predeterminada solicita 25 empleos. La [Indeed Reposted Job Evidence Dataset Task](https://apify.com/chronometrica/indeed-jobs-scraper/examples/indeed-repost-watch) usa el Actor de Indeed. Su ajuste preestablecido solicita 500 empleos en 15 páginas. Ambas herramientas recolectan datos públicos sin cookies de inicio de sesión del usuario.

Ajustá la configuración antes de recolectar una muestra de prueba. Definí tu consulta de búsqueda. Definí `maxItems` en 3. Definí `maxPagesPerSearch` en 1. Mantené `saveOnlyUniqueItems` en true. Definí `fetchJobDetails` en true en LinkedIn para recolectar las descripciones completas. Revisá `descriptionStatus` en los registros devueltos. Los fragmentos no pueden establecer coincidencias del texto completo.

El ajuste `saveOnlyUniqueItems` quita avisos repetidos dentro de una sola ejecución. No agrupa avisos entre ejecuciones ni hace coincidir vacantes. El ajuste `maxItems` actúa como un tope compartido de filas guardadas. Revisá el resumen de OUTPUT después de una ejecución. Revisá `jobsSaved`, `duplicatesSkipped`, `candidateItemsSeen` y `stopReason`. Restar los empleos guardados de los ítems candidatos no equivale de forma automática a los recuentos de duplicados.

El scraper devuelve `scrapedAt` como la marca de tiempo de la recolección. Devuelve `postedAtRaw` como el texto original de la fecha de origen o la etiqueta de antigüedad relativa. Devuelve `postedAt` al interpretar fechas exactas de origen o al derivar una marca de tiempo a partir de texto relativo como "6 days ago". Conservá la precisión del origen y mantené ambos campos. Un valor derivado no es una hora exacta de publicación. Quienes revisan derivan los valores `firstSeen` y `lastSeen` de las observaciones exitosas que se retienen, no de un historial recuperado incorporado. Los huecos de recolección no prueban el cierre del empleo, la reapertura ni un puesto cubierto.

## Método de 10 pasos para analistas

1. Conservá las exportaciones en bruto. Guardá una exportación de origen sin cambios antes de editar los datos. Agregá los nombres de los archivos de importación y los números de fila en tu copia de trabajo para poder encontrar los registros originales de origen.
2. Formá la clave del aviso. Combiná el nombre del origen y el ID de empleo en texto, por ejemplo `linkedin:L101`. Conservá los ID como texto. No unas ID sin prefijo de bolsa entre bolsas ni combines ID en blanco.
3. Encontrá las observaciones copiadas. Encontrá las copias exactas al comparar la clave de origen, `scrapedAt` y todos los valores de origen retenidos. Excluí de las comprobaciones de igualdad los nombres de archivos de importación, los números de fila y las notas de revisión. Los valores de origen distintos deben quedar como filas separadas para revisión.
4. Conservá las lecturas posteriores. Conservá las observaciones posteriores del mismo aviso. Preservá los cambios de tareas, títulos, ubicaciones y campos de estado entre ejecuciones. No fusiones campos de distintos momentos de recolección en una sola fila combinada.
5. Apartá los ID que faltan. Mové los registros sin ID de empleo a una tabla de revisión separada. Las URL de origen comprobadas pueden ofrecer indicios de identidad. Los títulos, los nombres de empresa, las ciudades y los campos en blanco no pueden establecer una coincidencia automática.
6. Creá pares de revisión. Compará avisos solo dentro del mismo empleador comprobado. Compará títulos, ubicaciones, tareas completas y momentos de recolección. Recortá los espacios en las columnas de comparación, pero preservá el texto de origen en bruto. Conservá los nombres de equipo, los niveles de seniority del puesto, las ubicaciones y las referencias del empleador. Un texto estándar de empleo compartido no prueba la identidad del aviso. No hagas afirmaciones de coincidencia automática.
7. Compará los detalles del aviso. Compará las tareas completas, las referencias del empleador, los equipos, el nivel de seniority del puesto, los tipos de trabajo y las ubicaciones. El mismo empleador, el mismo título y la misma ciudad pueden pertenecer a vacantes separadas. Referencias del empleador distintas o tareas distintas respaldan vacantes separadas. Las referencias del empleador que coinciden ayudan a la revisión, pero los empleadores pueden reutilizar códigos.
8. Registrá las decisiones de revisión. Etiquetá los pares como `same_listing`, `possible_same_vacancy`, `separate_listing` o `unresolved`. Registrá la evidencia, los motivos, el nombre de quien revisa y la fecha de revisión. Una clasificación `possible_repost` exige un ID de aviso posterior y tareas que coincidan. Las publicaciones simultáneas en distintas bolsas son candidatas entre orígenes, no republicaciones automáticas.
9. Compará los miembros del grupo de forma directa. Compará cada miembro agregado con la referencia principal del grupo. Si el aviso A coincide con el aviso B, y el aviso B coincide con el aviso C, el aviso A no coincide de forma automática con el aviso C. Mantené separados los avisos en conflicto.
10. Contá los registros por separado. Contá las filas en bruto, las observaciones distintas, las claves de aviso de origen y los posibles grupos de revisión como números separados. Ninguna ventana fija de antigüedad ni ningún puntaje de similitud prueba una coincidencia.

## Ejemplo resuelto de ficción: Northshore Tools

Todas las filas del ejemplo pertenecen al empleador Northshore Tools, al título Data Engineer y a la ubicación Toronto. Todos los ID son etiquetas de ficción. Las referencias del empleador son notas de quien revisa, no campos nativos del Actor. La tabla muestra seis observaciones en bruto de archivos de importación.

| Fila de importación | Clave de origen | Recolectado en | Texto completo retenido de las tareas |
| --- | --- | --- | --- |
| R1 | `linkedin:L101` | 2026-10-01T09:00:00Z | Equipo de reportes, tareas de almacén de datos por lotes |
| R2 | `linkedin:L101` | 2026-10-01T09:00:00Z | Equipo de reportes, tareas de almacén de datos por lotes |
| R3 | `linkedin:L101` | 2026-10-03T09:00:00Z | Equipo de reportes, tareas de almacén de datos por lotes |
| R4 | `linkedin:L202` | 2026-10-05T09:00:00Z | Equipo de reportes, tareas de almacén de datos por lotes |
| R5 | `linkedin:L303` | 2026-10-05T09:00:00Z | Equipo de producto, tareas de datos de baja latencia |
| R6 | `indeed:I90` | 2026-10-05T09:00:00Z | Equipo de reportes, tareas de almacén de datos por lotes |

Todos los valores de origen retenidos de la fila R2 coinciden con los de la fila R1, incluida la marca de tiempo completa de recolección `2026-10-01T09:00:00Z`. Las etiquetas de fila de importación quedan fuera de la igualdad de valores de origen. La fila R2 es una copia exacta.

La fila R3 comparte la clave de origen `linkedin:L101` y contiene los mismos valores de origen, recolectados en un momento posterior: `2026-10-03T09:00:00Z`. Es el mismo aviso leído más tarde. Conservá la fila R3 junto con la fila R1.

### Pasos de agrupación y recuento

- Filas de importación en bruto: 6 filas.
- Quita de la copia exacta: quitá la fila R2 porque todos los valores de origen coinciden con la fila R1.
- Observaciones distintas: 6 - 1 = 5 observaciones válidas (R1, R3, R4, R5, R6).
- Claves de aviso de origen: 4 claves de aviso distintas (`linkedin:L101`, `linkedin:L202`, `linkedin:L303`, `indeed:I90`).
- Posibles grupos de revisión: se crearon 2 grupos. El grupo G1 contiene `linkedin:L101`, `linkedin:L202` e `indeed:I90` por las tareas coincidentes y la referencia NT-20 de la nota de quien revisa. El grupo G2 contiene `linkedin:L303` por las tareas del equipo de producto y la referencia NT-21 de la nota de quien revisa.

### Tabla provisional de decisiones de los grupos de revisión

| Grupo de revisión | Claves de aviso | Clasificación de la revisión | Evidencia y motivo de quien revisa |
| --- | --- | --- | --- |
| G1 | `linkedin:L101`, `linkedin:L202`, `indeed:I90` | `possible_same_vacancy` | Las tareas completas coinciden. Quien revisa registró la referencia del empleador NT-20 que figura en las descripciones. L202 es una posible republicación de L101. I90 es una candidata entre orígenes. |
| G2 | `linkedin:L303` | `separate_listing` | Las tareas especifican el equipo de producto y sistemas de baja latencia. Quien revisa anotó la referencia del empleador NT-21. Aviso separado de G1. |

Los recuentos de vacantes confirmadas siguen sin conocerse. Los posibles grupos de revisión no confirman la identidad de la vacante subyacente ni la disponibilidad actual. Dos grupos de revisión provisionales no son dos vacantes probadas.

## Límites para la acción y límites del análisis

Dejá los avisos sin texto completo marcados como no resueltos hasta la revisión manual. Cuando el mismo ID muestra [tareas modificadas](/es/articles/como-comprobar-si-un-aviso-de-empleo-cambio-sus-terminos/), conservá la nueva observación en tu registro. Mantené los avisos separados cuando los títulos coinciden, pero los equipos o las referencias difieren. Para ubicaciones distintas, revisá si los avisos representan vacantes separadas o una sola publicación de varias ubicaciones.

Si una URL de origen falla durante la verificación, registrá una comprobación fallida. No supongas que el puesto está cerrado o cubierto. Mantené visibles en tus notas las referencias del empleador que están en conflicto. Conservá el texto de antigüedad relativa en su formato original. Un recuento de cero duplicados en una ejecución de prueba pequeña no prueba que las ejecuciones más grandes no contengan duplicados.

## Acción final

Ejecutá una prueba pequeña con el [Apify LinkedIn Jobs Scraper Actor](https://apify.com/chronometrica/linkedin-jobs-scraper) y la [Export LinkedIn Jobs to CSV or Excel Task](https://apify.com/chronometrica/linkedin-jobs-scraper/examples/export-linkedin-jobs-to-csv-or-excel). Definí tu consulta, definí `maxItems` en 3, definí `maxPagesPerSearch` en 1, definí `saveOnlyUniqueItems` en true y definí `fetchJobDetails` en true.

Agregá datos de Indeed con el [Apify Indeed Jobs Scraper Actor](https://apify.com/chronometrica/indeed-jobs-scraper) y la [Indeed Reposted Job Evidence Dataset Task](https://apify.com/chronometrica/indeed-jobs-scraper/examples/indeed-repost-watch) si hace falta. Conservá el nombre del origen, el ID en texto, la URL, el estado de la descripción y el momento de la recolección. Aplicá el formato de la tabla de revisión para agrupar posibles republicaciones.

## Fuentes y lecturas adicionales

- [Ayuda de LinkedIn: volver a publicar un empleo cerrado o vencido](https://www.linkedin.com/help/linkedin/answer/a522249/repost-a-closed-or-expired-job)
- [Ayuda para empleadores de Indeed: integridad de las publicaciones de empleo y duplicados](https://www.indeed.com/help/employers/articles/job-posting-integrity-and-duplicates?co=US&hl=en)
- [Google Search Central: pautas del identificador en los datos estructurados de Job Posting](https://developers.google.com/search/docs/appearance/structured-data/job-posting#identifier)
- [Documentación de Apify: guía de almacenamiento de conjuntos de datos](https://docs.apify.com/storage/dataset)
- [Actor de Apify: LinkedIn Jobs Scraper](https://apify.com/chronometrica/linkedin-jobs-scraper)
- [Actor de Apify: Indeed Jobs Scraper](https://apify.com/chronometrica/indeed-jobs-scraper)
- [Ejemplo de Task de Apify: Export LinkedIn Jobs to CSV or Excel](https://apify.com/chronometrica/linkedin-jobs-scraper/examples/export-linkedin-jobs-to-csv-or-excel)
- [Ejemplo de Task de Apify: Indeed Reposted Job Evidence Dataset](https://apify.com/chronometrica/indeed-jobs-scraper/examples/indeed-repost-watch)
- [Debate de Reddit en csMajors: empleos republicados en LinkedIn](https://www.reddit.com/r/csMajors/comments/1s2pq11/linkedin_reposted_jobs/)
- [Debate de Reddit en Recruiting Hell: seguimiento de publicaciones de empleo](https://www.reddit.com/r/recruitinghell/comments/1r3a8jj/i_tracked_63336_us_job_postings_last_week_feb_26/)