Scraper inteligente para garimpar itens em classificados brasileiros (OLX, Mercado Livre).
Coleta anúncios, classifica cada um via LLM (Gemini Flash) usando um playbook curatorial, e gera ranking com alertas opcionais via Telegram. Custo: R$0 — Crawl4AI self-hosted + Gemini free tier.
Nasceu para buscar TVs CRT para uma instalação artística, mas funciona para qualquer garimpagem:
- Equipamentos vintage (CRTs, projetores, sensores)
- Componentes eletrônicos (Raspberry Pi, Arduino, placas)
- Qualquer coisa que se compra em classificados e precisa de critério
Cada busca é uma campaign — um JSON com termos de busca e critérios de classificação. O motor é o mesmo.
- Node.js ≥ 18 (usa
fetchnativo) - Crawl4AI — crawler self-hosted (github). Roda como container Docker.
- Gemini API key — grátis (1500 req/dia)
Opcional:
- Telegram Bot — para alertas (precisa de bot token + chat ID)
- Email — para enviar relatório (precisa de script de envio configurado)
git clone https://github.com/sztutman/szt-scraping-tool.git
cd szt-scraping-tool/scripts
# Sem dependências npm — zero install
# Só precisa das env vars:
export GEMINI_API_KEY="sua-key-aqui"
export CRAWL4AI_URL="http://localhost:11235" # onde seu Crawl4AI roda
# Opcional: alertas Telegram
export TELEGRAM_BOT_TOKEN="..."
export TELEGRAM_CHAT_ID="..."# Listar campaigns
node run.js --list
# Pipeline completo: coleta → classificação → alertas
node run.js --campaign crt-totem
# Só coleta
node run.js --campaign crt-totem --collect-only
# Só normalizar (classificar via Gemini)
node run.js --campaign crt-totem --normalize-only
# Ver relatório
node run.js --campaign crt-totem --report
# Stats
node run.js --campaign crt-totem --stats
# Relatório + enviar por email
node run.js --campaign crt-totem --report --email voce@email.com OLX / ML Gemini Flash Telegram / Email
───────── ────────────── ──────────────
Crawl4AI ──coleta──▶ Classifica ──score──▶ Alerta top N
(HTML→MD) cada anúncio (com link direto)
│ com playbook │
│ curatorial │
└── listings.json ──────────────────── report.html ─┘
- Coleta — Crawl4AI navega o OLX/ML e extrai anúncios (título, preço, URL, fotos)
- Normalização — Gemini Flash lê cada anúncio e classifica: marca, modelo, família, condição, scores 1-5
- Score composto — prioriza por critérios ponderados (uniformidade, qualidade, preço, etc)
- Alerta — manda os melhores pro Telegram ou gera HTML por email
- Dedup — não alerta o mesmo anúncio duas vezes, rastreia mudanças de preço
Crie um JSON em scripts/campaigns/:
{
"id": "projetor-epson",
"name": "Projetores Epson usados em SP",
"active": true,
"search": {
"sources": ["olx"],
"maxPages": 2,
"delayMs": 3000,
"terms": {
"olx": ["projetor epson", "projetor 3lcd", "epson powerlite"]
}
},
"classification": {
"system_prompt": "Você é um especialista em projetores...",
"score_weights": {
"brightness": 0.25,
"resolution": 0.20,
"condition": 0.20,
"price_attractiveness": 0.20,
"brand_tier": 0.15
},
"red_flags": ["lâmpada queimada", "não liga"],
"green_flags": ["pouco uso", "com case", "lâmpada nova"]
},
"alerts": {
"min_score": 3.0,
"telegram": true
}
}Depois: node run.js --campaign projetor-epson
szt-scraping-tool/
├── README.md
├── SKILL.md ← doc para uso como Pi skill
└── scripts/
├── run.js ← CLI principal
├── campaign.js ← loader de campaigns
├── db.js ← persistência JSON (por campaign)
├── normalize.js ← classificação via Gemini Flash
├── alert.js ← alertas Telegram
├── report.js ← relatório console + HTML
├── collectors/
│ ├── olx.js ← Crawl4AI → OLX
│ └── mercadolivre.js ← Crawl4AI → ML
└── campaigns/
└── crt-totem.json ← exemplo: TVs CRT para instalação artística
- Preços OLX — a lista não mostra preço (JS client-side). Use
fetchDetails: truena campaign para buscar da página de detalhe (mais lento). - Mercado Livre — parsing HTML frágil em termos genéricos. Melhor com termos específicos.
- Facebook Marketplace — não implementado (requer Patchright/Playwright com login).
- Gemini JSON — ~5% dos anúncios podem falhar no parsing. Tem fallback de regex, mas não é perfeito.
Felipe Sztutman — artista, AYA Studio
MIT