Crawler em Python para exportar a Tabela FIPE em CSV usando a API v2 (Parallelum/Deivid Fortuna).
API v2 Docs: https://deividfortuna.github.io/fipe/v2/
Suporta tipos de veículo: carros, motos, caminhoes.
.
├── fipe_crawler.py # CLI mínimo (apenas orquestra): parse de args, .env e delega para o pacote
├── fipecrawler/ # Módulos com a lógica de negócio
│ ├── __init__.py # Reexporta constantes e classes principais
│ ├── http.py # Sessões HTTP, retries/backoff, rate limit utilitário
│ ├── api.py # Funções de acesso à API FIPE (brands/models/years/price)
│ ├── state.py # Checkpoint (full scan) e helpers de CSV
│ ├── logging.py # Helpers para logs padronizados
│ ├── export.py # Classe Exporter (exporta um tipo para CSV)
│ └── fullscan.py # Classe FullScanner (varredura completa com limite diário)
├── requirements.txt
├── .env # Configurações (TOKEN, REFERENCE, limites, etc.)
└── .gitignore
Observação: fipe_crawler.py não contém mais lógica de coleta; ele apenas chama fipecrawler.Exporter e fipecrawler.FullScanner.
- Python 3.9+
- Pip (gerenciador de pacotes)
Instale as dependências:
pip install -r requirements.txtCrie/edite o arquivo .env na raiz do projeto com:
TOKEN=SEU_TOKEN_AQUI
# opcional
REFERENCE=308
Observações:
- O
TOKENé usado comoX-Subscription-Tokennas requisições v2. - Você pode informar
--token/--referencevia CLI; se presentes, eles têm precedência sobre o.env.
Adicione também (valores exemplo):
# Limite diário de requisições do seu plano
DAILY_LIMIT=500
# Margem de segurança: quando faltarem N requisições para o limite, pausa e retoma no dia seguinte
LIMIT_MARGIN=10
# Pasta de saída do full scan
FULL_SCAN_DIR=full_scan
Execute o script fipe_crawler.py escolhendo o tipo e o arquivo de saída:
python fipe_crawler.py --type carros --out fipe_carros.csvListar referências disponíveis (code,month):
python fipe_crawler.py --list-referencesFull scan (varre carros -> motos -> caminhoes, respeitando limite diário):
python fipe_crawler.py --full-scanO CLI resolve automaticamente a referência mais recente quando --reference não é informado ou é latest.
Detalhes do full scan:
- Usa
DAILY_LIMITeLIMIT_MARGINdo.env. - Pausa automaticamente quando restarem
LIMIT_MARGINrequisições; salva checkpoint em.state/full_scan.json. - Retoma de onde parou no dia seguinte (o contador diário zera automaticamente ao mudar o dia).
- Gera 3 arquivos CSV (um por tipo) em
FULL_SCAN_DIR(padrãofull_scan/).
Opções:
--type(obrigatório):carros|motos|caminhoes--out(obrigatório): caminho do CSV de saída--timeout(padrão 15): timeout por requisição (s)--retries(padrão 3): tentativas em falhas temporárias--backoff(padrão 0.5): fator de backoff exponencial entre tentativas--rate-delay(padrão 0.0): delay em segundos entre requisições (ex.: 0.1)--max-brands: limita quantidade de marcas (útil para testes)--max-models: limita quantidade de modelos por marca (útil para testes)--workers(padrão 1): número de requisições concorrentes (multithread)--token: cabeçalho X-Subscription-Token (obrigatório para v2 se aplicável)--reference: código do mês de referência (ex.: 308)
- Carros (amostra rápida para teste):
python fipe_crawler.py --type carros --out fipe_carros_sample.csv --max-brands 2 --max-models 3 --rate-delay 0.1 --workers 1 --token SEU_TOKEN --reference 308- Motos (com mais tolerância a falhas):
python fipe_crawler.py --type motos --out fipe_motos.csv --timeout 20 --retries 5 --workers 1 --token SEU_TOKEN- Caminhões (com delay para evitar rate limit):
python fipe_crawler.py --type caminhoes --out fipe_caminhoes.csv --rate-delay 0.15 --workers 1 --token SEU_TOKEN--type: Tipo de veículo. Aceitacarros,motos,caminhoes(mapeados paracars,motorcycles,trucksna API v2).--out: Caminho do CSV de saída.--timeout: Timeout por requisição.--retriese--backoff: Retentativas em erros temporários (429/5xx) com backoff exponencial.--rate-delay: Atraso entre requisições (ajuda a evitar rate limit).--max-brands/--max-models: Limites para testes rápidos.--workers: Concorrência (padrão 1). Aumente com cautela devido a limites diários.--token: Token v2 (se omitido, será lido deTOKENno.env).--reference: Código da referência (se omitido, usa o mês atual; pode ser definido emREFERENCEno.env).--list-references: Lista todas as referências (imprimecode,month) e encerra.--full-scan: Executa varredura completa (carros→motos→caminhoes) com limite diário e retomada automática.
Colunas geradas:
tipo,codigo_marca,marca,codigo_modelo,modelo,codigo_ano,ano_modelo,combustivel,sigla_combustivel,codigo_fipe,mes_referencia,valor
Observação: valor vem no formato numérico sem o prefixo "R$"; trate a localidade conforme necessário.
Os campos mapeiam a resposta v2 (brand, model, modelYear, fuel, fuelAcronym, codeFipe, referenceMonth, price).
- A API v2 usa
X-Subscription-Tokene possui limites (por ex., 500 req/dia). Informe--token(ou.env). - Rodar o dataset completo pode levar tempo. Use
--max-brandse--max-modelspara validar primeiro. - Em caso de HTTP 429/5xx, o script tenta automaticamente novamente (
--retriese--backoff). - Concurrency: os preços por ano são buscados em paralelo. Por padrão
--workers=1para respeitar limites; aumente com cautela.
Durante a execução são emitidos logs padronizados para acompanhar o progresso:
[START]início de export ou full scan com parâmetros[STAGE]avanço de etapa (tipo, marca, modelo, anos)[RESUME]retomada a partir de checkpoint (full scan)[CONT]/[NEXT]continuidade de índices de marca/modelo/ano[STATS]resumo de linhas processadas e uso diário[REF]referência utilizada (latest ou informada)
- Unauthorized (401/403): verifique
TOKEN(CLI ou.env). Tokens inválidos ou ausentes causam erro. - Too Many Requests (429): reduza
--workers, aumente--rate-delay(ex.: 0.1–0.5), aumente--backoffe/ou--retries. - Timeouts: aumente
--timeout(ex.: 30) e--retries. - Sem linhas no CSV: confira se há dados para a
--referenceusada; tente listar com--list-referencese ajustar. - Full scan pausou cedo: verifique
DAILY_LIMITeLIMIT_MARGINno.env. O processo pausa quandoremaining <= marginpara evitar atingir o teto diário.
Você pode explorar a API FIPE (Parallelum) com curl para entender o fluxo antes de usar o script. Substitua os placeholders {...} pelos códigos obtidos na etapa anterior.
- Listar marcas (ex.: carros):
curl -s "https://fipe.parallelum.com.br/api/v2/cars/brands?reference=308" -H "X-Subscription-Token: SEU_TOKEN"- Listar modelos de uma marca:
curl -s "https://fipe.parallelum.com.br/api/v2/cars/brands/{codigoMarca}/models?reference=308" -H "X-Subscription-Token: SEU_TOKEN"- Listar anos de um modelo:
curl -s "https://fipe.parallelum.com.br/api/v2/cars/brands/{codigoMarca}/models/{codigoModelo}/years?reference=308" -H "X-Subscription-Token: SEU_TOKEN"- Obter preço/detalhes para um ano específico:
curl -s "https://fipe.parallelum.com.br/api/v2/cars/brands/{codigoMarca}/models/{codigoModelo}/years/{codigoAno}?reference=308" -H "X-Subscription-Token: SEU_TOKEN"Notas:
- Para motos e caminhões, substitua
carspormotorcyclesoutrucksna URL. - Em Windows/PowerShell,
curlpode ser um alias deInvoke-WebRequest. Se preferir, usecurl.exeexplicitamente. - A resposta é JSON; para visualizar melhor, você pode usar utilitários como
jq(Linux/macOS) ou formatadores online.
- Executar com Python do sistema usando o launcher do Windows:
py .\fipe_crawler.py --list-references
py .\fipe_crawler.py --type carros --out .\fipe_carros.csv
py .\fipe_crawler.py --full-scan- Definir variáveis de ambiente temporárias no PowerShell e executar:
$env:TOKEN = "SEU_TOKEN"
$env:REFERENCE = "latest" # ou um código como 308
py .\fipe_crawler.py --type motos --out .\fipe_motos.csv- Quebra de linha em comandos longos (use acento grave/backtick `):
py .\fipe_crawler.py \
--type caminhoes \
--out .\fipe_caminhoes.csv \
--timeout 30 \
--retries 5 \
--rate-delay 0.2 \
--workers 1Observação: o .env na raiz é carregado automaticamente; variáveis via CLI têm precedência.
-
Clone ou faça fork do repositório.
-
Crie um ambiente virtual e instale dependências:
- PowerShell (Windows):
py -m venv .venv .\.venv\Scripts\Activate.ps1 pip install -r requirements.txt
- Bash (Linux/macOS):
python3 -m venv .venv source .venv/bin/activate pip install -r requirements.txt -
Execute os comandos de uso para validar mudanças.
-
Siga a estrutura modular (
fipecrawler/) e mantenha logs padronizados. -
Abra um PR descrevendo claramente mudanças, motivo e impacto.