Como Criar um Monitor de Estoque em Tempo Real com Python: Do Scraping aos Alertas
Itens de alta demanda no comércio eletrônico frequentemente esgotam em questão de minutos. Produtos virais, colecionáveis ou lançamentos sazonais — como as linhas populares da NeeDoh — geram picos de tráfego que tornam a verificação manual inviável. Atualizar uma página repetidamente no navegador consome tempo e raramente garante a captura do item antes que o estoque zere.
A solução técnica para essa assimetria de informação é um monitor de estoque autônomo (stock watchlist builder). Neste artigo, você verá como arquitetar uma aplicação leve, autossuficiente e resiliente em Python para inspecionar páginas de produtos, identificar mudanças de status e disparar notificações instantâneas.
1. A Anatomia de um Rastreador de Estoque Eficiente
Um rastreador de estoque precisa de duas características fundamentais: baixo consumo de recursos e baixa latência. O erro mais comum ao iniciar um projeto desse tipo é utilizar ferramentas pesadas de automação de navegador (como Selenium ou Playwright) para tarefas repetitivas de simples inspeção.
Para monitorar URLs específicas de forma contínua, uma arquitetura enxuta baseada em requisições HTTP diretas e análise de dados estruturados oferece maior velocidade e menor risco de sobrecarga do sistema hospedeiro.
O fluxo divide-se em quatro etapas:
- Coleta: Requisição HTTP ao endpoint do produto com headers realistas.
- Extração de Estado: Localização de marcadores de estoque (JSON-LD embutido, classes CSS ou respostas de APIs internas).
- Comparação de Diferença (Diffing): Validação do estado atual contra o estado salvo no ciclo anterior.
- Notificação: Envio de alerta imediato apenas quando houver transição de indisponível para disponível.
2. Inspecionando o Alvo: JSON-LD e APIs Ocultas
Antes de escrever seletores CSS complexos, inspecione a estrutura da página. A maioria das lojas virtuais modernas embute metadados estruturados no padrão Schema.org dentro do código-fonte HTML, usando tags <script type="application/ld+json">.
Esses blocos contêm o objeto do produto com a propriedade offers, que informa explicitamente se o item está InStock ou OutOfStock. Isso elimina a fragilidade de seletores visuais que quebram a cada alteração de layout.
3. Implementação Prática em Python
O exemplo a seguir utiliza a biblioteca requests para comunicação HTTP e BeautifulSoup para a extração dos dados estruturados, integrando um mecanismo simples de verificação periódica e disparo via Webhook (ex.: Discord ou Telegram).
python
import json
import time
from typing import Dict, Optional
import requests
from bs4 import BeautifulSoup
HEADERS = {
“User-Agent”: “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36”,
“Accept-Language”: “en-US,en;q=0.9”,
}
def extrairstatusestoque(url: str) -> Optional[Dict[str, str]]:
try:
resposta = requests.get(url, headers=HEADERS, timeout=10)
resposta.raiseforstatus()
except requests.RequestException as e:
print(f”[Erro de Conexão] Falha ao acessar {url}: {e}”)
return None
soup = BeautifulSoup(resposta.text, "html.parser")
scripts_json_ld = soup.find_all("script", type="application/ld+json")
for script in scripts_json_ld:
try:
dados = json.loads(script.string)
if dados.get("@type") == "Product":
nome = dados.get("name", "Produto")
oferta = dados.get("offers", {})
# Trata listas de variantes ou oferta única
if isinstance(oferta, list):
oferta = oferta[0] if oferta else {}
disponibilidade = oferta.get("availability", "")
em_estoque = "InStock" in disponibilidade
return {
"nome": nome,
"disponivel": em_estoque,
"url": url
}
except (json.JSONDecodeError, TypeError):
continue
# Fallback para seletores comuns de botões caso o JSON-LD não exista
botao_comprar = soup.select_one("button[name='add'], input[value*='Add to Cart']")
desabilitado = botao_comprar.has_attr("disabled") if botao_comprar else True
return {
"nome": soup.title.string.strip() if soup.title else url,
"disponivel": not desabilitado,
"url": url
}
def enviaralerta(produto: Dict[str, str], webhookurl: str) -> None:
mensagem = {
“content”: f”🚨 ESTOQUE DISPONÍVEL!n{produto[‘nome’]} já pode ser comprado:n{produto[‘url’]}”
}
try:
requests.post(webhook_url, json=mensagem, timeout=5)
except requests.RequestException as e:
print(f”[Erro de Alerta] Falha ao enviar notificação: {e}”)
4. Gerenciamento de Estado e Ciclo de Execução
Para que o script seja auto-contido e rode em background sem gerar spam de notificações a cada checagem, precisamos controlar o histórico de estados em memória ou em um arquivo local leve (como SQLite ou JSON).
python
def monitorarwatchlist(watchlist: list, webhookurl: str, intervalosegundos: int = 60):
# Armazena {url: ultimostatusbooleano}
estadoanterior: Dict[str, bool] = {}
print("[*] Iniciando monitoramento da watchlist...")
while True:
for url in watchlist:
info = extrair_status_estoque(url)
if not info:
continue
status_atual = info["disponivel"]
status_previo = estado_anterior.get(url)
# Alerta disparado apenas na transição: False/None -> True
if status_atual and not status_previo:
print(f"[+] Produto em estoque: {info['nome']}")
enviar_alerta(info, webhook_url)
estado_anterior[url] = status_atual
time.sleep(2) # Pausa de cortesia entre URLs diferentes
time.sleep(intervalo_segundos)
5. Resiliência Operacional e Boas Práticas
Como especialista em IA e automação, observo que muitos projetos falham não na lógica de parsing, mas na falta de resiliência a longo prazo. Algumas práticas são essenciais para manter o sistema operacional:
- Backoff Exponencial: Caso a loja retorne códigos de erro HTTP (como 429 Too Many Requests ou 503 Service Unavailable), o algoritmo deve duplicar o intervalo de consulta progressivamente antes de retomar o ritmo normal.
- Rotatividade de Identificação: Headers estáticos e sem cookies podem ser sinalizados por firewalls de aplicação web (WAFs). Mantenha sessões persistentes via
requests.Session()para reaproveitar conexões TCP e preservar cookies de navegação. - Isolamento de Processos: Estruture a aplicação para rodar dentro de um container Docker enxuto ou como um serviço
systemdem uma VPS de baixo custo, garantindo reinício automático após quedas de rede.
Conclusão e Próximos Passos
Construir um monitoramento de estoque em tempo real com Python transforma processos manuais exaustivos em inteligência preditiva acionável. Com a estrutura certa de requisições, detecção precisa via metadados e controle de estado, você obtém uma vantagem competitiva relevante na captura de oportunidades no comércio digital.
Se sua empresa precisa automatizar a captura de dados complexos, monitorar concorrentes ou integrar pipelines inteligentes com Inteligência Artificial, entre em contato para desenvolvermos uma solução robusta e sob medida para o seu ecossistema.


