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:
- Visitação automatizada de páginas de produtos de concorrentes
- Extração de dados como preço, disponibilidade, descrições
- Normalização e armazenamento de informações em bancos de dados
- Análise e comparação para gerar insights acionáveis
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:
- Uso de headless browsers (Playwright/Puppeteer)
- Espera inteligente até que elementos críticos estejam carregados
- Interceptação de requisições de API quando possível
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:
- ✓ Respeitamos
robots.txte meta tags - ✓ Implementamos rate limiting conservador
- ✓ Apenas extraímos dados publicamente disponíveis
- ✓ Não acessamos áreas que requerem login
- ✓ Monitoramos apenas preços e disponibilidade pública
- ✓ Não revendemos nem republicamos dados extraídos
Princípios do Scraping Ético
✅ Melhores Práticas que Implementamos
- Respeito à largura de banda: Delays entre requisições (2-5 segundos mínimo)
- Identificação clara: User-Agent descritivo com contato
- Horários inteligentes: Maior atividade durante horários de menor tráfego do servidor
- Cache agressivo: Não repetir requisições desnecessárias
- 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
- Formatos diversos: "$1,234.56", "1.234,56 €", "R$ 1.234,56"
- Informações adicionais: "Antes: $100 Agora: $80"
- Descontos e promoções: "50% OFF", "Leve 2 Pague 1"
- Disponibilidade: "Sem estoque", "Consultar", "Pré-venda"
💡 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:
- Autoadaptação de seletores: ML para detectar preços sem seletores manuais
- Detecção de anomalias: Identificar dados incorretos automaticamente
- Previsão de mudanças: Antecipar quando um concorrente mudará preços
- Priorização inteligente: Decidir quais produtos fazer scraping com mais frequência
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:
- Scrapy Framework - Framework Python para scraping
- Playwright - Automação de navegadores
- Beautiful Soup - Parser de HTML/XML