Files
Prospeccao_SeConectai/Schema/etapas/03-motor-scraper-playwright.md
T
2026-10-01 11:00:47 -03:00

34 lines
2.8 KiB
Markdown

# Etapa 03 — Motor de scraper com Playwright
## Objetivo
Implementar o módulo `scraper/` responsável por abrir o navegador, buscar no Google Maps pelo termo e localização informados, rolar o painel de resultados até esgotar os leads e extrair os dados brutos de cada card.
## Contexto
Nesta etapa ainda **não** há rotação de proxy nem delays humanizados sofisticados (isso é a etapa 05) — o objetivo aqui é o motor de extração funcionar de ponta a ponta em um ambiente controlado, sem se preocupar ainda com bloqueio. Também não há padronização dos dados ainda (etapa 04) — os dados saem brutos, exatamente como capturados da página.
## Tarefas
1. Adicionar a dependência do Playwright for Java ao projeto e rodar o comando de instalação dos browsers (`mvn exec:java -e -D exec.mainClass=com.microsoft.playwright.CLI -D exec.args="install chromium"` ou equivalente)
2. Criar `scraper/GoogleMapsScraperService`, responsável por:
- Abrir uma nova instância de navegador Chromium (headless configurável via propriedade, para permitir debug visual em dev)
- Navegar até `google.com/maps`, localizar o campo de busca, digitar `termo_busca + localizacao` e submeter
- Aguardar o painel de resultados lateral carregar
3. Criar `scraper/ScrollExtractorService`, responsável por:
- Rolar o painel de resultados (não a página inteira) em incrementos, aguardando carregamento entre cada scroll
- Detectar o fim da lista (quando o número de resultados carregados para de crescer após N tentativas de scroll)
4. Criar `scraper/LeadRawExtractor`, responsável por:
- Para cada card de resultado, extrair via seletor: nome, categoria (texto bruto), endereço (texto bruto), telefone (texto bruto), site, `place_id` (se disponível na URL/atributo do elemento), avaliação
- Retornar uma lista de DTOs `LeadBrutoDTO` (sem nenhuma padronização ainda)
5. Criar `scraper/BuscaOrchestrator`, que:
- Recebe uma `Busca` (entidade), executa os passos acima em sequência, e retorna a lista de `LeadBrutoDTO` extraída
- Captura exceções de forma que uma falha em um card não interrompa a extração dos demais
6. Testar manualmente com pelo menos 3 combinações diferentes de termo/localização, incluindo um caso com poucos resultados (< 10) e um com muitos (> 50, para validar o scroll)
## Critérios de aceite
- [ ] Motor consegue abrir o Maps, buscar e extrair resultados de uma busca simples de ponta a ponta
- [ ] Scroll continua até esgotar os resultados reais (validado manualmente comparando com o número exibido no Maps)
- [ ] Extração captura nome, telefone bruto, endereço bruto, categoria bruta, site e `place_id` quando disponíveis
- [ ] Falha em um único card não derruba a extração dos demais
- [ ] Testado com pelo menos 3 buscas diferentes de ramos/localizações distintas