Pular para o conteúdo

Todos os trabalhosColetor de catálogo

Site fora do ar no meio da coleta.

Um robô percorre um catálogo on-line inteiro e entrega planilha, CSV e relatório em PDF com gráficos. Roda num site público feito para treino de coleta, então nenhum dado é de cliente.

Estado
demonstração
Período
09/2026
Stack
Python 3.12, Playwright assíncrono, Pydantic v2, openpyxl, reportlab, matplotlib, pytest

Feito por mim

Coleta, validação e exportações em Python.

Contexto

Site público de treino, sem dados de clientes.

Por dentro

Passageiro ou definitivo

429, 5xx e timeout são passageiros: espera crescente com um pouco de sorteio, para vários robôs não voltarem juntos. 4xx é definitivo e sai na hora. Tentar de novo um 404 só gasta o site dos outros.

Python
for attempt in range(1, self.s.attempts + 1):
    try:
        if self._gate is not None:
            await self._gate.wait()
        resp = await page.goto(url, wait_until=self.s.wait_until,
                               timeout=self.s.nav_timeout_ms)
        status = resp.status if resp else 0
        if status == 429 or status >= 500:
            raise TransientHTTPError(f"HTTP {status}")
        if status >= 400:
            raise PermanentHTTPError(f"HTTP {status}")
        return status, attempt
    except PermanentHTTPError:
        raise
    except (TransientHTTPError, PlaywrightTimeoutError, PlaywrightError) as exc:
        last_exc = exc
        if attempt == self.s.attempts:
            break
        wait = self.s.backoff_base_s * (2 ** (attempt - 1)) + random.uniform(0, 0.3)
        await asyncio.sleep(wait)
raise last_exc

Quatro robôs, um ritmo

Quando o robots.txt pede um intervalo, um portão global com trava espaça o início de cada requisição. Sem ele, quatro robôs bateriam quatro vezes mais rápido do que o pedido. O site de treino não pede intervalo, então esse portão só rodou em teste. Com um detalhe: o timer do Windows acorda uns 15 ms cedo, então a espera é um laço, não um sleep só.

Entrega que dá para agendar

Códigos de saída para agendador, os arquivos entregues trocados juntos para ninguém pegar um pela metade, proteção contra fórmula em CSV, e log de eventos em JSONL. Cada registro passa por validação: preço acima de zero, nota de 1 a 5.

Como sei que funciona

Na execução real de 25/09/2026: 1.000 produtos, 50 categorias, 80 páginas, 0 falhas, 0 registros inválidos, em 23,6 s de coleta. Essa execução teve 0 retries, então a espera crescente foi provada em teste offline, com respostas simuladas num Chromium de verdade.

O que isso não faz

  • É uma demonstração, em site de treino. Os preços não são de uma loja real.
  • Nessa execução o robots.txt do site de treino respondeu 404: o respeito a regras foi exercitado nos testes.

Telas

Relatório em PDF com gráficos gerado a partir do catálogo de treino
O relatório em PDF.
Planilha Excel com os dados coletados e o resumo por categoria
A planilha entregue.

Créditos: Demonstração em books.toscrape.com, site público criado para treino de coleta. Sem dados de clientes.

Me conta o problema.

Uma mensagem basta para começar. Eu mesmo respondo e, se fizer sentido, mando uma proposta por escrito: o que entra, o que fica de fora, prazo e preço.

WhatsApp (11) 99227-9903