2.7 KiB
2.7 KiB
02 - Projeto Scraper Java
A pasta irmão scrapper contém uma aplicação autónoma em puro Java com a responsabilidade de raspar (scrapping) a informação dos clubes, jogos e tabelas.
Ficheiros Críticos
O projeto está implementado em src/main/java/org/example/. Destacam-se:
Main.java: Onde o projeto arranca. Configura a ligação com Firebase, cria a Realtime DB reference e também executa as ações principais (ex. extrair info de clubes).StandingsScraper.java: Classe responsável pela extração das Tabelas Classificativas (Standings) e lista de jogos (Jornadas) baseando-se num endpoint JSON fornecido pela AFAVCD.PlayersScraper.java: Esqueleto preparado para iterar pela lista de plantéis das equipas.- Diretório
models/: Classes de modelos Java que refletem a estrutura exata do que será enviado ao Firebase.
Tecnologias Usadas
- JSoup: Utilizado para enviar HTTP requests a URLs tradicionais e efetuar o parsing de documentos HTML usando CSS Selectors (quando a informação não é fornecida via JSON).
- GSON (Google JSON): Utilizado quando a associação fornece endpoints JSON. O Gson pega nas "Strings" JSON devolvidas pela API e converte para objetos (models) Java, facilitando o acesso às propriedades.
- Firebase Admin SDK: Ao contrário do Android (que usa Auth regular de cliente), o Scraper tem privilégios de Admin. Utiliza a "chave de serviço" de Firebase (vulgarmente no ficheiro
service-account.jsonque deve manter-se sempre fora do controlo de versões, via.gitignore). - Gradle: O ciclo de build e os pacotes são geridos pelo Gradle (usando sintaxe
build.gradle.kts).
O Fluxo Padrão do Scraper
- A função
maincarrega o Firebase Options, passando as credenciais para obter acesso total à base de dados de Firebase. - Invocam-se os Scrapers. Por exemplo,
StandingsScraper.scrapeAndSync(). - O Scraper descarrega o payload (JSON ou HTML).
- O Scraper itera os elementos (Equipas, Jogos). Cria uma instância da classe Model relevante (ex:
TeamStanding.java). - A referência Firebase é chamada (e.g.
ref.child("Senior").child("standings")) e o objeto é passado porsetValueAsync().
Notas de Evolução
- Limites de Rate: Quando o projeto aumentar a sua abrangência (extrair todos os jogadores para todas as equipas), deve-se implementar delays (
Thread.sleep()) para prevenir que o servidor que está a sofrer o scraping bloqueie o nosso IP. - Tipagem Ficheiros Models: Os atributos nas classes
models/têm de bater certo com os declarados na App Android. Qualquer refactoring a nomes de atributos, deverá ser feito em ambos os projetos sob pena de a App Android apresentar UI sem dados (null).