Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

10 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

API de Web Scraping de Produtos

Java Spring Boot Maven Redis Selenium Spring AI

📖 Sobre o Projeto

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.

✨ Funcionalidades Principais

  • 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-Agent e Referer (Google) para parecer um usuário legítimo.
    • Possui infraestrutura para rotação de Proxy (via ProxyProvider).

🛠️ Tecnologias Utilizadas

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, Pageable vem 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).
  • 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.
  • 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.
  • 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.

⚙️ Como Funciona

O fluxo da aplicação é o seguinte:

  1. O cliente faz uma requisição GET /products/find-by-name?name=termo_de_busca.
  2. O GeminiService recebe o termo_de_busca (ex: "celular sansung s24") e o normaliza para um termo oficial (ex: "Samsung Galaxy S24").
  3. O ProductService recebe o nome normalizado e verifica se já existe um resultado em cache (no Redis).
  4. Se não houver cache:
    • O serviço aciona todas as ScrapingStrategy (MercadoLivre, MagazineLuiza) em paralelo.
    • Cada estratégia usa o SeleniumPageFetcher para 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.
  5. Após a coleta:
    • O ProductService consolida todos os produtos encontrados.
    • Aplica o filtro isProductValid() em cada produto.
    • Ordena a lista final pelo preço (currentPrice).
  6. O resultado é salvo no cache do Redis, paginado (usando Pageable) e retornado como um PageableDto JSON para o usuário.

🚀 Configuração e Execução

Pré-requisitos

  • Java (JDK) 21 ou superior
  • Maven
  • Uma instância do Redis em execução
  • Uma chave de API do Google Gemini (para o GeminiService)

1. Clone o Repositório

git clone [https://github.com/seu-usuario/seu-repositorio.git](https://github.com/seu-usuario/seu-repositorio.git)
cd seu-repositorio

2. Configure as Variáveis de Ambiente

Crie 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_AQUI

📡 Endpoints da API

Buscar Produtos (Paginado)

Retorna uma lista paginada de produtos filtrados e ordenados.

URL: /products/find-by-name
Método: GET

Query Params

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.

🧠 Exemplo de Requisição (cURL)

curl -X GET "http://localhost:8080/products/find-by-name?name=playstation%205&page=0&size=10"

📦 Exemplo de Resposta (JSON - PageableDto)

{
  "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
}

⚖️ Regras de Filtragem

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.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages