Como Criar um Pipeline de Web Scraping para Atualização Semanal de Cardápios em Python
Manter um diretório gastronômico atualizado — similar a plataformas consolidadas de consulta de preços — exige precisão e consistência. Restaurantes alteram itens, aplicam reajustes sazonais e modificam a estrutura de suas páginas com frequência. Fazer essa coleta manualmente é inviável, e scripts frágeis quebram na primeira alteração de layout.
Para garantir que os dados reflitam a realidade, a solução ideal é a implementação de um pipeline automatizado de extração, estruturação e versionamento de dados com execução semanal.
Arquitetura do Pipeline de Extração
Um fluxo de raspagem resiliente deve ser dividido em quatro etapas bem definidas:
- Descoberta e Rastreamento: Mapeamento de URLs de restaurantes e detecção de páginas de cardápio.
- Extração e Renderização Dinâmica: Coleta de HTML estático ou renderização JavaScript (quando o conteúdo for carregado via AJAX/SPA).
- Normalização e Validação: Conversão de texto não estruturado em modelos de dados estritos (nome do prato, descrição, categoria, preço, moeda).
- Carga e Versionamento Semanal: Atualização do banco de dados registrando histórico de alterações de preços.
│
▼
[Playwright / Scrapy] ──► [Parser & Normalização] ──► [Validação Pydantic] ──► [PostgreSQL / API]
1. Extração Dinâmica com Python e Playwright
Muitos sites modernos de restaurantes utilizam frameworks front-end dinâmicos. Nesses casos, ferramentas como Playwright ou Scrapy-Playwright oferecem controle sobre renderização e contorno de carregamentos assíncronos.
python
import asyncio
from playwright.asyncapi import asyncplaywright
from bs4 import BeautifulSoup
async def extrairhtmlcardapio(url: str) -> str:
async with asyncplaywright() as p:
browser = await p.chromium.launch(headless=True)
page = await browser.newpage()
# Configuração de headers e timeout
await page.goto(url, wait_until="networkidle", timeout=30000)
conteudo = await page.content()
await browser.close()
return conteudo
2. Estruturação dos Dados com Pydantic
Para diretórios online, a consistência dos dados é fundamental. Definir esquemas rígidos impede que inconsistências visuais corrompam a base de dados.
python
from pydantic import BaseModel, Field
from typing import List, Optional
class ItemCardapio(BaseModel):
nome: str
descricao: Optional[str] = None
categoria: str
preco: float = Field(gt=0, description=”Preço deve ser maior que zero”)
disponivel: bool = True
class CardapioRestaurante(BaseModel):
restauranteid: str
datacoleta: str
itens: List[ItemCardapio]
Como especialista em IA e engenharia de dados, recomendo a integração de modelos de linguagem leves (LLMs via APIs especializadas) apenas nas etapas onde seletores CSS tradicionais falharem devido a layouts excessivamente caóticos. Isso reduz custos computacionais e preserva a velocidade da pipeline.
3. Gestão de Mudanças e Agendamento Semanal
Para gerenciar o ciclo semanal sem sobrecarregar a infraestrutura:
- Controle de Frequência e Rate Limiting: Implemente intervalos respeitosos e rotação de proxies residenciais para evitar bloqueios de IP.
- Detecção de Mudanças (Diffing): Antes de sobrescrever o registro, compare o hash do conteúdo ou o preço anterior para manter um histórico confiável de reajustes.
- Agendamento Robusto: Utilize orquestradores como Celery com Redis Beat, Apache Airflow ou GitHub Actions agendados via cron jobs para acionar as coletas nos períodos de menor tráfego.
Conclusão
A construção de um diretório de cardápios automatizado não se resume a extrair texto de uma página, mas sim a projetar um fluxo contínuo, resiliente e escalável capaz de lidar com mudanças de layout e grandes volumes de dados.
Se você precisa de um pipeline profissional de web scraping e inteligência de dados sob medida para o seu projeto, entre em contato para avaliar uma consultoria ou desenvolvimento dedicado com o Thiago Programador.


