quarta-feira, novembro 13, 2024
spot_img
InícioRamos da InformáticaMundoJSMundo do Web Scraping com Node.js e Puppeteer

Mundo do Web Scraping com Node.js e Puppeteer

Aprenda a fazer web scraping com Node.js e Puppeteer neste guia completo. Descubra como utilizar headless browsers para extrair dados de páginas dinâmicas, lidar com JavaScript, e automatizar interações com websites de forma eficiente.

Neste tutorial, mostramos como configurar o Puppeteer, executar tarefas de scraping em sites complexos, e evitar bloqueios de bots com hacks e boas práticas. Ideal para desenvolvedores que buscam extrair dados web com precisão e fidelidade usando uma das ferramentas mais poderosas do Node.js.

Ah, o web scraping! Desde os tempos mais remotos da internet (ou, pelo menos, desde 2010, quando eu mesmo comecei a criar meus primeiros robôs), ele tem sido o sonho de consumo de desenvolvedores e empresas. Quem nunca se viu na necessidade quase heróica — ou desesperada — de coletar dados com a precisão cirúrgica de um bisturi?

Um Scraper Incompleto — E a Necessidade de um Novo Ato

Se você seguiu meu tutorial anterior (deletei, estava muito ruim e não mais funcional), provavelmente já enfrentou alguns percalços. Afinal, o web scraping básico que apresentei é como um cavaleiro medieval que vai à guerra apenas com uma adaga: nobre, corajoso, mas fadado à derrota (entende o motivo de ter apagado?). O problema é que muitas páginas hoje são dinâmicas, cheias de JavaScript que se desenrola em tempo real, moldando o HTML enquanto você tenta, em vão, capturar algo que nem sequer está lá ainda.

Imagine, leitor, a desilusão do pobre desenvolvedor, que vê um HTML na tela do navegador, mas que, ao rodar seu scraper, recebe… nada. Absolutamente nada. A página, aquela ingrata, escondeu o ouro nas profundezas de seus scripts. Nosso bravo scraper, no entanto, é como um leitor ingênuo que tenta decifrar “Dom Casmurro” sem entender a malícia de Capitu: ele jamais verá o que está nas entrelinhas.

Mas não temamos! Para todo problema existe uma solução, e é aí que entra o headless browser — aquele navegador que, como um bom espião, faz tudo o que um navegador comum faz, mas sem que você o veja. É como se ele fosse um espectador invisível no teatro da web, assistindo à peça inteira enquanto o pobre HTML estático morre de tédio.

O Incomparável Poder do Puppeteer

Como todo bom protagonista, precisamos de um aliado à altura. E o nome dele é Puppeteer. Ah, o Puppeteer… Não pensem vocês que ele é um simples navegador sem cabeça. Longe disso! Ele é o artista invisível que executa com perfeição cada script, cada detalhe, como se fosse o maestro de uma grande sinfonia.

Diferente de outros “browsers sem rosto”, o Puppeteer tem a graça de usar o Chrome, esse ícone da modernidade digital, em modo headless, ou seja, sem interface gráfica. Ele faz todo o trabalho pesado, como um empregado discreto que resolve seus problemas enquanto você aproveita o lado bom da vida. O Chrome, em sua plenitude silenciosa, renderiza páginas e executa scripts como um ator que não erra uma linha.

Se antes eu sofria com ferramentas como PhantomJS, que me deixavam na mão, o Puppeteer apareceu como o salvador da pátria. Imagine o alívio! Ele roda o JavaScript da página, carrega o DOM completo, e faz tudo isso sem a inconveniência de uma janela de navegador piscando na sua cara.

Preparando o Cenário: Instalando Puppeteer

Agora, caro leitor, se você é desses que gosta de colocar a mão na massa — porque em teoria tudo parece fácil, mas a prática exige suor —, vamos ver como configurar o Puppeteer. Primeiro, tenha certeza de que você já tem o Node.js instalado. Se não tiver, está perdendo o bonde da história! Após isso, vamos criar o projeto e instalar o Puppeteer:

npm init -y
npm install puppeteer

Em seguida, vamos escrever o esqueleto do nosso scraper. Veja que é simples, quase poético, como as palavras de um romancista ao descrever a cena:

const puppeteer = require('puppeteer');

async function scrap() {
const browser = await puppeteer.launch({ headless: "new" });
const page = await browser.newPage();
await page.goto('http://books.toscrape.com/');
await page.waitForNetworkIdle();

const result = await page.evaluate(() => {
const books = [];
document.querySelectorAll('h3 > a').forEach(book => books.push(book.title));
return books;
});

await browser.close();
console.log(result);
}

scrap();

Aqui, invocamos o Puppeteer e ele, como um mago, lança o Chrome em modo headless, acessa a página e espera que todos os scripts e requisições se acalmem, como um público que aguarda o fim do espetáculo antes de aplaudir. Em seguida, coletamos os títulos dos livros. Simples, direto, sem enrolações.

Rasgando o Véu da Paginação

Mas você há de me perguntar: e quando a página tem paginação? Ah, jovem padawan, aí o jogo fica interessante! Um web scraper digno desse nome precisa navegar entre páginas como um detetive que segue as pistas de um caso complicado.

Vamos fazer isso no exemplo do Books to Scrape, onde cada página exibe uma lista de livros e um botão “next” para passar à página seguinte. Veja como nosso Puppeteer, sempre diligente, faz o trabalho:

async function scrap() {
    const browser = await puppeteer.launch({ headless: "new" });
    const page = await browser.newPage();
    await page.goto('http://books.toscrape.com/');
    await page.waitForNetworkIdle();

    let hasNextPage = true;
    const allBooks = [];

    while (hasNextPage) {
        const booksOnPage = await page.evaluate(() => {
            const books = [];
            document.querySelectorAll('h3 > a').forEach(book => books.push(book.title));
            return books;
        });
        allBooks.push(...booksOnPage);

        // Verifica se existe uma próxima página
        hasNextPage = await page.evaluate(() => {
            const nextButton = document.querySelector('.next > a');
            return !!nextButton;
        });

        if (hasNextPage) {
            await Promise.all([
                page.click('.next > a'),
                page.waitForNetworkIdle(),
            ]);
        }
    }

    await browser.close();
    console.log(allBooks);
}

Conclusão: Um Final Feliz?

Nem sempre, meu caro leitor. No mundo do web scraping, o final feliz depende de muitas variáveis: o servidor pode bloqueá-lo, o site pode mudar sua estrutura, ou o JavaScript pode se rebelar como um personagem trágico que decide mudar o rumo da história. Mas com Puppeteer, você estará mais preparado do que nunca para enfrentar esses desafios e criar scrapers que capturam dados com maestria.

Por hoje, deixo aqui a promessa de que o web scraping com Node.js e Puppeteer é um caminho sem volta, mas daqueles que vale a pena trilhar. Até a próxima, e boa sorte nas suas aventuras digitais!

Antes de encerrar, meu estimado leitor, vou lhe poupar alguns tropeços pelo caminho — afinal, não quero que sua jornada com o Puppeteer e Node.js termine como uma peça de teatro mal ensaiada. Aqui vão alguns hacks e atalhos valiosos para otimizar seu trabalho e garantir que seu web scraper opere com a eficiência de um mestre dos bastidores.

Hacks para Puppeteer

  1. Use waitForSelector para Garantir a Existência de Elementos
    • Ao invés de esperar cegamente que a página esteja pronta, use await page.waitForSelector('.classe-do-seletor'). Isso garante que seu scraper só avance quando o elemento que você quer manipular estiver disponível. Menos chance de erros, mais precisão!
await page.waitForSelector('h3 > a');

Manipule Cookies para Contornar Bloqueios

  • Alguns sites podem tentar bloquear scrapers por meio de verificações repetidas de IP. Manipular cookies e sessões pode ajudar seu bot a se passar por um usuário real, evitando o bloqueio.
const cookies = await page.cookies();
await page.setCookie(...cookies);

Cuidado com o Consumo de Memória

  • Puppeteer pode ser uma fera faminta por memória. Abra o navegador em modo headless, mas feche as abas que não estão sendo usadas. Você pode usar browser.newPage() com moderação e fechar abas antigas com page.close().

Automatize Tarefas com evaluate()

  • O page.evaluate() é um canivete suíço. Use-o para rodar JavaScript diretamente no contexto da página que você está raspando. Ele pode clicar em botões, preencher formulários e até fazer scroll automático, como um assistente que trabalha sem parar nos bastidores.
await page.evaluate(() => {
    document.querySelector('input[name="search"]').value = 'Node.js';
    document.querySelector('button[type="submit"]').click();
});

Defina User-Agents Diferentes para Evitar Detecção

  • Mude seu User-Agent regularmente para evitar que seu scraper seja identificado como um bot. Isso é especialmente útil para sites que detectam e bloqueiam scrapers com base em padrões de comportamento.
await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36');

Use setViewport() para Simular Resoluções de Tela

  • Quer que seu scraper se passe por um usuário móvel? Ajuste a resolução com setViewport() para simular diferentes dispositivos.
await page.setViewport({ width: 1280, height: 800 });

Links Úteis

Agora, para aqueles que desejam se aprofundar nesse fascinante mundo de Puppeteer e Node.js, seguem alguns recursos essenciais para aprender mais e aprimorar suas habilidades:

Com esses recursos em mãos, você estará mais do que preparado para enfrentar o cenário caótico da web e seus desafios, enquanto continua refinando suas habilidades em Node.js e web scraping.

🚀 Última Imersão Dev do Ano: Conquiste o Back-End com a Alura e Google API da Gemini! Inscrição grátis.

Transforme-se em um Especialista em Dados, uma das áreas mais bem remuneradas atualmente: Formação completa em Engenheiro de Dados Projetos com situações do dia a dia.

Compartilhe este artigo e fortaleça sua marca pessoal agora mesmo!
Ramos Souza J
Ramos Souza Jhttps://ramosdainformatica.com.br/sobre/
Com mais de 26 anos de experiência em desenvolvimento de software, minha carreira é marcada por constante evolução tecnológica e pela entrega de soluções que fazem a diferença. Desde os primeiros passos com Clipper e Delphi até a consolidação em JavaScript e TypeScript, desenvolvi expertise em frameworks como Node.js, Nest e React, além de bancos de dados relacionais e não relacionais. Sou um Desenvolvedor Full Stack apaixonado por resolver problemas complexos com excelência técnica, adaptando-me rapidamente a novos desafios. Além do domínio técnico, sou reconhecido por meu relacionamento interpessoal e compromisso com resultados. Atualmente, trabalho em uma startup de Health-Tech e sou voluntário na OpenJS Foundation, promovendo o avanço do ecossistema JavaScript. Além de manter este site.

🚀 Última Imersão Dev do Ano: Conquiste o Back-End com a Alura e Google! Inscrição grátis.

Sua assinatura não pôde ser validada.
Você fez sua assinatura com sucesso.

E-Zine Ramos da Informática

Assine o E-Zine e tenha Conteúdo Exclusivo, Concursos para assinantes, descontos exclusivos e uma área de conteúdos exclusivos só do E-zine.

ARTIGOS RELACIONADOS
- Advertisment -spot_img

Seja um autor

Compartilhe seu conhecimento e inspire outros desenvolvedores! Torne-se um autor e publique seus artigos no nosso site. Junte-se a nós!

MAIS LIDOS

Lâmpada Inteligente Smart Color

10W Elgin RGB Wifi, compatível com Alexa e Google Home

- Advertisment -spot_img

APOIE CONTEÚDOS COMO ESTE

Apoie o Site e Nossos Conteúdos!
Cada compra feita através dos nossos links de afiliados nos ajuda a manter este site, a E-Zine e a trazer cada vez mais conteúdos relevantes para você.

Além de garantir sua compra sem custo adicional, você nos dá força para continuar criando e compartilhando. Obrigado por fazer parte desta jornada conosco!

🚀 Última Imersão Dev do Ano: Conquiste o Back-End com a Alura e Google! Inscrição grátis.