|
1 | 1 | # FIPE Data Pipeline |
2 | 2 |
|
3 | | -Coleta dados de preços de veículos da Tabela FIPE oficial e armazena em PostgreSQL para análise histórica. |
| 3 | +[](https://github.com/caiopizzol/fipe-data-pipeline/releases) |
4 | 4 |
|
5 | | -## Configuração |
| 5 | +Crawler em TypeScript que coleta dados históricos de preços de veículos da Tabela FIPE e armazena em PostgreSQL. |
| 6 | + |
| 7 | +## O Problema |
| 8 | + |
| 9 | +A FIPE publica preços de veículos todo mês desde 2001, mas: |
| 10 | + |
| 11 | +- **Não existe API oficial** - o site é só consulta manual |
| 12 | +- **5 níveis de hierarquia** - mês de referência → marca → modelo → ano/combustível → preço |
| 13 | +- **Escala massiva** - 320+ tabelas de referência, 90+ marcas, milhares de modelos |
| 14 | +- **Alternativas pagas** - existem, mas sem garantia de confiabilidade dos dados |
| 15 | + |
| 16 | +## Features |
| 17 | + |
| 18 | +- **Throttling inteligente** - 200ms entre requests + retry com backoff exponencial |
| 19 | +- **Fallback hierárquico** - se um modelo falha, continua com os outros |
| 20 | +- **Upserts idempotentes** - pode rodar de novo sem duplicar dados |
| 21 | +- **Classificação por segmento** - categoriza modelos (SUV, Sedã, Hatch, etc.) usando Claude |
| 22 | + |
| 23 | +## Quick Start |
6 | 24 |
|
7 | 25 | ```bash |
8 | | -cp .env.example .env |
9 | | -npm install |
| 26 | +# Sobe o banco |
10 | 27 | docker compose up -d |
11 | | -npm run db:push |
| 28 | + |
| 29 | +# Instala dependências |
| 30 | +pnpm install |
| 31 | + |
| 32 | +# Aplica schema |
| 33 | +pnpm db:push |
| 34 | + |
| 35 | +# Crawla dados de 2025 |
| 36 | +pnpm crawl |
12 | 37 | ``` |
13 | 38 |
|
14 | 39 | ## Uso |
15 | 40 |
|
16 | 41 | ```bash |
17 | | -npm run crawl # Coleta todos os dados de 2025 |
18 | | -npm run crawl -- --reference 328 # Mês específico |
19 | | -npm run crawl -- --reference 328 --brand 59 # Marca específica (59 = VW) |
20 | | -npm run crawl -- --classify # Classifica novos modelos por segmento (requer ANTHROPIC_API_KEY) |
21 | | -npm run status # Estatísticas do banco |
22 | | -npm run db:shell # Terminal PostgreSQL |
| 42 | +# Crawl completo do ano atual |
| 43 | +pnpm crawl |
| 44 | + |
| 45 | +# Filtrar por referência específica |
| 46 | +pnpm crawl -- --reference 328 |
| 47 | + |
| 48 | +# Filtrar por marca (59 = Volkswagen) |
| 49 | +pnpm crawl -- --brand 59 |
| 50 | + |
| 51 | +# Filtrar por modelo específico (requer --brand) |
| 52 | +pnpm crawl -- --brand 59 --model 5940 |
| 53 | + |
| 54 | +# Classificar modelos durante o crawl |
| 55 | +pnpm crawl -- --classify |
| 56 | + |
| 57 | +# Ver estatísticas do banco |
| 58 | +pnpm status |
| 59 | + |
| 60 | +# Classificar todos os modelos sem segmento |
| 61 | +pnpm classify |
| 62 | + |
| 63 | +# Dry-run da classificação |
| 64 | +pnpm classify -- --dry-run |
23 | 65 | ``` |
24 | 66 |
|
25 | | -### Classificação de Segmentos (Opcional) |
| 67 | +## Arquitetura |
26 | 68 |
|
27 | | -Classifica modelos por tipo de carroceria (SUV, Sedã, Hatch, etc.) usando IA. |
| 69 | +``` |
| 70 | +src/ |
| 71 | +├── fipe/ |
| 72 | +│ ├── client.ts # HTTP client com throttling |
| 73 | +│ └── schemas.ts # Validação Zod |
| 74 | +├── crawler/ |
| 75 | +│ └── processor.ts # Orquestração do crawl |
| 76 | +├── db/ |
| 77 | +│ ├── schema.ts # Drizzle ORM |
| 78 | +│ └── repository.ts # Upserts |
| 79 | +└── classifier/ |
| 80 | + └── segment-classifier.ts # Claude API |
| 81 | +``` |
28 | 82 |
|
29 | | -```bash |
30 | | -npm run classify # Classifica todos os modelos sem segmento |
31 | | -npm run classify -- --dry-run # Mostra o que seria classificado |
32 | | -npm run classify -- --model 123 # Classifica modelo específico por ID |
| 83 | +## Stack |
| 84 | + |
| 85 | +- Node.js 22 + TypeScript |
| 86 | +- Drizzle ORM |
| 87 | +- PostgreSQL 16 |
| 88 | +- Zod (validação runtime) |
| 89 | + |
| 90 | +## Schema |
| 91 | + |
| 92 | +```mermaid |
| 93 | +flowchart LR |
| 94 | + reference_tables --> prices |
| 95 | + brands --> models --> model_years --> prices |
33 | 96 | ``` |
34 | 97 |
|
35 | | -Requer `ANTHROPIC_API_KEY` no `.env`. |
| 98 | +**Exemplo:** |
36 | 99 |
|
37 | | -## Fonte de Dados |
| 100 | +| reference_tables | brands | models | model_years | prices | |
| 101 | +| ---------------- | ---------- | -------- | ----------- | --------- | |
| 102 | +| Jan/2025 (#328) | Volkswagen | Gol 1.0 | 2020 Flex | R$ 45.000 | |
| 103 | +| | | | 2021 Flex | R$ 48.000 | |
| 104 | +| | | Polo 1.6 | 2022 Flex | R$ 72.000 | |
| 105 | +| Fev/2025 (#329) | Volkswagen | Gol 1.0 | 2020 Flex | R$ 44.500 | |
38 | 106 |
|
39 | | -Dados oficiais da FIPE em `veiculos.fipe.org.br`. Que incluem: |
| 107 | +Cada preço vincula um veículo (modelo + ano + combustível) a um mês de referência. |
| 108 | + |
| 109 | +Schema SQL completo em [`initial.sql`](./initial.sql). |
| 110 | + |
| 111 | +## Dados |
| 112 | + |
| 113 | +Fonte oficial: `veiculos.fipe.org.br` |
40 | 114 |
|
41 | 115 | - Tabelas de referência (snapshots mensais desde 2001) |
42 | 116 | - Marcas, modelos, anos |
43 | 117 | - Preços por tipo de combustível |
44 | 118 |
|
45 | | -## Schema |
| 119 | +## Demo |
46 | 120 |
|
47 | | -``` |
48 | | -reference_tables → brands → models → model_years → prices |
49 | | -``` |
| 121 | +Veja os dados em ação: [fipe.chat](https://fipe.chat) |
| 122 | + |
| 123 | +## Licença |
50 | 124 |
|
51 | | -Cada registro de preço vincula um veículo (modelo + ano + combustível) a um mês de referência. |
| 125 | +MIT |
0 commit comments