P5.1 · Radar de Preço sobre o Firecrawl
Depende de P1.1. Skill: `/firecrawl-ecomsmart`.
O que mudou
O cluster já tem Firecrawl self-hosted em firecrawl.ecomsmart.com.br, namespace firecrawl, com Basic Auth, deployado por Helm e pipeline próprio.
Não construa motor de crawl. O que fica do nosso lado é só o que é específico do produto: descoberta de seletor, conversão de preço, agendamento, teto de orçamento e antiflood.
O prompt
Leia a skill /firecrawl-ecomsmart. Implemente o Radar de Preço no app preco, usando o Firecrawl como camada de coleta.
1. Modelos
- Concorrente:
loja,nome,dominio,tipo(site_proprio, mercadolivre, shopee, amazon, magalu) - Monitoramento:
loja,produto,concorrente,url_alvo,seletor(JSON com estratégia e expressão),ativo,ultimo_sucesso_em,falhas_consecutivas - PrecoSnapshot:
monitoramento,preco_centavos,preco_original_centavos,em_estoque,coletado_em,fonte(json_ld, microdata, meta, css). Índice(monitoramento, coletado_em DESC) - OrcamentoCrawl:
loja,mes,requisicoes_usadas,teto
2. Cliente do Firecrawl
Módulo preco/firecrawl.py:
POST https://firecrawl.ecomsmart.com.br/v2/scrape
Basic Auth (credenciais no Secret radar-firecrawl)
{"url": "...", "formats": ["html", "markdown"], "timeout": 60000}
Cuidados obrigatórios, todos justificados pela skill:
- O Postgres interno do NuQ está em
emptyDir. Reiniciar o pod perde a fila em andamento. Nosso agendamento precisa ser idempotente e reagendar o que não voltou. Não trate a fila do Firecrawl como fonte de verdade - Sem
OPENAI_API_KEYconfigurada, formatos que dependem de LLM não funcionam. Para preço não faz falta: usamos JSON-LD e seletor - O cluster está apertado de CPU. Limite a concorrência de chamadas ao Firecrawl e monitore se ele começa a devolver timeout
- Timeout, retry com backoff, e fallback para
httpxdireto quando o Firecrawl estiver indisponível — o produto não pode parar porque um serviço interno caiu
3. Descoberta de seletor
O lojista cola a URL do concorrente e o preço que ele está vendo. O sistema descobre sozinho como extrair:
- Busca o valor no HTML retornado e deriva um seletor estável
- Ordem de estratégia: JSON-LD → microdata → meta tags → seletor CSS derivado. JSON-LD é o mais estável; tente sempre primeiro
- Use
price-parser(scrapinghub/price-parser) para converter"R$ 1.299,90"emDecimale moeda. Não escreva regex própria
Marketplaces têm extratores dedicados por domínio — Mercado Livre, Shopee, Amazon e Magalu não caem no genérico.
4. Agendamento e teto
planejar_coletas() de hora em hora:
Essencial (R$ 97/ano): 30 SKUs x 3 concorrentes x 1x/dia = 90 req/dia
Pro (R$ 49/mes): 200 SKUs x 10 concorrentes x 4x/dia = 8.000 req/dia
- Teto duro no
OrcamentoCrawl. Ao estourar, para de coletar e avisa dentro do app. Nunca gaste além do plano - Espalhe as coletas ao longo do dia. Não dispare 8.000 requisições à meia-noite
- Priorize SKUs com histórico de variação alta e produtos top 20 em receita
falhas_consecutivas >= 5desativa o monitoramento e avisa o lojista que a URL mudou
5. Proxies
O Firecrawl resolve renderização, não resolve bloqueio por IP. Camada de proxy plugável em preco/proxies.py, com rotação, provedor residencial configurável por env, e interface que permite trocar de provedor mudando uma classe.
Educação: respeitar robots.txt em site próprio, nunca burlar login ou captcha, intervalo mínimo de 3 s por domínio, user-agent identificável com URL de contato.
6. Observabilidade
radar_coletas_total{status,fonte}
radar_coleta_duracao_segundos
radar_firecrawl_falhas_total
radar_proxy_custo_estimado_centavos
radar_monitoramentos_ativos
Dashboard no Grafana com taxa de sucesso por domínio e custo estimado por dia.
Critérios de aceite
- 20 páginas de produto reais em fixture (sites BR variados, Mercado Livre, Shopee): 17 ou mais preços extraídos corretamente
- Teste do teto: plano Essencial bloqueia a requisição 91 do dia
- Teste do intervalo mínimo por domínio sob concorrência
- Teste do fallback quando o Firecrawl retorna 5xx
- Rodada real de 100 coletas com taxa de sucesso e tempo médio
- Dashboard no Grafana com dados reais
Se o custo estimado de proxy por cliente Essencial passar de R$ 3 por mês, pare e me avise — a economia do produto não fecha.