Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# UAlg Scraper Configuration
UALG_BASE_URL=https://www.ualg.pt

# Database Configuration
DB_PATH=/data/ualg_courses.db

# Request Configuration
MAX_RETRIES=3
REQUEST_DELAY=0.5
REQUEST_TIMEOUT=30

# API Configuration
API_HOST=0.0.0.0
API_PORT=8000

# FACODI Configuration
FACODI_PORT=3000

# Scraper Schedule (cron format)
# Example: 0 2 * * 1 = Every Monday at 2am
SCRAPER_SCHEDULE=0 2 * * 1
7 changes: 7 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -137,3 +137,10 @@ Thumbs.db
ualg_courses.db
data/
*.db

# Docker
.env
docker-compose.override.yml

# FACODI clone
facodi-clone/
25 changes: 24 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
.PHONY: help install install-dev test lint format clean run run-scraper run-api init-db demo
.PHONY: help install install-dev test lint format clean run run-scraper run-api init-db demo docker-build docker-up docker-down docker-scraper export-hugo

help:
@echo "Available targets:"
Expand All @@ -13,6 +13,13 @@ help:
@echo " run-api - Run the API server"
@echo " init-db - Initialize the database"
@echo " demo - Populate database with demo data"
@echo " export-hugo - Export database to Hugo markdown files"
@echo ""
@echo "Docker targets:"
@echo " docker-build - Build all Docker images"
@echo " docker-up - Start all Docker services (API + FACODI)"
@echo " docker-down - Stop all Docker services"
@echo " docker-scraper - Run scraper in Docker container"

install:
pip install -r requirements.txt
Expand Down Expand Up @@ -53,3 +60,19 @@ init-db:

demo:
python scripts/populate_demo_data.py

export-hugo:
python scripts/export_to_hugo.py

# Docker targets
docker-build:
docker-compose build

docker-up:
docker-compose up -d

docker-down:
docker-compose down

docker-scraper:
docker-compose --profile scraper up scraper
202 changes: 195 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,64 @@ Sistema completo de scraping e API REST para cursos da Universidade do Algarve (
- 🏷️ **Áreas de Conhecimento**: Organiza cursos por áreas temáticas
- 🔧 **Configurável**: Timeouts, retries, user agents personalizáveis
- 📦 **Modular**: Código organizado e separado em módulos
- ✅ **Testes Completos**: Cobertura abrangente de testes (36 testes)
- ✅ **Testes Completos**: Cobertura abrangente de testes (46 testes)
- 🔄 **Retry Automático**: Mecanismo de retry para requisições falhadas
- 📝 **Logging Detalhado**: Logs para debugging e monitoramento
- ⚡ **Rate Limiting**: Respeita limites do servidor com delays entre requisições
- 🐳 **Docker Ready**: Arquitetura completa com Docker Compose para produção
- 🔗 **Integração FACODI**: Exportação automática para Hugo/FACODI.pt

## Instalação

### Opção 1: Docker (Recomendado para Produção)

**Pré-requisitos:**
- Docker e Docker Compose instalados

**Setup rápido:**

1. Clone o repositório:
```bash
git clone https://github.com/Monynha-Softwares/Scrape-UAlg-Courses.git
cd Scrape-UAlg-Courses
```

2. Configure variáveis de ambiente:
```bash
cp .env.example .env
# Edite .env conforme necessário
```

3. (Opcional) Clone o repositório FACODI para integração:
```bash
git clone https://github.com/Monynha-Softwares/facodi.pt.git facodi-clone
```

4. Inicie os serviços:
```bash
make docker-up
# ou
docker-compose up -d
```

Serviços disponíveis:
- **API**: http://localhost:8000
- **FACODI**: http://localhost:3000 (se facodi-clone existe)

5. Execute o scraper (opcional):
```bash
make docker-scraper
# ou
docker-compose --profile scraper up scraper
```

6. Exporte para Hugo (opcional):
```bash
docker-compose run --rm api python scripts/export_to_hugo.py
```

### Opção 2: Instalação Local (Desenvolvimento)

### Pré-requisitos

- Python 3.10 ou superior
Expand Down Expand Up @@ -272,6 +323,13 @@ Scrape-UAlg-Courses/
│ │ ├── bug_report.md # Template para reportar bugs
│ │ └── feature_request.md # Template para solicitar features
│ └── PULL_REQUEST_TEMPLATE.md # Template para pull requests
├── docker/
│ ├── api.Dockerfile # Dockerfile para serviço API
│ ├── scraper.Dockerfile # Dockerfile para serviço scraper
│ ├── facodi.Dockerfile # Dockerfile para FACODI/Hugo
│ └── nginx.conf # Configuração nginx para FACODI
├── docs/
│ └── INTEGRATION.md # Guia de integração FACODI
├── src/
│ ├── __init__.py # Inicialização do pacote
│ ├── config.py # Gerenciamento de configuração
Expand All @@ -280,14 +338,20 @@ Scrape-UAlg-Courses/
│ └── api.py # API REST FastAPI
├── templates/
│ └── index.html # Interface web moderna
├── scripts/
│ ├── populate_demo_data.py # Popular BD com dados demo
│ └── export_to_hugo.py # Exportar BD para Hugo/FACODI
├── tests/
│ ├── __init__.py
│ ├── test_scraper.py # Testes do scraper básico
│ ├── test_scrape_ualg.py # Testes do scraper completo
│ └── test_api.py # Testes da API
├── data/
│ └── docs/ # Documentos baixados (PDFs)
├── facodi-clone/ # Clone do facodi.pt (opcional)
├── .env.example # Exemplo de variáveis de ambiente
├── .gitignore # Regras do git ignore
├── docker-compose.yml # Orquestração Docker
├── README.md # Este arquivo
├── LICENSE # Licença MIT
├── CONTRIBUTING.md # Guia de contribuição
Expand All @@ -298,6 +362,92 @@ Scrape-UAlg-Courses/
└── Makefile # Automação de tarefas comuns
```

## Docker Compose

### Arquitetura de Serviços

O sistema utiliza Docker Compose com 4 serviços isolados:

1. **API Service (ualg-api)**
- FastAPI servindo endpoints REST
- Acesso ao SQLite compartilhado
- Interface web de visualização
- Porta: 8000

2. **Scraper Service (ualg-scraper)**
- Executa scraping sob demanda
- Popula banco de dados SQLite
- Baixa documentos para volume compartilhado
- Perfil: `scraper` (não inicia automaticamente)

3. **FACODI Frontend (ualg-facodi)**
- Site estático Hugo
- Servido via nginx
- Consome API para dados dinâmicos
- Porta: 3000

### Comandos Docker

**Construir imagens:**
```bash
make docker-build
```

**Iniciar serviços (API + FACODI):**
```bash
make docker-up
```

**Parar serviços:**
```bash
make docker-down
```

**Executar scraper:**
```bash
make docker-scraper
```

**Exportar para Hugo:**
```bash
docker-compose run --rm api python scripts/export_to_hugo.py
```

**Ver logs:**
```bash
docker-compose logs -f api
docker-compose logs -f scraper
```

### Integração FACODI

Para integração completa com o FACODI.pt, consulte [docs/INTEGRATION.md](docs/INTEGRATION.md).

**Passo a passo:**

1. Clone o repositório FACODI:
```bash
git clone https://github.com/Monynha-Softwares/facodi.pt.git facodi-clone
```

2. Execute o scraper para popular dados:
```bash
make docker-scraper
```

3. Exporte dados para Hugo:
```bash
python scripts/export_to_hugo.py
```

4. Reconstrua o serviço FACODI:
```bash
docker-compose build facodi
docker-compose up -d facodi
```

5. Acesse o site em http://localhost:3000

## Desenvolvimento

### Executar Testes
Expand Down Expand Up @@ -348,10 +498,19 @@ O scraper pode ser configurado usando a classe `Config` ou variáveis de ambient
- `timeout`: Timeout de requisição em segundos (padrão: 30)
- `user_agent`: String de user agent para requisições
- `max_retries`: Número máximo de tentativas de retry (padrão: 3)
- `request_delay`: Delay entre requisições em segundos (padrão: 0.5)

### Variáveis de Ambiente

- `UALG_BASE_URL`: Substituir a URL base padrão
Copie `.env.example` para `.env` e configure conforme necessário:

- `UALG_BASE_URL`: URL base para scraping (padrão: `https://www.ualg.pt`)
- `DB_PATH`: Caminho para o banco de dados SQLite (padrão: `ualg_courses.db`)
- `MAX_RETRIES`: Número máximo de tentativas (padrão: 3)
- `REQUEST_DELAY`: Delay entre requisições em segundos (padrão: 0.5)
- `REQUEST_TIMEOUT`: Timeout de requisições em segundos (padrão: 30)
- `API_PORT`: Porta da API (padrão: 8000)
- `FACODI_PORT`: Porta do FACODI (padrão: 3000)

## Endpoints da API

Expand All @@ -365,6 +524,8 @@ O scraper pode ser configurado usando a classe `Config` ou variáveis de ambient
| GET | `/schools` | Listar escolas/faculdades |
| GET | `/areas` | Listar áreas de conhecimento |
| GET | `/stats` | Obter estatísticas gerais |
| GET | `/api/v1/courses/export` | Exportar todos os cursos em formato Hugo |
| GET | `/api/v1/course/{id}/markdown` | Obter curso específico em formato Markdown |

### Parâmetros de Filtro (GET /courses)

Expand All @@ -374,6 +535,27 @@ O scraper pode ser configurado usando a classe `Config` ou variáveis de ambient
- `limit`: Número máximo de resultados (padrão: 100, máx: 500)
- `offset`: Offset para paginação (padrão: 0)

### Novos Endpoints de Exportação

**GET /api/v1/courses/export**
- Exporta todos os cursos com módulos, documentos e áreas
- Formato JSON adequado para processamento em Hugo
- Inclui timestamp de exportação

**GET /api/v1/course/{id}/markdown**
- Retorna um curso específico em formato Markdown
- Inclui front matter YAML para Hugo
- Pronto para ser salvo como arquivo `.md`

Exemplo:
```bash
# Exportar todos os cursos
curl http://localhost:8000/api/v1/courses/export > courses.json

# Obter curso como markdown
curl http://localhost:8000/api/v1/course/1/markdown > curso.md
```

## Boas Práticas e Considerações

### Rate Limiting
Expand Down Expand Up @@ -423,15 +605,21 @@ Se encontrar problemas ou tiver dúvidas:
- [x] Banco de dados SQLite normalizado
- [x] API REST completa
- [x] Download automático de documentos
- [x] Testes completos (36 testes)
- [x] Testes completos (46 testes)
- [x] Extração de módulos/UCs com ECTS, ano, semestre
- [x] Extração e organização por áreas de conhecimento
- [x] Interface web moderna e responsiva
- [x] Dashboard com estatísticas e gráficos
- [x] Filtros interativos por nível, escola e área
- [x] Arquitetura Docker Compose com 4 serviços
- [x] Exportação de dados para Hugo/FACODI
- [x] API endpoints para exportação (JSON, Markdown)
- [x] Rate limiting configurável
- [x] Documentação de integração FACODI
- [ ] Layouts Hugo para páginas de cursos
- [ ] Interface de linha de comando (CLI)
- [ ] Exportação de dados (JSON, CSV, Excel)
- [ ] Suporte para agendamento automático
- [ ] Dashboard web para visualização de dados
- [ ] Exportação adicional (CSV, Excel)
- [ ] Suporte para agendamento automático (cron/GitHub Actions)
- [ ] Notificações de mudanças em cursos
- [ ] Parser de PDFs para extrair planos curriculares detalhados
- [ ] Parser de PDFs para extrair planos curriculares detalhados
- [ ] CI/CD para build e deploy automático
Loading