Esta é uma API REST simples, desenvolvida em Java com Spring Boot, com o principal objetivo de aprender e praticar técnicas de web scraping.
A API consulta múltiplos marketplaces (atualmente Mercado Livre e Magazine Luiza) em busca de um produto informado pelo usuário. Ela extrai as informações, aplica um filtro inteligente para remover produtos com avaliações baixas ou poucas avaliações, e retorna uma lista consolidada e paginada, ordenada do produto mais barato para o mais caro.
- Scraping de Múltiplos Marketplaces: Coleta dados de diferentes e-commerces usando o padrão de projeto Strategy.
-
Normalização de Busca com IA: Utiliza Spring AI (com Google Gemini) para normalizar o termo de busca do usuário (ex: "ps5 1tb"
$\rightarrow$ "Sony Playstation 5"), melhorando a precisão do scraping. - Filtragem Inteligente de Produtos: Apenas produtos que atendem a critérios mínimos de qualidade são retornados. (Veja Regras de Filtragem).
- Classificação por Preço: Os resultados são sempre ordenados do menor para o maior preço atual.
-
Paginação: Os resultados são retornados em um formato paginado (
PageableDto) padrão do Spring. -
Processamento Paralelo: As estratégias de scraping de cada site são executadas em paralelo (
parallelStream()) para otimizar o tempo de resposta. -
Cache de Resultados: Implementa cache com Spring Cache (
@Cacheable) distribuído usando Redis para evitar requisições repetidas ao mesmo termo de busca. -
Técnicas Anti-Bloqueio:
- Utiliza Selenium para renderizar JavaScript e simular um navegador real.
- Configura
User-AgenteReferer(Google) para parecer um usuário legítimo. - Possui infraestrutura para rotação de Proxy (via
ProxyProvider).
Esta seção é baseada no seu pom.xml:
-
Core (Backend)
- Java 21
-
Spring Boot 3.x (
spring-boot-starter-web): Framework principal para criação da API REST. -
Spring Data JPA (
spring-data-jpa): Para persistência de dados e paginação (embora o JPA não seja usado ativamente no scraping,Pageablevem dele).
-
Web Scraping
-
Selenium (
selenium-java): Para automação de navegador (Chrome) e execução de JavaScript. -
Jsoup (
jsoup): Para fazer o parsing do HTML retornado pelo Selenium. -
WebDriverManager (
webdrivermanager): Para gerenciar automaticamente os drivers do navegador (ex: ChromeDriver).
-
Selenium (
-
Inteligência Artificial
-
Spring AI (
spring-ai-starter-model-google-genai): Para integração com modelos de IA, especificamente o Google Gemini, para normalização de buscas.
-
Spring AI (
-
Cache
-
Spring Boot Cache (
spring-boot-starter-cache): Abstração de cache do Spring. -
Spring Data Redis (
spring-boot-starter-data-redis): Implementação do cache utilizando Redis.
-
Spring Boot Cache (
-
Utilitários & Helpers
- Lombok: Para reduzir código boilerplate (ex: construtores, getters, setters).
-
ModelMapper: Para mapeamento/conversão de objetos (ex: Model
$\rightarrow$ DTO). -
Spring Dotenv: Para carregar variáveis de ambiente a partir de um arquivo
.env. - Spring DevTools: Para live-reload e outras facilidades em ambiente de desenvolvimento.
-
Build
- Maven: Gerenciador de dependências e build do projeto.
O fluxo da aplicação é o seguinte:
- O cliente faz uma requisição
GET /products/find-by-name?name=termo_de_busca. - O
GeminiServicerecebe otermo_de_busca(ex: "celular sansung s24") e o normaliza para um termo oficial (ex: "Samsung Galaxy S24"). - O
ProductServicerecebe o nome normalizado e verifica se já existe um resultado em cache (no Redis). - Se não houver cache:
- O serviço aciona todas as
ScrapingStrategy(MercadoLivre, MagazineLuiza) em paralelo. - Cada estratégia usa o
SeleniumPageFetcherpara abrir a URL de busca, aguardar o carregamento do conteúdo dinâmico (waitLocator) e obter o HTML. - O Jsoup é usado para fazer o parsing do HTML e extrair os dados de cada produto.
- O serviço aciona todas as
- Após a coleta:
- O
ProductServiceconsolida todos os produtos encontrados. - Aplica o filtro
isProductValid()em cada produto. - Ordena a lista final pelo preço (
currentPrice).
- O
- O resultado é salvo no cache do Redis, paginado (usando
Pageable) e retornado como umPageableDtoJSON para o usuário.
- Java (JDK) 21 ou superior
- Maven
- Uma instância do Redis em execução
- Uma chave de API do Google Gemini (para o
GeminiService)
git clone [https://github.com/seu-usuario/seu-repositorio.git](https://github.com/seu-usuario/seu-repositorio.git)
cd seu-repositorioCrie um arquivo .env na raiz do projeto (ou configure as propriedades em application.properties) com sua chave da API do Gemini e os dados de conexão do Redis:
# .env
# Spring AI - Google Gemini
GEMINI_API_KEY=SUA_CHAVE_API_AQUIRetorna uma lista paginada de produtos filtrados e ordenados.
URL: /products/find-by-name
Método: GET
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
name |
string | ✅ | O nome do produto que você deseja buscar. |
page |
int | ❌ | O número da página (começa em 0). O usuário pode definir livremente. Padrão: 0. |
size |
int | ❌ | O número de itens por página. O usuário pode definir livremente. Padrão: 20. |
sort |
string | ❌ | Critério de ordenação (ex: currentPrice,asc). Padrão: sem ordenação explícita. |
curl -X GET "http://localhost:8080/products/find-by-name?name=playstation%205&page=0&size=10"{
"content": [
{
"marketPlace": "Magazine Luiza",
"title": "Console Playstation 5 825GB Spider-Man 2 Bundle",
"url": "https://www.magazineluiza.com.br/...",
"imgUrl": "https://a-static.mlcdn.com.br/...",
"currentPrice": 3799.00,
"originalPrice": 4299.00,
"assessment": 4.9,
"reviewCount": 180
},
{
"marketPlace": "Mercado Livre",
"title": "Sony Playstation 5 Standard 825gb Cor Branco E Preto",
"url": "https://www.mercadolivre.com.br/...",
"imgUrl": "https://http2.mlstatic.com/...",
"currentPrice": 3840.00,
"originalPrice": null,
"assessment": 4.8,
"reviewCount": 540
}
],
"totalPages": 1,
"totalElements": 2,
"number": 0,
"size": 10,
"first": true,
"last": true,
"empty": false
}Para garantir que apenas produtos relevantes e de boa qualidade sejam retornados, a API aplica a seguinte lógica (ProductService.isProductValid()):
Avaliação (Estrelas): O produto deve ter uma avaliação de 3.8 ou mais.
Quantidade de Avaliações: O produto deve ter 50 ou mais avaliações.
Produtos que não atendem a ambos os critérios são descartados.