Scarnox · Blog

Monitoramento de preços com web scraping: um guia prático

Monitoramento de preços significa verificar o preço de um produto em um conjunto de sites, em uma agenda, e registrar o que você vê para comparar ao longo do tempo. Varejistas, marketplaces e analistas usam esse recurso. O scraping de preços também é uma das formas mais comuns de um scraper encontrar um captcha, então vale acertar o desenho desde o início. Este guia cobre o que monitorar, como extrair números de páginas que nunca foram feitas para isso, como armazenar e alertar sobre mudanças e como continuar dentro das regras de um site enquanto faz isso.

Comece com uma fonte que você tem permissão para usar

Antes de escrever qualquer código, verifique se o site oferece uma forma oficial de obter os dados: um feed de produtos, uma API ou um programa de parceiros. Essas opções são mais confiáveis do que o scraping e eliminam a maior parte do risco jurídico e técnico. O scraping é a alternativa para páginas públicas em que não existe um caminho oficial, e os termos e o robots.txt continuam valendo. A visão geral jurídica cobre as questões gerais.

Arquitetura em cinco partes

Um monitor confiável tem cinco partes, e manter cada uma separada facilita a depuração:

  1. Agendador. Decide quais páginas de produto visitar e quando. Espalhe as visitas ao longo do dia, em vez de verificar tudo no mesmo minuto.
  2. Coletor. Baixa a página, com um ritmo cuidadoso, novas tentativas e cache.
  3. Parser. Extrai o preço, o contexto da moeda e o status de estoque.
  4. Armazenamento. Guarda cada observação com data e hora, para que você tenha um histórico.
  5. Alertas. Compara o novo valor com o último e avisa quando ele cruza um limite que você definiu.

Extraia preços de páginas bagunçadas

Os preços aparecem de muitas formas: com separadores de milhar, com vírgula decimal, com um rótulo antes do número ou divididos em vários elementos. Mantenha o parser pequeno e teste-o com exemplos reais. Aqui está uma versão que assume o formato comum, com vírgula para milhar e ponto para decimal. Normalize os outros formatos antes de chamá-la.

import re
from decimal import Decimal, InvalidOperation

PRICE_PATTERN = re.compile(r"\d{1,3}(?:,\d{3})*(?:\.\d{1,2})?|\d+(?:\.\d{1,2})?")

def parse_price(text: str) -> Decimal | None:
    """Retorna o primeiro número do texto como Decimal, ou None."""
    match = PRICE_PATTERN.search(text.replace(" ", " "))
    if not match:
        return None
    try:
        return Decimal(match.group(0).replace(",", ""))
    except InvalidOperation:
        return None

print(parse_price("Now 1,249.50 in stock"))  # Decimal('1249.50')
print(parse_price("Sold out"))               # None

Use Decimal, e não float, para qualquer valor que você vá comparar ou somar. Arredondamentos de ponto flutuante podem fazer dois preços iguais parecerem diferentes. Guarde o texto bruto junto ao valor interpretado, para que você possa corrigir um bug do parser depois sem baixar todas as páginas de novo.

Guarde o histórico e detecte mudanças

Um preço isolado é um instantâneo. O valor de um monitor está no histórico. Guarde uma linha por observação, com o ID do produto, a fonte, a data e hora, o valor interpretado e o texto bruto. Assim, o alerta vira uma comparação simples com a linha anterior. Alerte apenas sobre mudanças relevantes, como uma queda acima de um percentual definido ou um produto que saiu de estoque, para não ser inundado de ruído.

Lide com variantes e kits

Uma página de produto costuma mostrar vários preços: um por tamanho ou cor, um preço de kit, um preço para membros ou um preço que só aparece depois de uma seleção. Decida antes de construir o que o monitor deve registrar. Uma abordagem comum é guardar o identificador da variante junto ao preço, para que a mudança em um tamanho não pareça uma mudança no produto inteiro. Tenha cuidado com preços "a partir de" e com preços originais riscados, porque um parser que pega o número errado vai gerar alertas falsos. Guarde o texto do rótulo ao lado de cada valor, para conferir o que foi lido quando um alerta parecer errado.

Agende com cuidado

Verifique cada produto em um intervalo compatível com a frequência com que o preço realmente muda. Um produto que muda todo dia não precisa de verificação de hora em hora. Adicione variação aleatória a cada visita, limite o número de requisições por site por hora e guarde os resultados em cache pelo intervalo escolhido. Esses hábitos mantêm a sua carga baixa e os dados consistentes.

Quando a página bloqueia você

Páginas de preço são alvos frequentes de acesso automatizado, então você pode ver um bloqueio, um limite de taxa ou um captcha. Recue quando vir um 429 ou um 503, e pare de visitar um site que continua recusando você. Se um captcha aparecer em uma página que você tem permissão para automatizar, o tipo de captcha ativo na Scarnox é o PopularCaptcha. O guia de PopularCaptcha em Python mostra o fluxo do token. Leia como não ser bloqueado no scraping antes de acrescentar mais mecanismos, porque, na maioria das vezes, controlar o ritmo resolve mais do que qualquer ferramenta extra.

Algumas páginas exibem os preços com JavaScript. Para essas, siga a abordagem de scraping de sites com JavaScript.

Faça scraping com responsabilidade

Próximos passos

Comece com crédito de teste grátis, sem cartão: crie uma conta e teste o fluxo de PopularCaptcha em uma página que você tem permissão para automatizar. Para as tarifas atuais, veja a página de preços.