

# Como remover anúncios de vaga duplicados e agrupar possíveis republicações

Identifique o mesmo anúncio pela origem e pelo ID da vaga. Remova somente registros de importação copiados. Mantenha as observações posteriores. Revise IDs diferentes como possíveis correspondências usando o empregador, as atribuições, o local e as referências públicas do empregador. Guarde a evidência e o motivo de cada escolha de agrupamento.

## Distinções e definições centrais

Um anúncio é uma publicação feita em um site de vagas específico. Uma vaga é a posição subjacente do empregador no mundo real. Uma observação é uma única leitura de dados capturada no momento da coleta. Uma cópia exata é exatamente a mesma observação importada duas vezes para o seu arquivo.

Uma chave de origem combina a origem da plataforma e o ID do anúncio, como `linkedin:L101`. Mantenha os IDs de vaga estritamente como texto. Uma referência do empregador é um código de vaga fornecido pelo empregador e visível ao público na descrição da vaga ou na página do empregador, quando disponível. Os empregadores podem reutilizar esses códigos públicos. Um grupo de revisão reúne possíveis correspondências com motivos registrados. Os grupos são possíveis correspondências, não vagas confirmadas.

Um Actor é um programa hospedado de coleta de dados.

Os sites de vagas tratam as publicações de formas diferentes. O LinkedIn trata uma vaga republicada que estava fechada, expirada ou alterada como uma nova instância de publicação, conforme descrito no [guia de republicação do LinkedIn](https://www.linkedin.com/help/linkedin/answer/a522249/repost-a-closed-or-expired-job). Essa política não prova mudanças universais de ID nem intenção de contratação do empregador. O Indeed separa publicações duplicadas de funções reabertas, conforme descrito nas [regras de integridade de publicação do Indeed](https://www.indeed.com/help/employers/articles/job-posting-integrity-and-duplicates?co=US&hl=en). Essas regras não provam que os anúncios repetidos coletados sejam impróprios. As regras de dados estruturados do Google definem identificadores de vaga do empregador e permitem vários locais, conforme detalhado na [documentação de anúncio de vaga do Google](https://developers.google.com/search/docs/appearance/structured-data/job-posting#identifier). O contrato conferido do Actor, e não as regras do Google, define como `jobId` identifica as publicações do site.

Analistas de vagas usam essas regras ao combinar exportações. Leitores perguntam se funções republicadas várias vezes no LinkedIn são vagas reais, como se vê em uma [consulta sobre republicação de vagas no LinkedIn](https://www.reddit.com/r/csMajors/comments/1s2pq11/linkedin_reposted_jobs/). Pesquisas externas acompanham publicações brutas, únicas e repetidas, como mostrado em uma [análise de conjunto de dados do Indeed](https://www.reddit.com/r/recruitinghell/comments/1r3a8jj/i_tracked_63336_us_job_postings_last_week_feb_26/). Esses totais são contexto externo não verificado. Coletores públicos capturam registros brutos em conjuntos de dados, conforme explicado no [guia de conjuntos de dados da Apify](https://docs.apify.com/storage/dataset). Os analistas usam essas ferramentas para coletar linhas, remover duplicatas exatas e agrupar possíveis republicações.

## Configuração da Task e da coleta

Uma Task é uma configuração inicial salva para um Actor. Uma Task coleta dados. Ela não classifica republicações nem agenda execuções. A [Export LinkedIn Jobs to CSV or Excel Task](https://apify.com/chronometrica/linkedin-jobs-scraper/examples/export-linkedin-jobs-to-csv-or-excel) usa o Actor do LinkedIn. A configuração padrão solicita 25 vagas. A [Indeed Reposted Job Evidence Dataset Task](https://apify.com/chronometrica/indeed-jobs-scraper/examples/indeed-repost-watch) usa o Actor do Indeed. A predefinição solicita 500 vagas em 15 páginas. As duas ferramentas coletam dados públicos sem cookies de login do usuário.

Ajuste as configurações antes de coletar uma amostra de teste. Defina a consulta de busca. Defina `maxItems` como 3. Defina `maxPagesPerSearch` como 1. Mantenha `saveOnlyUniqueItems` definido como true. Defina `fetchJobDetails` como true no LinkedIn para coletar descrições completas. Verifique `descriptionStatus` nos registros retornados. Trechos não podem estabelecer correspondências de texto completo.

A configuração `saveOnlyUniqueItems` remove anúncios repetidos dentro de uma única execução. Ela não agrupa anúncios entre execuções nem faz correspondência de vagas. A configuração `maxItems` funciona como um limite compartilhado de linhas salvas. Revise o resumo OUTPUT depois de uma execução. Verifique `jobsSaved`, `duplicatesSkipped`, `candidateItemsSeen` e `stopReason`. Subtrair as vagas salvas dos itens candidatos não equivale automaticamente às contagens de duplicatas.

O coletor retorna `scrapedAt` como o carimbo de data e hora da coleta. Ele retorna `postedAtRaw` como o texto original da data na origem ou o rótulo de idade relativa. Ele retorna `postedAt` ao analisar datas exatas da origem ou ao derivar um carimbo de data e hora de um texto relativo, como "6 days ago". Preserve a precisão da origem e mantenha os dois campos. Um valor derivado não é um horário exato de publicação. Os revisores derivam os valores `firstSeen` e `lastSeen` de observações retidas bem-sucedidas, não de um histórico recuperado integrado. Lacunas de coleta não provam fechamento da vaga, reabertura nem função preenchida.

## Método de 10 passos para analistas

1. Preserve as exportações brutas. Salve uma exportação de origem inalterada antes de editar os dados. Adicione nomes de arquivos de importação e números de linha na sua cópia de trabalho para poder encontrar os registros originais da origem.
2. Forme a chave do anúncio. Combine o nome da origem e o ID de vaga em texto, como `linkedin:L101`. Mantenha os IDs como texto. Não una IDs isolados entre sites nem mescle IDs em branco.
3. Encontre observações copiadas. Encontre cópias exatas comparando a chave de origem, `scrapedAt` e todos os valores de origem retidos. Exclua nomes de arquivos de importação, números de linha e notas de revisão das verificações de igualdade. Valores de origem diferentes devem permanecer como linhas separadas para revisão.
4. Preserve leituras posteriores. Mantenha observações posteriores do mesmo anúncio. Preserve atribuições, títulos, locais e campos de status alterados entre execuções. Não mescle campos de momentos de coleta diferentes em uma única linha combinada.
5. Separe os IDs ausentes. Mova registros sem ID de vaga para uma tabela de revisão separada. URLs de origem conferidas podem oferecer pistas de identidade. Títulos, nomes de empresa, cidades e campos em branco não podem estabelecer uma correspondência automática.
6. Crie pares de revisão. Compare anúncios somente dentro do mesmo empregador conferido. Compare títulos, locais, atribuições completas e momentos de coleta. Remova somente os espaços no início e no fim dos valores das colunas de comparação. Mantenha os espaços dentro dos valores e preserve o texto bruto da origem. Mantenha nomes de equipe, níveis de senioridade, locais e referências do empregador. Texto padrão de emprego compartilhado não prova a identidade do anúncio. Não faça afirmações de correspondência automática.
7. Compare os detalhes do anúncio. Compare atribuições completas, referências do empregador, equipes, senioridade, tipos de trabalho e locais. O mesmo empregador, o mesmo título e a mesma cidade podem pertencer a vagas separadas. Referências do empregador diferentes ou atribuições diferentes apoiam vagas separadas. Referências do empregador correspondentes ajudam a revisão, mas os empregadores podem reutilizar códigos.
8. Registre as escolhas de revisão. Rotule os pares como `same_listing`, `possible_same_vacancy`, `separate_listing` ou `unresolved`. Registre a evidência, os motivos, o nome do revisor e a data da revisão. Uma classificação `possible_repost` exige um ID de anúncio posterior e atribuições correspondentes. Publicações simultâneas em sites diferentes são candidatas entre origens, não republicações automáticas.
9. Compare os membros do grupo diretamente. Compare cada membro adicionado com a referência principal do grupo. Se o anúncio A corresponde ao anúncio B, e o anúncio B corresponde ao anúncio C, o anúncio A não corresponde automaticamente ao anúncio C. Mantenha anúncios conflitantes separados.
10. Conte os registros separadamente. Conte linhas brutas, observações distintas, chaves de anúncio da origem e possíveis grupos de revisão como números separados. Nenhuma janela fixa de idade nem pontuação de similaridade prova uma correspondência.

## Exemplo fictício resolvido: Northshore Tools

Todas as linhas do exemplo pertencem ao empregador Northshore Tools, ao título Data Engineer e ao local Toronto. Todos os IDs são rótulos fictícios. As referências do empregador são notas do revisor, não campos nativos do Actor. A tabela mostra seis observações brutas de arquivos de importação.

| Linha de importação | Chave de origem | Coletado em | Texto completo retido das atribuições |
| --- | --- | --- | --- |
| R1 | `linkedin:L101` | 2026-10-01T09:00:00Z | Equipe de relatórios, atribuições de data warehouse em lote |
| R2 | `linkedin:L101` | 2026-10-01T09:00:00Z | Equipe de relatórios, atribuições de data warehouse em lote |
| R3 | `linkedin:L101` | 2026-10-03T09:00:00Z | Equipe de relatórios, atribuições de data warehouse em lote |
| R4 | `linkedin:L202` | 2026-10-05T09:00:00Z | Equipe de relatórios, atribuições de data warehouse em lote |
| R5 | `linkedin:L303` | 2026-10-05T09:00:00Z | Equipe de produto, atribuições de dados de baixa latência |
| R6 | `indeed:I90` | 2026-10-05T09:00:00Z | Equipe de relatórios, atribuições de data warehouse em lote |

Todos os valores de origem retidos subjacentes na linha R2 correspondem à linha R1, inclusive o carimbo completo de coleta `2026-10-01T09:00:00Z`. Os rótulos das linhas de importação ficam fora da igualdade de valores de origem. A linha R2 é uma cópia exata.

A linha R3 compartilha a chave de origem `linkedin:L101` e contém os mesmos valores de origem coletados em um momento posterior, `2026-10-03T09:00:00Z`. É o mesmo anúncio lido depois. Mantenha a linha R3 junto com a linha R1.

### Passos de agrupamento e contagem

- Linhas brutas de importação: 6 linhas.
- Remoção de cópia exata: remova a linha R2 porque todos os valores de origem correspondem à linha R1.
- Observações distintas: 6 - 1 = 5 observações válidas (R1, R3, R4, R5, R6).
- Chaves de anúncio da origem: 4 chaves de anúncio distintas (`linkedin:L101`, `linkedin:L202`, `linkedin:L303`, `indeed:I90`).
- Possíveis grupos de revisão: 2 grupos criados. O grupo G1 contém `linkedin:L101`, `linkedin:L202` e `indeed:I90` com base em atribuições correspondentes e na referência da nota do revisor NT-20. O grupo G2 contém `linkedin:L303` com base nas atribuições da equipe de produto e na referência da nota do revisor NT-21.

### Tabela provisória de decisão dos grupos de revisão

| Grupo de revisão | Chaves de anúncio | Classificação da revisão | Evidência e motivo do revisor |
| --- | --- | --- | --- |
| G1 | `linkedin:L101`, `linkedin:L202`, `indeed:I90` | `possible_same_vacancy` | As atribuições completas correspondem. O revisor anotou a referência do empregador NT-20 nas descrições. L202 é uma possível republicação de L101. I90 é uma candidata entre origens. |
| G2 | `linkedin:L303` | `separate_listing` | As atribuições especificam equipe de produto e sistemas de baixa latência. O revisor anotou a referência do empregador NT-21. Anúncio separado de G1. |

As contagens confirmadas de vagas permanecem desconhecidas. Possíveis grupos de revisão não confirmam a identidade da vaga subjacente nem a disponibilidade atual. Dois grupos provisórios de revisão não são duas vagas comprovadas.

## Limites aplicáveis e fronteiras analíticas

Deixe anúncios com texto completo ausente marcados como não resolvidos até a revisão manual. Quando o mesmo ID mostra [atribuições alteradas](/pt-BR/articles/como-verificar-mudanca-de-termos-em-vaga/), mantenha a nova observação no seu registro. Mantenha os anúncios separados quando os títulos correspondem, mas as equipes ou as referências diferem. Para locais diferentes, revise se os anúncios representam vagas separadas ou uma publicação com vários locais.

Se uma URL de origem falhar durante a verificação, registre uma verificação que falhou. Não suponha que a posição esteja fechada ou preenchida. Mantenha referências conflitantes do empregador visíveis nas suas notas. Mantenha o texto de idade relativa no formato original. Uma contagem de duplicatas igual a zero em uma execução de teste pequena não prova que execuções maiores não contenham duplicatas.

## Ação final

Execute um teste pequeno com o [Actor Apify LinkedIn Jobs Scraper](https://apify.com/chronometrica/linkedin-jobs-scraper) e a [Export LinkedIn Jobs to CSV or Excel Task](https://apify.com/chronometrica/linkedin-jobs-scraper/examples/export-linkedin-jobs-to-csv-or-excel). Defina a consulta, defina `maxItems` como 3, defina `maxPagesPerSearch` como 1, defina `saveOnlyUniqueItems` como true e defina `fetchJobDetails` como true.

Adicione dados do Indeed com o [Actor Apify Indeed Jobs Scraper](https://apify.com/chronometrica/indeed-jobs-scraper) e a [Indeed Reposted Job Evidence Dataset Task](https://apify.com/chronometrica/indeed-jobs-scraper/examples/indeed-repost-watch), se necessário. Preserve o nome da origem, o ID em texto, a URL, o status da descrição e o momento da coleta. Aplique o formato da tabela de revisão para agrupar possíveis republicações.

## Fontes e leituras adicionais

- [Ajuda do LinkedIn: republicar uma vaga fechada ou expirada](https://www.linkedin.com/help/linkedin/answer/a522249/repost-a-closed-or-expired-job)
- [Ajuda ao empregador do Indeed: integridade de anúncios de vaga e duplicatas](https://www.indeed.com/help/employers/articles/job-posting-integrity-and-duplicates?co=US&hl=en)
- [Google Search Central: diretrizes de identificador em dados estruturados de anúncio de vaga](https://developers.google.com/search/docs/appearance/structured-data/job-posting#identifier)
- [Documentação da Apify: guia de armazenamento de conjuntos de dados](https://docs.apify.com/storage/dataset)
- [Actor da Apify: LinkedIn Jobs Scraper](https://apify.com/chronometrica/linkedin-jobs-scraper)
- [Actor da Apify: Indeed Jobs Scraper](https://apify.com/chronometrica/indeed-jobs-scraper)
- [Exemplo de Task da Apify: Export LinkedIn Jobs to CSV or Excel](https://apify.com/chronometrica/linkedin-jobs-scraper/examples/export-linkedin-jobs-to-csv-or-excel)
- [Exemplo de Task da Apify: Indeed Reposted Job Evidence Dataset](https://apify.com/chronometrica/indeed-jobs-scraper/examples/indeed-repost-watch)
- [Discussão no Reddit csMajors: vagas republicadas no LinkedIn](https://www.reddit.com/r/csMajors/comments/1s2pq11/linkedin_reposted_jobs/)
- [Discussão no Reddit Recruiting Hell: acompanhamento de anúncios de vaga](https://www.reddit.com/r/recruitinghell/comments/1r3a8jj/i_tracked_63336_us_job_postings_last_week_feb_26/)