Skip to content

devrodts/JAVA_SPARK_CRAWLER

Repository files navigation

Crawler Web Service

Sobre o Projeto

Este projeto é um serviço de web crawler que busca por palavras-chave em websites. A aplicação permite iniciar buscas por palavras-chave e consultar os resultados através de uma API REST. O sistema rastreia páginas web a partir de uma URL base, identificando todas aquelas que contenham a palavra-chave especificada.

Arquitetura

O projeto segue uma arquitetura hexagonal (também conhecida como Ports and Adapters), organizando o código em camadas bem definidas:

Estrutura de Pacotes

com.axreng.backend
├── application           # Camada de aplicação (casos de uso)
│   ├── dto               # Objetos de transferência de dados
│   └── service           # Serviços da aplicação
├── domain                # Camada de domínio (regras de negócio)
│   ├── entity            # Entidades de domínio
│   ├── repository        # Interfaces de repositórios
│   └── exception         # Exceções de domínio
└── infrastructure        # Camada de infraestrutura
    ├── adapter           # Adaptadores
    │   ├── driven        # Adaptadores controlados (saída)
    │   │   ├── persistence # Implementações de persistência
    │   │   └── util        # Utilitários
    │   └── driving       # Adaptadores controladores (entrada)
    │       ├── web         # Controladores web
    │       └── task        # Tarefas em background
    └── config            # Configurações

Componentes Principais

Camada de Domínio

  • Search: Entidade principal que representa uma busca, contendo ID, palavra-chave, status e URLs encontrados.
  • SearchStatus: Enum que representa os possíveis estados de uma busca (ACTIVE, DONE).
  • SearchRepository: Interface para operações de persistência relacionadas às buscas.

Camada de Aplicação

  • SearchService: Serviço que implementa os casos de uso para iniciar e consultar buscas.

Camada de Infraestrutura

  • SearchController: Controlador REST que expõe endpoints para iniciar e consultar buscas.
  • WebCrawlerTask: Implementação do crawler que executa a busca em background, visitando páginas web a partir de uma URL base e identificando aquelas que contêm a palavra-chave.
  • InMemorySearchRepository: Implementação do repositório que armazena as buscas em memória.

Funcionalidades

API REST

A aplicação expõe os seguintes endpoints:

  • POST /crawl

    • Inicia uma nova busca
    • Recebe um JSON com a palavra-chave a ser buscada
    • Retorna um ID único para a busca
  • GET /crawl/:id

    • Consulta o status e resultados de uma busca
    • Retorna um JSON com status (ACTIVE ou DONE) e URLs encontrados

Web Crawler

  • Executa em background (thread separada) após iniciar uma busca
  • Rastreia até 1000 páginas a partir da URL base
  • Armazena até 100 URLs que contenham a palavra-chave
  • Utiliza uma estratégia de busca em largura (BFS) para percorrer as páginas

Tecnologias Utilizadas

  • Java 14: Linguagem de programação
  • Maven: Gerenciamento de dependências e build
  • Spark Java: Framework web para criação da API REST
  • Gson: Serialização/deserialização JSON
  • JUnit, Mockito e Hamcrest: Frameworks para testes

Como Executar

Pré-requisitos

  • Java 14
  • Maven
  • Docker (opcional)

Variáveis de Ambiente

  • PORT: Porta onde o serviço será executado (padrão: 4567)
  • BASE_URL: URL base a partir da qual o crawler iniciará a busca

Executando com Maven

export BASE_URL="https://example.com/"
mvn clean verify exec:java

Executando com Docker

docker build -t crawler-service .
docker run -p 4567:4567 -e BASE_URL="https://example.com/" crawler-service

Exemplo de Uso

Iniciando uma busca

curl -X POST http://localhost:4567/crawl \
  -H "Content-Type: application/json" \
  -d '{"keyword": "exemplo"}'

Resposta:

{"id": "abc123"}

Consultando resultados

curl -X GET http://localhost:4567/crawl/abc123

Resposta:

{
  "id": "abc123",
  "keyword": "exemplo",
  "status": "DONE",
  "urls": [
    "https://example.com/page1",
    "https://example.com/page2"
  ]
}

About

A challange to a international company using Java to create a Crawler. (finished)

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published