Voltar ao blogue
Guias
Gabriel CiociLast updated on May 1, 202618 min read

Como fazer Web Scrape com Puppeteer e NodeJS Guia 2026

Como fazer Web Scrape com Puppeteer e NodeJS Guia 2026
Resumo: O Puppeteer permite-lhe controlar totalmente uma instância do Chrome sem interface gráfica a partir do Node.js, tornando-o na ferramenta de eleição para extrair páginas renderizadas em JavaScript. Este guia orienta-o através da instalação, extração baseada em seletores, rolagem infinita, preenchimento de formulários de login, interceção de pedidos, plugins de modo invisível, exportação de dados estruturados e implementação no Docker, para que possa passar de um script experimental para um scraper pronto para produção.

O web scraping é a prática de extrair dados de websites de forma programática e, quando esses sites dependem de JavaScript do lado do cliente para renderizar o seu conteúdo, uma simples solicitação HTTP não é suficiente. É necessário um navegador real, ou pelo menos algo que funcione como tal. Esse é exatamente o problema que o Puppeteer foi criado para resolver.

O Puppeteer é uma biblioteca Node.js que permite fazer web scraping com o Puppeteer e o NodeJS, controlando uma instância do Chrome sem interface gráfica (ou com interface gráfica) através do Protocolo Chrome DevTools. Ele pode clicar em botões, preencher formulários, percorrer páginas e avaliar JavaScript arbitrário no contexto da página, devolvendo depois os resultados ao seu script. Para programadores já familiarizados com JavaScript, é um dos caminhos mais naturais para os fluxos de trabalho de scraping com navegador sem interface gráfica.

Neste tutorial, irá aprender a configurar um projeto Puppeteer a partir do zero, extrair dados de páginas estáticas e dinâmicas, lidar com paginação e rolagem infinita, interceptar chamadas de API ocultas, evitar a deteção de bots, exportar os seus resultados para JSON e CSV e implementar tudo dentro de um contentor Docker. Todos os exemplos de código destinam-se ao Node.js 18 ou posterior, e fazemos referência à superfície da API do Puppeteer v24 ao longo de todo o tutorial. Quer esteja a construir um rastreador de preços, um pipeline de geração de leads ou uma ferramenta de investigação académica, os padrões deste guia irão levá-lo à produção mais rapidamente.

Como o Puppeteer funciona nos bastidores

Quando chama puppeteer.launch(), a biblioteca inicia um processo do Chromium (ou Chrome) e liga-se a ele através do Protocolo Chrome DevTools (CDP). O CDP é uma interface baseada em WebSocket que expõe quase todas as capacidades do navegador: inspeção do DOM, monitorização de rede, simulação de entrada e muito mais. O seu script Node.js envia comandos através deste socket, e o Chromium responde com os resultados.

Esta arquitetura significa que o Puppeteer não é um simulador de navegador simplificado. Ele executa JavaScript V8 real, um motor de renderização real e uma pilha de rede real. Páginas que dependem de fetch, Web Workers ou Shadow DOM comportam-se da mesma forma que se comportariam no navegador de um utilizador. É isso que o torna uma escolha tão fiável quando se pretende fazer web scraping com o Puppeteer e o NodeJS em sites que renderizam conteúdo dinamicamente.

O Puppeteer suporta tanto o modo headless (sem janela visível, mais rápido, ideal para servidores) como o modo headful (uma janela de navegador visível, útil para depuração). Por predefinição, as versões recentes do Puppeteer vêm com um binário do Chromium incluído, pelo que não é necessário instalar um navegador separadamente. Se quiser compreender o que é um navegador headless com mais detalhe, existem excelentes recursos que explicam a arquitetura e os casos de utilização comuns.

Configurar o seu projeto Node.js e instalar o Puppeteer

Antes de escrever qualquer código de scraping, certifique-se de que tem o Node.js 18 ou superior instalado. No momento da redação deste artigo, o Puppeteer v24 requer, no mínimo, o Node.js 18.0.

node --version   # should print v18.x or higher
mkdir puppeteer-scraper && cd puppeteer-scraper
npm init -y
npm install puppeteer

A execução npm install puppeteer baixa a biblioteca e um binário Chromium compatível (aproximadamente 170 MB). Se já gere a sua própria instalação do Chrome ou quiser uma instalação mais leve, pode usar puppeteer-core em vez disso, o que ignora o download do navegador incluído. Isto é comum em ambientes Docker e CI, onde instala o Chromium através do gestor de pacotes do sistema.

A pasta do seu projeto deve agora conter um node_modules diretório e um package.json com o Puppeteer listado como dependência. Crie um ficheiro chamado scraper.js (ou scraper.mjs se preferir módulos ES) e está pronto para compilar o seu primeiro projeto Puppeteer de web scraper em Node.js.

Uma nota rápida: a equipa do Puppeteer atualiza o Chromium incluído em cada lançamento, por isso, fixar uma versão específica (por exemplo npm install puppeteer@24.26.1) ajuda a manter as suas compilações de CI reproduzíveis em todos os ambientes.

O seu primeiro scraper: iniciar, navegar e extrair HTML

O alvo clássico para iniciantes em web scraping com o Puppeteer é o Quotes to Scrape, um site sandbox criado especificamente para praticar técnicas de extração.

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch({ headless: true });
  const page = await browser.newPage();
  await page.goto('https://quotes.toscrape.com', {
    waitUntil: 'domcontentloaded',
  });

  const html = await page.content();
  console.log(html.substring(0, 500));

  await browser.close();
})();

Eis o que acontece passo a passo:

  1. puppeteer.launch() inicia um processo Chromium sem interface gráfica.
  2. browser.newPage() abre um separador em branco.
  3. page.goto() navega até ao URL de destino. A waitUntil opção indica ao Puppeteer quando considerar a navegação concluída. Usar domcontentloaded é mais rápido do que networkidle0 mas pode não incluir conteúdo carregado de forma diferida.
  4. page.content() retorna o HTML totalmente renderizado da página.
  5. browser.close() encerra o processo do navegador e liberta recursos.

Este esqueleto é a base para todos os scrapers do Puppeteer que irá criar. O padrão permanece o mesmo: iniciar, navegar, extrair, fechar. O que muda é a lógica de extração no meio, que iremos aprofundar nas secções seguintes.

Execute o script com node scraper.js e deverá ver o HTML bruto impresso no seu terminal. Se obtiver erros relativos à falta de bibliotecas partilhadas no Linux, avance para a secção de implementação para obter a correção.

Para uma referência completa dos métodos do navegador e da página, a documentação oficial da API do Puppeteer é a fonte mais fiável.

Aguardar por Conteúdo Dinâmico e Analisar Elementos

As páginas estáticas são o caso mais fácil. Os sites dinâmicos carregam conteúdo após a resposta HTML inicial, por vezes através de chamadas XHR, por vezes através de frameworks de renderização do lado do cliente. O Puppeteer fornece várias estratégias de espera para lidar com isto quando faz web scraping com o Puppeteer e o NodeJS em aplicações modernas de página única.

A abordagem mais fiável é page.waitForSelector(), que pausa a execução até que um seletor CSS específico apareça no DOM:

await page.goto('https://quotes.toscrape.com');
await page.waitForSelector('.quote');

Assim que os elementos estiverem presentes, use page.evaluate() para executar JavaScript no contexto do navegador e enviar os dados de volta para o Node.js:

const quotes = await page.evaluate(() => {
  const items = document.querySelectorAll('.quote');
  return Array.from(items).map(item => ({
    text: item.querySelector('.text').innerText,
    author: item.querySelector('.author').innerText,
    tags: Array.from(item.querySelectorAll('.tag')).map(t => t.innerText),
  }));
});

console.log(quotes);

Algumas coisas a ter em conta sobre page.evaluate():

  • A chamada de retorno é executada no navegador, não no Node.js. Não é possível referenciar variáveis ou módulos do Node.js dentro dela.
  • O valor de retorno deve ser serializável (objetos simples, matrizes, cadeias de caracteres, números). Não é possível retornar elementos DOM diretamente.
  • Se um seletor não corresponder a nada, querySelector retorna null, o que irá lançar uma exceção quando tentar ler .innerText. Envolver o acesso em encadeamento opcional (?.) ou uma verificação de nulo evita falhas silenciosas em produção.

Para páginas que carregam conteúdo com um temporizador em vez de um evento DOM, page.waitForTimeout() funciona como alternativa, mas prefira esperas baseadas em seletores sempre que possível, uma vez que são mais rápidas e mais determinísticas. Se estiver a decidir entre uma biblioteca de automação de navegador completa e um analisador mais leve, guias que comparam o Cheerio com o Puppeteer podem ajudá-lo a escolher a ferramenta certa para o trabalho.

Scraping de padrões dinâmicos comuns

A maioria dos alvos de scraping no mundo real não apresenta todos os seus dados num único carregamento de página. Irá deparar-se com paginação, rolagem infinita, barreiras de login e outros padrões interativos. Abaixo estão os três mais comuns que precisa de lidar quando faz scraping na Web com o Puppeteer e o NodeJS em sites de produção.

Conteúdo paginado e rastreamento de várias páginas

A paginação é o padrão mais frequente com que se deparará. A estratégia é simples: extraia os dados da página atual, encontre o link «Seguinte», navegue até ele e repita até não haver mais páginas.

let currentPage = 1;
const allQuotes = [];

while (true) {
  await page.waitForSelector('.quote');
  const pageQuotes = await page.evaluate(() =>
    Array.from(document.querySelectorAll('.quote')).map(q => ({
      text: q.querySelector('.text').innerText,
      author: q.querySelector('.author').innerText,
    }))
  );
  allQuotes.push(...pageQuotes);

  const nextButton = await page.$('li.next > a');
  if (!nextButton) break;

  await Promise.all([
    page.waitForNavigation({ waitUntil: 'domcontentloaded' }),
    nextButton.click(),
  ]);
  currentPage++;
}

console.log(`Scraped ${allQuotes.length} quotes across ${currentPage} pages.`);

O detalhe fundamental é envolver click() e waitForNavigation() dentro Promise.all. Se clicar primeiro e depois esperar, o Puppeteer pode perder o evento de navegação porque este já foi disparado. Esta proteção contra condições de corrida é essencial para um rastreamento multipáginas fiável.

Adicionar uma lógica de repetição torna este padrão pronto para produção. Envolva a navegação num try/catch, defina um tempo limite para waitForNavigatione tente novamente a página até três vezes antes de registar a falha e seguir em frente. Este tipo de tratamento de erros é o que distingue os exemplos de scraping do Puppeteer em publicações de blogues dos scrapers que funcionam sem supervisão durante a noite.

Páginas de rolagem infinita

A rolagem infinita substitui a paginação por um gatilho «carregar mais» acionado ao rolar até ao fundo da página. Os feeds de redes sociais e as páginas de listagem de produtos utilizam frequentemente este padrão. Para fazer scraping num site dinâmico com o Puppeteer, deve rolar programaticamente e aguardar que apareça novo conteúdo.

async function autoScroll(page, maxScrolls = 10) {
  let previousHeight = 0;
  let scrollCount = 0;

  while (scrollCount < maxScrolls) {
    previousHeight = await page.evaluate(() => document.body.scrollHeight);
    await page.evaluate(() => window.scrollTo(0, document.body.scrollHeight));
    await new Promise(r => setTimeout(r, 1500));

    const newHeight = await page.evaluate(() => document.body.scrollHeight);
    if (newHeight === previousHeight) break;
    scrollCount++;
  }
}

A função compara scrollHeight antes e depois de cada deslocamento. Quando a altura deixa de mudar, ou todo o conteúdo foi carregado ou é necessário clicar num botão «Mostrar mais». Adicione um maxScrolls limite para evitar loops infinitos em páginas com feeds genuinamente intermináveis. Também pode monitorizar o número de itens na página (através de querySelectorAll) como um sinal de terminação secundário, que detecta casos em que novo conteúdo é carregado, mas não altera a altura total da página.

Clicar em botões, preencher formulários e iniciar sessão

O scraping atrás de uma barreira de login requer interação com formulários. O Puppeteer page.type() simula a digitação tecla a tecla, e page.click() aciona eventos reais do rato, o que é importante porque alguns sites monitorizam eventos de entrada em vez de apenas verificarem os valores dos campos.

await page.goto('https://quotes.toscrape.com/login');
await page.type('#username', 'testuser');
await page.type('#password', 'testpass');
await Promise.all([
  page.waitForNavigation(),
  page.click('input[type="submit"]'),
]);

Após o login, a sessão do navegador retém cookies automaticamente para navegação subsequente. Pode continuar a aceder a páginas autenticadas sem voltar a introduzir credenciais durante essa sessão. Se o site apresentar primeiro um banner de consentimento de cookies, clique no botão «Aceitar» antes de interagir com o formulário de login.

Para fluxos de trabalho de formulários mais complexos (assistentes de várias etapas, uploads de ficheiros, seleções em menus suspensos), o Puppeteer oferece métodos como page.select() para <select> elementos e elementHandle.uploadFile() para entradas de ficheiros. Pode explorar o envio de formulários com o Puppeteer em guias dedicados que abordam estas interações avançadas.

Interceptar Pedidos de Rede e Capturar APIs Ocultas

Eis uma técnica que a maioria dos tutoriais de web scraping com o Puppeteer ignora por completo: em vez de analisar o DOM, intercepte as solicitações de rede que a página faz e obtenha as cargas JSON estruturadas diretamente das próprias chamadas de API do site.

Muitos sites modernos obtêm os seus dados através de pedidos XHR ou Fetch e renderizam-nos no lado do cliente. Se conseguir capturar essas cargas, evita completamente a complexa dança dos seletores CSS.

await page.setRequestInterception(true);

page.on('response', async (response) => {
  const url = response.url();
  if (url.includes('/api/products') && response.status() === 200) {
    try {
      const data = await response.json();
      console.log('Captured API response:', data);
    } catch (e) {
      // Not a JSON response, skip
    }
  }
});

page.on('request', (request) => {
  const blocked = ['image', 'font', 'stylesheet'];
  if (blocked.includes(request.resourceType())) {
    request.abort();
  } else {
    request.continue();
  }
});

await page.goto('https://example-spa.com');

Esta abordagem é poderosa por duas razões. Primeiro, a resposta já é JSON estruturado, pelo que não precisa de escrever seletores de todo. Segundo, tende a ser mais estável ao longo do tempo, porque os contratos de API mudam com menos frequência do que a marcação da interface do utilizador.

Para descobrir quais pontos de extremidade uma página chama, abra o separador Rede das DevTools do seu navegador no site de destino, filtre por «Fetch/XHR» e procure respostas que contenham os dados de que necessita. Em seguida, filtre esses padrões de URL no seu manipulador de interceção. Esta técnica de recolha de API oculta é um dos diferenciadores mais fortes que pode adicionar ao seu kit de ferramentas de scraping Puppeteer node.js. Permite-lhe fazer scraping na Web com o Puppeteer e o NodeJS de forma mais eficiente, evitando totalmente a análise do DOM para páginas suportadas por API.

Otimização de desempenho e scraping paralelo

Uma única página do Puppeteer processa os pedidos sequencialmente. Quando precisa de extrair milhares de URLs, essa abordagem serial torna-se um estrangulamento. Aqui estão as duas otimizações de maior impacto para escalar o fluxo de trabalho do seu scraper web NodeJS com o Puppeteer.

Bloqueie recursos desnecessários. Imagens, tipos de letra, folhas de estilo e ficheiros multimédia consomem largura de banda e tornam o carregamento das páginas mais lento, sem contribuírem com quaisquer dados que possam ser extraídos. Desativar o carregamento de imagens e vídeos é uma das formas mais eficazes de acelerar os scrapers do Puppeteer, e não causa perda de dados, uma vez que esses recursos permanecem acessíveis na marcação DOM. Utilize a interceção de pedidos para abortar estes tipos de recursos (conforme mostrado na secção anterior). Esta única alteração pode reduzir para metade os tempos de carregamento das páginas em sites com grande quantidade de multimédia.

Execute várias páginas em simultâneo. O Puppeteer é assíncrono por natureza, e o Node.js lida bem com a simultaneidade através de Promise.all. Em vez de processar URLs uma de cada vez, abra várias páginas e extraia-as em paralelo:

const urls = ['https://example.com/1', 'https://example.com/2', 'https://example.com/3'];
const browser = await puppeteer.launch({ headless: true });

const scrape = async (url) => {
  const page = await browser.newPage();
  try {
    await page.goto(url, { waitUntil: 'domcontentloaded', timeout: 15000 });
    const title = await page.evaluate(() => document.title);
    return { url, title };
  } catch (err) {
    return { url, error: err.message };
  } finally {
    await page.close();
  }
};

const results = await Promise.all(urls.map(scrape));
console.log(results);

Repare no try/catch/finally . Em produção, páginas individuais ocasionalmente expiram ou falham. Envolver cada tarefa garante que uma URL incorreta não bloqueie todo o lote. O finally garante que a página feche mesmo em caso de erro, evitando fugas de memória.

Um limite prático de simultaneidade é de 5 a 10 páginas por instância do navegador, dependendo da RAM da sua máquina. Para além disso, considere iniciar várias instâncias do navegador ou agrupar URLs em blocos sequenciais. Cada página do Chromium consome cerca de 30 a 80 MB de memória, e isso acumula-se rapidamente quando executa dezenas de separadores em simultâneo. Para trabalhos verdadeiramente em grande escala, poderá querer mudar para uma nuvem de navegadores gerida em vez de hospedar o Chrome localmente.

Evitar a deteção de bots: proxies e plugins de camuflagem

Embora o Puppeteer execute um navegador real, os sites ainda conseguem detetar tráfego automatizado através de impressões digitais de JavaScript, análise de cabeçalhos e heurísticas comportamentais. Se já viu um scraper funcionar bem durante 20 pedidos e depois começar a devolver CAPTCHAs, a deteção de bots é a razão.

Os plugins de camuflagem são a primeira linha de defesa. O pacote puppeteer-extra-plugin-stealth corrige vários vetores de deteção conhecidos: o navigator.webdriver flag, matrizes de plugins do Chrome, strings do renderizador WebGL e muito mais. No momento da redação deste artigo, verifique se a versão do plugin Stealth que instalou é compatível com a sua versão do Puppeteer, uma vez que as duas bibliotecas podem ficar desincronizadas após grandes lançamentos.

const puppeteer = require('puppeteer-extra');
const StealthPlugin = require('puppeteer-extra-plugin-stealth');
puppeteer.use(StealthPlugin());

const browser = await puppeteer.launch({ headless: true });

A rotação de proxies é a segunda camada. Alternar o seu endereço IP de saída entre pedidos torna muito mais difícil para um site correlacionar e bloquear o seu tráfego. Pode passar um proxy no momento do arranque na sua configuração de scraping furtivo do Puppeteer:

const browser = await puppeteer.launch({
  args: ['--proxy-server=http://proxy-address:port'],
});

Uma limitação a ter em conta: a API nativa do Puppeteer não suporta a troca de proxy por pedido. O proxy é definido ao nível do navegador, pelo que alterá-lo requer o reinício da instância do navegador. Para rotação de proxy do Puppeteer de alto volume, isto torna-se impraticável sem uma camada externa de gestão de proxy ou um conjunto dedicado de proxies residenciais.

Para além das medidas técnicas, deve também adicionar atrasos razoáveis entre os pedidos e respeitar robots.txt . Ser um bom utilizador reduz a probabilidade de o seu IP ser bloqueado e mantém o seu scraper a funcionar por mais tempo. Para um conjunto abrangente de estratégias práticas, pode consultar dicas para evitar ser bloqueado durante o web scraping.

Exportar dados extraídos para JSON e CSV

Registar os resultados na consola é adequado para depuração, mas os scrapers de produção necessitam de uma saída de ficheiros estruturada. O Node.js torna isto simples com o módulo fs .

Exportação para JSON:

const fs = require('fs');
const data = [{ text: 'Example quote', author: 'Author' }];
fs.writeFileSync('quotes.json', JSON.stringify(data, null, 2), 'utf-8');

Exportação para CSV:

const header = 'text,author\n';
const rows = data.map(d => `"${d.text}","${d.author}"`).join('\n');
fs.writeFileSync('quotes.csv', header + rows, 'utf-8');

Para uma geração de CSV mais robusta (que lide com vírgulas dentro de valores, caracteres especiais e grandes conjuntos de dados), considere uma biblioteca como csv-stringify ou fast-csv. Estas lidam com casos extremos, como aspas incorporadas e campos com várias linhas, que uma abordagem simples com literais de modelo não consegue resolver.

Escolha JSON quando os consumidores a jusante forem outros programas ou APIs. Escolha CSV quando os dados se destinem a folhas de cálculo, bases de dados com importação de CSV ou partes interessadas não técnicas que pretendam abrir o ficheiro no Excel. Seja qual for o formato escolhido, gravar dados no disco de forma incremental à medida que faz web scraping com o Puppeteer e o NodeJS (em vez de acumular tudo na memória) é fundamental para tarefas de longa duração que possam falhar a meio do processo.

Implementação do Puppeteer em servidores e no Docker

Os scrapers do Puppeteer que funcionam perfeitamente no macOS muitas vezes deixam de funcionar no momento em que os implementa num servidor Linux. O navegador Chrome headless herda pacotes do sistema operativo, e os servidores Linux normalmente não têm as bibliotecas partilhadas relacionadas com a GUI que o Chromium espera.

Para servidores Debian ou Ubuntu, instale as dependências em falta:

apt-get update && apt-get install -y \
  ca-certificates fonts-liberation libasound2 libatk1.0-0 \
  libcups2 libdbus-1-3 libgdk-pixbuf2.0-0 libnspr4 libnss3 \
  libx11-xcb1 libxcomposite1 libxrandr2 xdg-utils

Para implementações no Docker, um Dockerfile mínimo tem o seguinte aspeto:

FROM node:18-slim
RUN apt-get update && apt-get install -y chromium
ENV PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
CMD ["node", "scraper.js"]

Duas opções de lançamento essenciais para ambientes em contentores:

puppeteer.launch({
  headless: true,
  args: ['--no-sandbox', '--disable-setuid-sandbox'],
});

Sem --no-sandbox, o Chromium recusará iniciar dentro da maioria dos contentores Docker. Estas flags são seguras num scraper em contentor onde controla os URLs de entrada, mas evite-as em ambientes que processam conteúdo não confiável. Adicionar o seu scraper implementado no Docker a um pipeline de CI (GitHub Actions, GitLab CI) é simples assim que o contentor for compilado e executado corretamente. Esta etapa de implementação é onde muitos programadores encontram obstáculos, por isso planeie fazer web scraping com o Puppeteer e o NodeJS num ambiente em contentores desde o início, se souber que vai precisar de implementação em servidor.

Como fazer web scraping com o Puppeteer e o NodeJS vs. usar o Playwright

Se está a avaliar ferramentas para scraping com navegador headless, provavelmente também já viu o Playwright ser mencionado. Ambas as bibliotecas partilham o mesmo DNA (o Playwright foi criado por antigos mantenedores do Puppeteer), mas visam necessidades diferentes.

Funcionalidade

Puppeteer

Playwright

Suporte a navegadores

Chromium, Firefox (experimental)

Chromium, Firefox, WebKit

SDKs de linguagem

JavaScript/TypeScript

JS/TS, Python, Java, C#

Mecanismo de espera automática

Manual (waitForSelector, waitForNavigation)

Espera automática integrada na maioria das ações

Plug-ins da comunidade

Grande ecossistema (puppeteer-extra, stealth)

Ecossistema de plugins mais reduzido

Ideal para

Scraping focado no Chrome, bases de código JS existentes

Testes em vários navegadores, equipas multilingues

Se os seus alvos de scraping necessitam apenas do Chromium e a sua equipa já escreve JavaScript, o Puppeteer é a escolha mais simples e madura, com um ecossistema de plugins mais vasto. O Playwright destaca-se quando necessita de suporte para vários navegadores ou quando trabalha numa linguagem diferente do JavaScript. Para uma análise mais abrangente das opções, pode consultar outras alternativas ao Puppeteer para encontrar a ferramenta que melhor se adapta aos requisitos do seu projeto.

Independentemente da biblioteca que escolher, os conceitos fundamentais abordados neste guia (estratégias de espera, interceção de pedidos, medidas de camuflagem, tratamento de erros) aplicam-se diretamente ao Playwright, com apenas pequenas diferenças na API.

Pontos-chave

  • O Puppeteer controla um navegador Chromium real através do Protocolo DevTools, tornando-o ideal para extrair páginas renderizadas em JavaScript que os clientes HTTP simples não conseguem processar.
  • Utilize sempre waitForSelector em vez de tempos de espera fixos, envolva os cliques de navegação em Promise.alle adicione try/catch blocos em torno das operações da página para criar scrapers resilientes.
  • Intercepte pedidos de rede para capturar diretamente cargas JSON de API ocultas, contornando totalmente os seletores DOM frágeis.
  • Combine plugins de camuflagem e rotação de proxies para reduzir o risco de deteção de bots e combine-os com práticas de scraping responsáveis, como limitação de taxa e conformidade com o robots.txt.
  • Exporte dados estruturados para JSON ou CSV, implemente no Docker com os sinalizadores de sandbox corretos e processe páginas simultâneas em lote para escalar além de scripts de URL único.

Perguntas frequentes

Por que é que o meu scraper Puppeteer se comporta de forma diferente quando implementado num servidor Linux em comparação com a minha máquina local?

Os servidores Linux normalmente não possuem bibliotecas partilhadas relacionadas com a GUI das quais o Chromium depende, tais como libx11-xcb, libnss3e pacotes de fontes. Instale-os com apt-get ou utilize uma imagem base do Docker que as inclua. Além disso, a execução sem o --no-sandbox fará com que o Chrome falhe na maioria dos hosts Linux, porque o sandboxing do kernel requer permissões elevadas que os contentores normalmente restringem.

Como posso manter cookies e dados de sessão entre várias execuções de scraping do Puppeteer?

Use page.cookies() para exportar os cookies da sessão atual como uma matriz JSON e, em seguida, guarde-os num ficheiro com fs.writeFileSync. Em execuções subsequentes, carregue o ficheiro e chame page.setCookie(...cookies) antes de navegar para o site de destino. Isto preserva as sessões de login, as definições de preferências e os tokens CSRF sem necessidade de reautenticação em cada execução.

A legalidade varia de acordo com a jurisdição e os termos de serviço do site de destino. Em geral, o scraping de dados disponíveis publicamente é permitido em muitas regiões, mas violar os Termos de Serviço de um site pode acarretar riscos legais. Verifique sempre o ficheiro robots.txt (normalmente em https://domain.com/robots.txt) e respeite as suas Disallow diretivas. Adicione intervalos entre os pedidos e evite sobrecarregar os servidores com tráfego muito intenso.

Como devo lidar com CAPTCHAs ao fazer scraping com o Puppeteer?

Os CAPTCHAs são especificamente concebidos para bloquear a automação. Os plugins de camuflagem podem atrasar o seu aparecimento ao mascarar as impressões digitais do navegador, mas assim que um CAPTCHA é apresentado, o Puppeteer por si só não consegue resolvê-lo. Pode integrar serviços de resolução de CAPTCHAs de terceiros através das suas APIs, ou reestruturar o seu scraper para reduzir os sinais de deteção (taxas de pedidos mais lentas, endereços IP residenciais, tamanhos de janela de visualização aleatórios) para que os CAPTCHAs sejam acionados com menos frequência.

Conclusão

O Puppeteer continua a ser uma das ferramentas mais capazes para extrair dados de sites dinâmicos e com uso intensivo de JavaScript a partir de um ambiente Node.js. Ao longo deste guia, aprendeu a configurar um projeto, extrair conteúdo com seletores e page.evaluate(), lidar com paginação e rolagem infinita, interceptar respostas de API ocultas, aplicar medidas de camuflagem, exportar dados estruturados e implementar o seu scraper no Docker.

A principal lição é que passar de um protótipo funcional para um scraper de produção requer atenção ao tratamento de erros, à concorrência e à anti-detecção, não apenas à traversal do DOM. Envolver páginas em try/catch, agrupar pedidos simultâneos e rodar proxies são os padrões que distinguem os scripts que falham após 50 pedidos daqueles que funcionam de forma fiável em grande escala.

Se se vir a gastar mais tempo a lutar contra bloqueios, CAPTCHAs e infraestrutura de proxy do que a escrever lógica de extração, isso é normalmente um sinal para descarregar a camada de pedidos. A API de Scraper da WebScrapingAPI gere a rotação de proxies, a gestão de impressões digitais do navegador e a resolução de CAPTCHAs por trás de um único ponto de extremidade, permitindo-lhe manter o seu código de análise do Puppeteer e apenas trocar a camada de rede sem reestruturar o resto do seu scraper.

Sobre o autor
Gabriel Cioci, Desenvolvedor Full-Stack @ WebScrapingAPI
Gabriel CiociDesenvolvedor Full-Stack

Gabriel Cioci é um programador Full Stack na WebScrapingAPI, responsável pela criação e manutenção dos sites, do painel do utilizador e das principais funcionalidades da plataforma destinadas aos utilizadores.

Comece a construir

Pronto para expandir a sua recolha de dados?

Junte-se a mais de 2.000 empresas que utilizam a WebScrapingAPI para extrair dados da Web à escala empresarial, sem quaisquer custos de infraestrutura.