Web Scraping com Crawlee – Guia Passo a Passo

Descubra como usar o Crawlee para scraping de dados eficiente com Node.js, abordando desde a configuração básica até a rotação avançada de proxy e o tratamento de conteúdo dinâmico.
12 min de leitura
Web Scraping With Crawlee blog image

Se você tem interesse em scraping de dados, Crawlee pode ajudar. É um mecanismo de scraping rápido e interativo usado por cientistas de dados, desenvolvedores e pesquisadores para coletar dados da web. O Crawlee é fácil de configurar e oferece recursos como rotação de proxy e gerenciamento de sessão. Esses recursos são essenciais para fazer scraping de sites grandes ou dinâmicos sem ter seu endereço IP bloqueado, garantindo uma coleta de dados tranquila e ininterrupta.

Neste tutorial, você aprenderá como usar o Crawlee para scraping de dados. Você começará com um exemplo básico de scraping de dados e progredirá para conceitos mais avançados, como gerenciamento de sessão e scraping de páginas dinâmicas.

Como Fazer Scraping de Dados com Crawlee

Antes de iniciar este tutorial, certifique-se de ter os seguintes pré-requisitos instalados em sua máquina:

  • Node.js
  • npm
  • Visual Studio Code

Scraping de Dados Básico com Crawlee

Depois de ter todos os pré-requisitos, vamos começar fazendo scraping do site Books to Scrape, que é perfeito para aprendizado, pois oferece uma estrutura HTML simples.

Abra seu terminal ou shell e comece inicializando um projeto Node.js com os seguintes comandos:

mkdir crawlee-tutorial
cd crawlee-tutorial
npm init -y

Em seguida, instale a biblioteca Crawlee com o seguinte comando:

npm install crawlee

Para fazer scraping de dados de qualquer site de forma eficaz, você precisa inspecionar a página web que deseja raspar para obter os detalhes das tags HTML do site. Para isso, abra o site no seu navegador e navegue até as Ferramentas do Desenvolvedor clicando com o botão direito em qualquer lugar da página. Em seguida, clique em Inspecionar ou Inspecionar Elemento:

Inspecionar elemento HTML

A aba Elements deve estar ativa por padrão, e essa aba representa o layout HTML da página web. Neste exemplo, cada livro exibido está em uma tag HTML article com a classe product_pod. Dentro de cada artigo, o título do livro está contido em uma tag h3. O título real do livro está no atributo title da tag a localizada dentro do elemento h3. O preço do livro está dentro da tag p com classe price_color:

Inspecionar os elementos HTML no site Books to Scrape

No diretório raiz do seu projeto, crie um arquivo chamado scrape.js e adicione o seguinte código:

   const { CheerioCrawler } = require('crawlee');

   const crawler = new CheerioCrawler({
       async requestHandler({ request, $ }) {
           const books = [];
           $('article.product_pod').each((index, element) => {
               const title = $(element).find('h3 a').attr('title');
               const price = $(element).find('.price_color').text();
               books.push({ title, price });
           });
           console.log(books);
       },
   });

   crawler.run(['https://books.toscrape.com/']);

Neste código, você usa o CheerioCrawler do crawlee para fazer scraping de títulos e preços de livros em https://books.toscrape.com/. O crawler busca o conteúdo HTML, extrai dados dos elementos <article class="product_pod"> usando uma sintaxe similar ao jQuery e registra os resultados no console.

Depois de adicionar o código anterior ao seu arquivo scrape.js, você pode executar o código com o seguinte comando:

node scrape.js

Um array de títulos e preços de livros deverá ser impresso no seu terminal:

…output omitted…
  {
    title: 'The Boys in the Boat: Nine Americans and Their Epic Quest for Gold at the 1936 Berlin Olympics',
    price: '£22.60'
  },
  { title: 'The Black Maria', price: '£52.15' },
  {
    title: 'Starving Hearts (Triangular Trade Trilogy, #1)',
    price: '£13.99'
  },
  { title: "Shakespeare's Sonnets", price: '£20.66' },
  { title: 'Set Me Free', price: '£17.46' },
  {
    title: "Scott Pilgrim's Precious Little Life (Scott Pilgrim #1)",
    price: '£52.29'
  },
…output omitted…

Rotação de Proxy com Crawlee

Um Proxy é o intermediário entre seu computador e a internet. Quando você usa um Proxy, ele envia suas solicitações web ao servidor proxy, que as encaminha ao site de destino. O servidor proxy retorna a resposta do site, e o Proxy oculta seu endereço IP, evitando que você sofra limitação de taxa ou banimento de IP.

O Crawlee facilita a implementação de Proxy porque vem com tratamento de proxy integrado, que lida eficientemente com tentativas e erros. O Crawlee também suporta uma variedade de configurações de proxy para implementar proxies rotativos.

Na seção a seguir, você configurará um Proxy obtendo primeiro um proxy válido. Em seguida, verificará se suas solicitações estão passando pelos proxies.

Configurar um Proxy

Proxies gratuitos geralmente não são recomendados porque podem ser lentos e inseguros, e podem não ter o suporte necessário para tarefas web sensíveis. Em vez disso, considere usar a Bright Data, um serviço de proxy seguro, estável e confiável. Ela também oferece testes gratuitos, para que você possa testá-la antes de se comprometer.

Para usar a Bright Data, clique no botão Teste grátis na página inicial e preencha as informações necessárias para criar uma conta.

Após criar sua conta, faça login no painel da Bright Data, navegue até Proxies & Infraestrutura de Scraping e adicione um novo proxy selecionando Proxies Residenciais:

Adicionar um proxy residencial

Mantenha as configurações padrão e finalize a criação do seu proxy residencial clicando em Adicionar.

Se for solicitado que você instale um certificado, você pode selecionar Prosseguir sem certificado. No entanto, para produção e casos de uso reais, você deve configurar o certificado para evitar uso indevido caso suas informações de proxy sejam expostas.

Após a criação, anote as credenciais do proxy, incluindo host, porta, nome de usuário e senha. Você precisará delas na próxima etapa:

Credenciais do proxy da Bright Data

No diretório raiz do seu projeto, execute o seguinte comando para instalar a biblioteca axios:

npm install axios

Você usa a biblioteca axios para fazer uma requisição GET para http://lumtest.com/myip.json, que retorna os detalhes do proxy que você está usando cada vez que executa o script.

Em seguida, no diretório raiz do seu projeto, crie um arquivo chamado scrapeWithProxy.js e adicione o seguinte código:

const { CheerioCrawler } = require("crawlee");
const { ProxyConfiguration } = require("crawlee");
const axios = require("axios");

const proxyConfiguration = new ProxyConfiguration({
  proxyUrls: ["http://USERNAME:PASSWORD@HOST:PORT"],
});

const crawler = new CheerioCrawler({
  proxyConfiguration,
  async requestHandler({ request, $, response, proxies }) {
    // Make a GET request to the proxy information URL
    try {
      const proxyInfo = await axios.get("http://lumtest.com/myip.json", {
        proxy: {
          host: "HOST",
          port: PORT,
          auth: {
            username: "USERNAME",
            password: "PASSWORD",
          },
        },
      });
      console.log("Proxy Information:", proxyInfo.data);
    } catch (error) {
      console.error("Error fetching proxy information:", error.message);
    }

    const books = [];
    $("article.product_pod").each((index, element) => {
      const title = $(element).find("h3 a").attr("title");
      const price = $(element).find(".price_color").text();
      books.push({ title, price });
    });
    console.log(books);
  },
});

crawler.run(["https://books.toscrape.com/"]);

Nota: Certifique-se de substituir HOSTPORTUSERNAME e PASSWORD pelas suas credenciais.

Neste código, você está usando o CheerioCrawler do crawlee para fazer scraping de informações de https://books.toscrape.com/ usando um proxy especificado. Você configura o proxy com ProxyConfiguration; em seguida, busca e registra os detalhes do proxy usando uma requisição GET para http://lumtest.com/myip.json. Por fim, você extrai títulos e preços dos livros usando a sintaxe similar ao jQuery do Cheerio e registra os dados extraídos no console.

Agora, você pode executar e testar o código para garantir que os proxies estão funcionando:

node scrapeWithProxy.js

Você verá resultados semelhantes aos anteriores, mas desta vez suas solicitações são roteadas pelos proxies da Bright Data. Você também deverá ver os detalhes do proxy registrados no console:

Proxy Information: {
  country: 'US',
  asn: { asnum: 21928, org_name: 'T-MOBILE-AS21928' },
  geo: {
    city: 'El Paso',
    region: 'TX',
    region_name: 'Texas',
    postal_code: '79925',
    latitude: 31.7899,
    longitude: -106.3658,
    tz: 'America/Denver',
    lum_city: 'elpaso',
    lum_region: 'tx'
  }
}
[
  { title: 'A Light in the Attic', price: '£51.77' },
  { title: 'Tipping the Velvet', price: '£53.74' },
  { title: 'Soumission', price: '£50.10' },
  { title: 'Sharp Objects', price: '£47.82' },
  { title: 'Sapiens: A Brief History of Humankind', price: '£54.23' },
  { title: 'The Requiem Red', price: '£22.65' },
…output omitted..

Se você executar o script novamente com node scrapingWithBrightData.js, deverá ver um endereço IP diferente sendo usado pelo servidor proxy da Bright Data. Isso valida que a Bright Data rotaciona localizações e IPs cada vez que você executa seu script de scraping. Essa rotação é importante para contornar bloqueios ou banimentos de IP dos sites de destino.

Nota: Na proxyConfiguration, você poderia ter passado IPs de proxy diferentes, mas como a Bright Data faz isso por você, não é necessário especificar os IPs.

Gerenciamento de Sessões com Crawlee

As sessões ajudam a manter o estado entre múltiplas solicitações, o que é útil para sites que usam cookies ou sessões de login.

Para gerenciar uma sessão, crie um arquivo chamado scrapeWithSessions.js no diretório raiz do seu projeto e adicione o seguinte código:

const { CheerioCrawler, SessionPool } = require("crawlee");

(async () => {
  // Open a session pool
  const sessionPool = await SessionPool.open();

  // Ensure there is a session in the pool
  let session = await sessionPool.getSession();
  if (!session) {
    session = await sessionPool.createSession();
  }

  const crawler = new CheerioCrawler({
    useSessionPool: true, // Enable session pool
    async requestHandler({ request, $, response, session }) {
      // Log the session information
      console.log(`Using session: ${session.id}`);

      // Extract book data and log it (for demonstration)
      const books = [];
      $("article.product_pod").each((index, element) => {
        const title = $(element).find("h3 a").attr("title");
        const price = $(element).find(".price_color").text();
        books.push({ title, price });
      });
      console.log(books);
    },
  });

  // First run
  await crawler.run(["https://books.toscrape.com/"]);
  console.log("First run completed.");

  // Second run
  await crawler.run(["https://books.toscrape.com/"]);
  console.log("Second run completed.");
})();

Aqui, você está usando o CheerioCrawler e o SessionPool do crawlee para fazer scraping de dados de https://books.toscrape.com/. Você inicializa um pool de sessões e, em seguida, configura o crawler para utilizá-lo. A função requestHandler registra as informações da sessão e extrai títulos e preços de livros usando os seletores similares ao jQuery do Cheerio. O código realiza duas execuções consecutivas de scraping e registra o ID da sessão em cada execução.

Execute e teste o código para validar que diferentes sessões estão sendo usadas:

node scrapeWithSessions.js

Você deverá ver resultados semelhantes aos anteriores, mas desta vez também verá o ID da sessão para cada execução:

Using session: session_GmKuZ2TnVX
[
  { title: 'A Light in the Attic', price: '£51.77' },
  { title: 'Tipping the Velvet', price: '£53.74' },
…output omitted…
Using session: session_lNRxE89hXu
[
  { title: 'A Light in the Attic', price: '£51.77' },
  { title: 'Tipping the Velvet', price: '£53.74' },
…output omitted…

Se você executar o código novamente, deverá ver que um ID de sessão diferente está sendo usado.

Tratamento de Conteúdo Dinâmico com Crawlee

Se você está lidando com sites dinâmicos (ou seja sites com conteúdo populado por JavaScript), o scraping de dados pode ser extremamente desafiador, pois você precisa renderizar o JavaScript para acessar os dados. Para lidar com essas situações, o Crawlee se integra ao Puppeteer, um navegador headless que pode renderizar JavaScript e interagir com o site de destino como um humano faria.

Para demonstrar essa funcionalidade, vamos fazer scraping do conteúdo desta página do YouTube. Como sempre, antes de fazer scraping de qualquer coisa, certifique-se de revisar as regras e termos de serviço daquela página.

Após revisar os termos de serviço, crie um arquivo chamado scrapeDynamicContent.js no diretório raiz do seu projeto e adicione o seguinte código:

const { PuppeteerCrawler } = require("crawlee");

async function scrapeYouTube() {
  const crawler = new PuppeteerCrawler({
    async requestHandler({ page, request, enqueueLinks, log }) {
      const { url } = request;
      await page.goto(url, { waitUntil: "networkidle2" });

      // Scraping first 10 comments
      const comments = await page.evaluate(() => {
        return Array.from(document.querySelectorAll("#comments #content-text"))
          .slice(0, 10)
          .map((el) => el.innerText);
      });

      log.info(`Comments: ${comments.join("n")}`);
    },

    launchContext: {
      launchOptions: {
        headless: true,
      },
    },
  });

  // Add the URL of the YouTube video you want to scrape
  await crawler.run(["https://www.youtube.com/watch?v=wZ6cST5pexo"]);
}

scrapeYouTube();

Em seguida, execute o código com o seguinte comando:

node scrapeDynamicContent.js

Neste código, você usa o PuppeteerCrawler da biblioteca Crawlee para fazer scraping de comentários de vídeos do YouTube. Você começa inicializando um crawler que navega para uma URL específica de vídeo do YouTube e aguarda o carregamento completo da página. Após o carregamento, o código avalia o conteúdo da página para extrair os dez primeiros comentários selecionando elementos com o seletor CSS #comments #content-text. Os comentários são então registrados no console.

Sua saída deverá incluir os dez primeiros comentários relacionados ao vídeo selecionado:

INFO  PuppeteerCrawler: Starting the crawler.
INFO  PuppeteerCrawler: Comments: Who are you rooting for?? US Marines or Ex Cons 
Bro Mateo is a beast, no lifting straps, close stance.
ex convict doing the pushups is a monster.
I love how quick this video was, without nonsense talk and long intros or outros
"They Both have combat experience" is wicked 
That military guy doing that deadlift is really no joke.. ...
One lives to fight and the other fights to live.
Finally something that would test the real outcome on which narrative is true on movies
I like the comradery between all of them. Especially on the Bench Press ... Both team members quickly helped out on the spotting to protect from injury. Well done.
I like this style, no youtube funny business. Just straight to the lifts
…output omitted…

Você pode encontrar todo o código usado neste tutorial no GitHub.

Conclusão

Neste artigo, você aprendeu como usar o Crawlee para scraping de dados e viu como ele pode ajudar a melhorar a eficiência e a confiabilidade dos seus projetos de scraping de dados.

Lembre-se sempre de respeitar o arquivo robots.txt e os termos de serviço do site de destino ao fazer scraping de dados.

Pronto para elevar seus projetos de scraping de dados com dados, ferramentas e proxies de nível profissional? Explore a infraestrutura abrangente de scraping de dados da Bright Data, oferecendo conjuntos de dados prontos para uso e serviços avançados de proxy para otimizar seus esforços de coleta de dados.

Cadastre-se agora e inicie seu teste gratuito!