← Voltar ao Início

Web Scraping para Monitoramento de Preços

Como funciona a tecnologia por trás do monitoramento automático de preços da concorrência em tempo real

📅 Atualizado: Novembro 2025 ⏱️ Leitura: 8 minutos 🔧 Nível: Técnico

O web scraping é a tecnologia fundamental que permite à Kompara monitorar milhares de preços de concorrentes 24/7 sem intervenção manual. Neste artigo técnico, exploramos como funciona, quais desafios enfrenta e as melhores práticas para implementá-lo de forma ética.

O que é Web Scraping para Preços?

Web scraping (também conhecido como web harvesting ou web data extraction) é o processo automatizado de extração de informações estruturadas de sites. No contexto de monitoramento de preços, significa:

Arquitetura de Web Scraping

┌─────────────┐
│   Scheduler │  ← Programa visitas a cada hora
└──────┬──────┘
       │
       ▼
┌─────────────────────────────────────┐
│      Scraper Distribuído            │
│  ┌────────┐  ┌────────┐  ┌────────┐│
│  │Worker 1│  │Worker 2│  │Worker 3││  ← Múltiplos workers
│  └────────┘  └────────┘  └────────┘│     em paralelo
└──────────────┬──────────────────────┘
               │
               ▼
┌──────────────────────────────────────┐
│       Parser & Normalizer            │  ← Limpa e estrutura
└──────────────┬───────────────────────┘     os dados
               │
               ▼
┌──────────────────────────────────────┐
│        Database (PostgreSQL)         │  ← Armazena histórico
└──────────────┬───────────────────────┘
               │
               ▼
┌──────────────────────────────────────┐
│      Analytics Engine + AI           │  ← Gera insights
└──────────────────────────────────────┘
            

Tecnologias e Stack Técnico

🐍 Python + Scrapy

Framework robusto para scraping em larga escala. Gerencia concorrência, novas tentativas automáticas e middleware personalizável.

🌐 Selenium / Playwright

Para sites com JavaScript pesado. Simula navegadores reais para acessar conteúdo dinâmico.

☁️ Infraestrutura Cloud

AWS Lambda ou Google Cloud Functions para escalar workers conforme a demanda.

🔄 Proxies Rotativos

Rede de IPs distribuídos para evitar bloqueios e respeitar limites de requisição.

💾 PostgreSQL + Redis

Banco de dados principal e cache para consultas rápidas.

📊 Apache Airflow

Orquestração de pipelines e agendamento de tarefas complexas.

Desafios Técnicos do Web Scraping

1. Detecção e Bloqueios Anti-Bot

Os sites de e-commerce modernos implementam múltiplas camadas de proteção:

🛡️ Rate Limiting

Limita requisições por IP/minuto. Solução: Proxies rotativos + delays inteligentes.

🤖 User-Agent Detection

Detecta scrapers por headers. Solução: Rotacionar user agents reais.

🧩 CAPTCHA

Desafios visuais para humanos. Solução: Serviços de resolução + comportamento human-like.

📱 Browser Fingerprinting

Identifica características únicas. Solução: Emulação completa de navegadores.

2. Conteúdo JavaScript Dinâmico

Muitos sites modernos carregam preços via JavaScript após a renderização inicial:

// Exemplo: Preço carregado dinamicamente
fetch('/api/product/12345/price')
  .then(res => res.json())
  .then(data => {
    document.getElementById('price').textContent = data.price;
  });

Solução na Kompara:

3. Estrutura HTML Variável

Sites mudam seu HTML frequentemente, quebrando seletores:

💡 Solução: Seletores Inteligentes com Fallbacks

selectors = [
    'span.price-now',           # Seletor principal
    'div.product-price span',   # Fallback 1
    '[data-price]',             # Fallback 2
    'meta[property="og:price"]' # Fallback 3
]

for selector in selectors:
    price = page.query_selector(selector)
    if price:
        return normalize_price(price.text)

Web Scraping Ético e Legal

⚠️ Considerações Legais Importantes

O web scraping existe em uma zona cinzenta legal. Na Kompara, seguimos estas diretrizes:

Princípios do Scraping Ético

✅ Melhores Práticas que Implementamos

  1. Respeito à largura de banda: Delays entre requisições (2-5 segundos mínimo)
  2. Identificação clara: User-Agent descritivo com contato
  3. Horários inteligentes: Maior atividade durante horários de menor tráfego do servidor
  4. Cache agressivo: Não repetir requisições desnecessárias
  5. Detecção de erros: Backoff exponencial diante de erros 5xx

Normalização e Qualidade de Dados

Extrair o preço é apenas o primeiro passo. A normalização é crítica:

Desafios de Normalização

💡 Pipeline de Normalização na Kompara

def normalize_price(raw_price: str) -> Optional[float]:
    # 1. Limpeza básica
    clean = raw_price.strip()
    clean = re.sub(r'[^\d.,]', '', clean)  # Remover símbolos
    
    # 2. Detecção de formato regional
    if ',' in clean and '.' in clean:
        # Determinar se , é decimal ou separador de milhares
        if clean.rfind(',') > clean.rfind('.'):
            clean = clean.replace('.', '').replace(',', '.')
        else:
            clean = clean.replace(',', '')
    elif ',' in clean:
        # Poderia ser decimal europeu
        if len(clean.split(',')[1]) == 2:
            clean = clean.replace(',', '.')
    
    # 3. Conversão
    try:
        return float(clean)
    except ValueError:
        logger.warning(f"Could not parse: {raw_price}")
        return None

Escalabilidade e Performance

Monitoramento de 10M+ Preços Diários

Para operar na escala da Kompara, precisamos de:

⚡ Alta Concorrência

100+ workers em paralelo com async/await e event loops

🔄 Agendamento Inteligente

Priorização dinâmica: produtos populares mais frequentes

💾 Cache Inteligente

Redis para evitar rescraping de páginas sem mudanças

📊 Monitoramento em Tempo Real

Métricas de sucesso/falha por worker e site

Detecção de Mudanças e Alertas

O scraping gera valor quando detecta mudanças importantes:

class PriceChangeDetector:
    def analyze_change(self, old_price, new_price, product_id):
        change_pct = ((new_price - old_price) / old_price) * 100
        
        # Mudança drástica (>10%)
        if abs(change_pct) > 10:
            self.trigger_alert(
                type='drastic_change',
                product_id=product_id,
                old=old_price,
                new=new_price,
                change_pct=change_pct
            )
        
        # Perda de liderança
        if self.was_cheapest(product_id) and not self.is_cheapest(product_id):
            self.trigger_alert(
                type='leadership_lost',
                product_id=product_id,
                competitor=self.get_new_leader(product_id)
            )

Futuro: Machine Learning em Scraping

A próxima evolução inclui:

Quer ver nosso scraping em ação?

Solicite uma demo e mostraremos como monitoramos sua concorrência em tempo real.

Solicitar Demo Gratuita →

📚 Recursos Adicionais

Ferramentas Open Source: