Uma plataforma de baixo código que combina a simplicidade sem código com o poder do código completo 🚀
Comece gratuitamente
Gerenciamento de cache no Puppeteer: desabilitação, limpeza e otimização de desempenho
24 de março de 2025
.
6
min ler

Gerenciamento de cache no Puppeteer: desabilitação, limpeza e otimização de desempenho

Jorge Miloradovitch
Pesquisador, redator e entrevistador de casos de uso
Índice

Quer mais rápido Marionetista automação? Gerenciar o cache do navegador é essencial. Este guia aborda como desabilitar, limpar e otimizar o cache para melhor desempenho.

Key Takeaways:

  • Desabilitando o Cache: Usar setCacheEnabled(false) ou sinalizadores de inicialização do navegador como --disable-cache para simular novos carregamentos de páginas.
  • Limpar o cache: Usar Network.clearBrowserCache via Protocolo Chrome DevTools (CDP) para ambientes de teste limpos.
  • Cache Inteligente: Reduza a transferência de dados em até 92% com lógica de cache personalizada e armazenamento na memória.
  • Aumento de desempenho: Bloqueie recursos desnecessários, como imagens ou anúncios, para acelerar os testes e economizar largura de banda.

O gerenciamento eficiente de cache pode reduzir drasticamente o uso de dados, melhorar a precisão dos testes e acelerar os fluxos de trabalho de automação. Mergulhe para saber como!

Marionetista Tutorial #4 | Iniciar navegador com opções

Marionetista

Desligando o cache no Puppeteer

Desabilitar o cache no Puppeteer pode ser útil para tarefas de teste e automação onde são necessários novos carregamentos de página. Veja como você pode fazer isso e o que ter em mente.

Com o setCacheEnabled() Forma

Você pode desativar o cache no Puppeteer com o setCacheEnabled() método:

await page.setCacheEnabled(false);

Execute este comando antes de navegar para qualquer página. Por padrão, o cache está ativado, então você precisa desativá-lo quando seus testes exigirem uma carga limpa de recursos. Para uma solução mais ampla para o navegador, confira a próxima seção.

Sinalizadores de inicialização do navegador para cache

Para desabilitar o cache no nível do navegador, inicie Chromium com sinalizadores específicos:

const browser = await puppeteer.launch({
    args: ['--disable-cache']
});

Este método funciona bem quando você precisa controlar o cache de toda a sessão do navegador, complementando o setCacheEnabled() abordagem.

O que acontece quando você desabilita o cache?

Quando o cache está desligado, todos os recursos são baixados frescos, o que pode tornar as coisas mais lentas e aumentar o uso de dados. Por exemplo, testes em CNNO site da mostrou um salto de 88% na transferência de dados quando o cache foi desabilitado. Para encontrar um equilíbrio entre precisão e desempenho, considere estas dicas:

  • Use o Chrome DevTools para verificar se o conteúdo da página pode ser armazenado em cache.
  • Adicione cache na memória para recursos específicos, se aplicável.
  • Desabilite o cache somente quando seu cenário de teste exigir.
  • Fique de olho na confiabilidade da rede quando o cache estiver desativado.

Desabilitar o cache é ótimo para simular o comportamento do usuário iniciante, mas pondere as compensações com base nos seus objetivos de teste.

Removendo dados de cache no Puppeteer

Testes automatizados geralmente precisam de um cache limpo para manter resultados consistentes.

Limpando o cache com setCacheEnabled()

Você pode limpar dados de cache usando comandos do Chrome DevTools Protocol (CDP):

const client = await page.target().createCDPSession();
await client.send('Network.clearBrowserCache');
await page.setCacheEnabled(false);

Essa abordagem limpa o cache do navegador e desabilita o armazenamento em cache, garantindo um novo começo para suas tarefas de automação.

Você também pode limpar o cache e os cookies juntos:

const client = await page.target().createCDPSession();
await client.send('Network.clearBrowserCache');
await client.send('Network.clearBrowserCookies');

Manipulando tipos específicos de armazenamento

Às vezes, você pode precisar limpar dados armazenados específicos em vez de todo o cache. Veja como você pode gerenciar cookies:

// Clear all cookies
const cookies = await page.cookies();
await page.deleteCookie(...cookies);

// To delete a specific cookie, use:
// await page.deleteCookie({ name: 'cookie_name', url: 'https://example.com' });

// Set cookies to expire
const cookies = await page.cookies();
for (let cookie of cookies) {
    cookie.expires = -1;
}
await page.setCookies(...cookies);

Isso permite um controle preciso sobre o gerenciamento de cookies durante seus testes.

Gerenciando Cache em Várias Guias

Ao trabalhar com várias abas, é uma boa ideia isolar os dados do cache usando contextos de navegador separados. Veja como:

const browser = await puppeteer.launch();
const context = await browser.createIncognitoBrowserContext();
const page = await context.newPage();

const client = await page.target().createCDPSession();
await client.send('Network.clearBrowserCache');

// Close the context after tasks are done
await context.close();

O uso de contextos separados evita a interferência de cache entre as guias, o que o torna ideal para executar testes paralelos.

sbb-itb-23997f1

Configurações de cache para melhor velocidade

Gerenciar o cache de forma eficaz no Puppeteer pode reduzir a transferência de dados em até 92%, tornando a automação muito mais rápida.

Uso de Cache Inteligente

Para equilibrar velocidade e dados atualizados, você pode interceptar solicitações e respostas para implementar um cache mais inteligente. Aqui está um exemplo:

const cache = new Map();

async function handleRequest(request) {
    const url = request.url();
    if (cache.has(url)) {
        const cachedResponse = cache.get(url);
        if (isFresh(cachedResponse)) {
            return request.respond(cachedResponse);
        }
    }

    // Continue the request if it's not cached
    request.continue();
}

async function handleResponse(response) {
    const headers = response.headers();
    if (headers['cache-control'] && headers['cache-control'].includes('max-age')) {
        const responseData = {
            status: response.status(),
            headers: headers,
            body: await response.buffer()
        };
        cache.set(response.url(), responseData);
    }
}

Esta configuração minimiza solicitações de rede desnecessárias, mantendo os dados essenciais atualizados, validando o cache-control cabeçalho.

Construindo regras de cache personalizadas

Adapte o cache às suas necessidades criando regras específicas. Por exemplo:

const customCacheRules = {
    shouldCache: (response) => {
        const headers = response.headers();
        return headers['cache-control'] && 
               headers['cache-control'].includes('max-age') &&
               Number(headers['cache-control'].match(/max-age=(\d+)/)[1]) > 0;
    },

    getExpirationTime: (headers) => {
        const maxAge = headers['cache-control'].match(/max-age=(\d+)/)[1];
        return Date.now() + (parseInt(maxAge) * 1000);
    }
};

Essas regras ajudam a determinar quais respostas armazenar em cache e por quanto tempo mantê-las.

Verificando o desempenho do cache

Depois que suas regras de cache estiverem definidas, avalie seu impacto usando métricas de desempenho:

const metrics = {
    totalRequests: 0,
    cachedResponses: 0,
    dataSaved: 0
};

async function trackCacheMetrics(request, response) {
    metrics.totalRequests++;
    if (response.fromCache()) {
        metrics.cachedResponses++;
        metrics.dataSaved += parseInt(response.headers()['content-length'] || 0);
    }
}

Rastreie métricas-chave como solicitações totais, respostas em cache e dados salvos. Aqui está uma comparação com base em testes:

Tipo de métrica Sem Cache Com Cache Melhoria
Transferência De Dados 177 MB 13.4 MB Redução de 92%

Esses resultados destacam como um cache bem projetado pode melhorar drasticamente o desempenho do Puppeteer.

Problemas e soluções comuns

Corrigindo problemas de cache

Ao usar o Puppeteer, habilitar a interceptação de requisição desabilita o cache nativo do navegador. Isso pode levar a uma transferência de dados maior e tempos de carregamento de página mais lentos. Para resolver isso, você pode implementar o cache personalizado com a seguinte abordagem:

const browser = await puppeteer.launch();
const page = await browser.newPage();

// Initialize cache storage
const responseCache = new Map();

await page.setRequestInterception(true);
page.on('request', async request => {
    const url = request.url();
    if (responseCache.has(url)) {
        await request.respond(responseCache.get(url));
        return;
    }
    request.continue();
});

page.on('response', async response => {
    const url = response.url();
    const headers = response.headers();

    if (headers['cache-control'] && headers['cache-control'].includes('max-age')) {
        responseCache.set(url, {
            status: response.status(),
            headers: headers,
            body: await response.buffer()
        });
    }
});

Para evitar possíveis vazamentos de memória, certifique-se de limpar os recursos de forma eficaz:

async function cleanupResources(page) {
    await page.removeAllListeners();
    const client = await page.target().createCDPSession();
    await client.send('Network.clearBrowserCache');
    await client.detach();
    await page.close();
}

Ao combinar essas técnicas, você pode reduzir a sobrecarga e melhorar o desempenho do Puppeteer.

Dicas de gerenciamento de cache

Aqui estão algumas dicas práticas para gerenciar o cache de forma mais eficaz, com base em testes e análises:

Questão Solução Impacto
Alta transferência de dados Usar cache na memória Reduz o tráfego em até 92%
Vazamentos de recursos Aplicar procedimentos de limpeza Ajuda a prevenir o esgotamento da memória
Carregamentos de página lentos Bloquear recursos desnecessários Melhora significativamente a velocidade de renderização

Para melhor desempenho, você pode bloquear certos recursos, como imagens ou folhas de estilo, para acelerar o carregamento da página:

const browserOptions = {
    userDataDir: './cache-directory',
    args: [
        '--disable-background-timer-throttling',
        '--disable-extensions'
    ]
};

await page.setRequestInterception(true);
page.on('request', request => {
    if (request.resourceType() === 'image' || request.resourceType() === 'stylesheet') {
        request.abort();
    } else {
        request.continue();
    }
});

Usar essas estratégias pode otimizar seus fluxos de trabalho do Puppeteer e, ao mesmo tempo, manter o uso de recursos sob controle.

Conclusão

O gerenciamento eficiente de cache no Puppeteer pode melhorar drasticamente o desempenho enquanto reduz o uso de recursos. Este guia abordou como desabilitar, limpar e ajustar as configurações de cache para obter melhores resultados. Abaixo está um resumo conciso das principais estratégias e seus efeitos.

Pontos de resumo

Os testes mostraram o quão eficaz o gerenciamento adequado de cache pode ser, enfatizando a importância de manuseá-lo com cuidado.

Aqui está uma rápida olhada em algumas estratégias principais e seus resultados:

Estratégia Implementação Impacto no desempenho
Cache na memória Respostas de cache com max-age > 0 Redução de 92% na transferência de dados
Bloqueio de recursos Desativar anúncios e scripts de rastreamento Melhoria notável no carregamento da página
Tempo de captura de tela inteligente Use waitForSelector() Conclusão de renderização mais rápida
Cache entre sessões configurar userDataDir Mantém ativos CSS/JS/imagem

Dicas importantes para implementação

  • Otimização de Ativos: Compacte ativos e otimize imagens para minimizar cargas HTTP.
  • Cronometragem precisa: Faça capturas de tela exatamente quando o conteúdo estiver pronto, evitando atrasos desnecessários.
  • Eficiência de memória: Use operações de buffer em vez de gravações no sistema de arquivos para acelerar o processamento.

"Ao otimizar o Puppeteer, lembre-se de que há apenas algumas maneiras de acelerar o desempenho de inicialização/desligamento do próprio Puppeteer. Provavelmente, os maiores ganhos de velocidade virão de obter seu páginas de destino para renderizar mais rápido." - Jon Yongfook, Fundador, Bannerbear

Artigos Relacionados

Blogs relacionados

Caso de uso

Apoiado por