Uma introdução ao Web Scraping com Node.js (JavaScript)

Raspagem, Jan-08-20225 minutos de leitura

Está à procura de formas de utilizar as novas tecnologias? A extração ou raspagem da Web proporciona-lhe uma forma de recolher dados estruturados da Web de forma automatizada. Por exemplo, a extração de dados da Web é utilizada no mundo do comércio eletrónico para monitorizar os preços dos serviços e produtos da concorrência. Outros casos de utilização da extração de dados da Web

Índice

Está à procura de formas de utilizar as novas tecnologias? A extração ou raspagem da Web proporciona-lhe uma forma de recolher dados estruturados da Web de forma automatizada. Por exemplo, a extração de dados da Web é utilizada no mundo do comércio eletrónico para monitorizar os preços dos serviços e produtos da concorrência. Seguem-se outros casos de utilização da extração de dados da Web.

  • Encontrar dados de tendências em sítios de redes sociais
  • Recolher dados de outro sítio Web para os utilizar no seu próprio sítio Web
  • Extrair endereços de correio eletrónico de sítios Web que publicam correio eletrónico público
  • Recolha de imagens de produtos e dados de vendas em lojas online

Aprenderá a fazer scraping da Web com o Node.js. Mas, primeiro, vamos ver o que é o Node.js. É uma plataforma de código aberto para desenvolver aplicações do lado do servidor e de rede. A sua biblioteca é muito rápida na execução do código porque as suas aplicações não armazenam quaisquer dados em buffer. Limitam-se a enviar os dados por partes. Seguem-se alguns dos domínios em que podemos utilizar o Node.js.

  • Aplicações de fluxo contínuo de dados
  • Aplicações de página única
  • Aplicações vinculadas de entrada/saída
  • Aplicações em tempo real com grande volume de dados

Por que usar Node.js para Web Scraping?

Seguem-se as razões para utilizar o Node.js para a recolha de dados na Web.

Fácil de aprender - O Javascript é uma linguagem de programação popular utilizada pelos programadores de front-end. Eles podem aprender e usar rapidamente o Node.js no backend, pois é um Javascript simples. Assim, não precisam de fazer um esforço extra para aprender Node.js.

Linguagem de programação única - É possível utilizar o Node.js para escrever aplicações do lado do servidor em Javascript. Em suma, os programadores do Node.js utilizam o Javascript para escrever aplicações Web de frontend e backend. Não precisam de utilizar qualquer outra linguagem de programação do lado do servidor. Assim, podem facilmente implementar aplicações Web porque quase todos os navegadores Web suportam Javascript. 

Escalabilidade - Os programadores de Node.js podem facilmente escalar as aplicações nas direcções horizontal e vertical. Podem adicionar nós adicionais aos sistemas existentes para escalar as aplicações horizontalmente. Podem escalar verticalmente as aplicações adicionando recursos extra aos nós individuais. 

Alto desempenho - O Node.js utiliza o motor Javascript V8 da Google para interpretar o código Javascript, uma vez que o compila diretamente no código da máquina. Assim, é possível implementar eficazmente o código utilizando este motor. 

Armazenamento em cache - Os programadores podem também armazenar em cache módulos individuais utilizando o ambiente de execução de código aberto do Node.js. O armazenamento em cache permite que as aplicações carreguem as páginas Web mais rapidamente, pelo que os programadores não têm de reutilizar os códigos.   

Raspagem da Web usando Node.js

Para o web scraping usando o Node.js, usaremos os dois módulos npm a seguir.

cheerio - É uma tecnologia Javascript utilizada para extrair dados de sítios Web. Ajuda a selecionar, editar e visualizar elementos DOM.

request-promise - É um cliente HTTP simples que pode ser utilizado para efetuar chamadas HTTP rápidas e fáceis.

Configuração do projeto

Tem de criar uma nova pasta de projeto. Criar um ficheiro index.js dentro dessa pasta. De seguida, tem de instalar as dependências. Para isso, abra sua linha de comando e digite o seguinte comando. 

npm install --save request request-promise cheerio

Tem de exigir o request-promise e o cheerio no seu ficheiro index.js utilizando o código abaixo.

const rp = require('request-promise');;
const cheerio = require('cheerio');

Definir pedido

Sabe que request-promise é um "pedido" do cliente com suporte para Promise. Por outras palavras, aceita um objeto como entrada e devolve uma promessa. 

const options = {
 uri: `https://www.yourURLhere.com`,
 transform: function (body) {
   return cheerio.load(body);
 }
};

No código acima, o objeto options tem de fazer duas coisas.

  • Passando o URL, pretende extrair
  • Carregamento do HTML devolvido utilizando o cheerio para que o possa utilizar.

A chave uri no código é o sítio Web que pretende extrair.

A chave de transformação carrega o corpo devolvido no cheerio usando request-promise antes de o devolver a nós.

Fazer pedido

Pode efetuar o seu pedido utilizando o código abaixo.

rp(OPTIONS)
   .then(function (data) {
       // REQUEST SUCCEEDED: DO SOMETHING
   })
   .catch(function (err) {
       // REQUEST FAILED: ERROR OF SOME KIND
   });

Estamos a passar o objeto options para request-promise no código acima. Em seguida, esperamos para ver se nosso pedido é bem-sucedido ou não. 

Agora, criamos a nossa própria versão do código, na qual utilizamos funções de seta, como se mostra abaixo.

rp(options)
 .then(($) => {
   console.log($);
 })
 .catch((err) => {
   console.log(err);
 });

Tem de substituir o uri do marcador de posição pelo sítio Web que pretende extrair. Pode então abrir a sua consola e escrever o seguinte no ficheiro index.js.

{ [Function: initialize]
 fn:
  initialize {
    constructor: [Circular],
    _originalRoot:
     { type: 'root',
       name: 'root',
       namespace: 'http://www.w3.org/1999/xhtml',
       attribs: {},
       ...

É assim que você pode fazer seu primeiro scrape usando o Node.js. Aqui está o código completo que fizemos até agora.

const rp = require('request-promise');
const cheerio = require('cheerio');
const options = {
  uri: `https://www.google.com`,
  transform: function (body) {
    return cheerio.load(body);
  }
};

rp(options)
  .then(($) => {
    console.log($);
  })
  .catch((err) => {
    console.log(err);
  });

Utilizar os dados

Pode utilizar o cheerio para extrair os dados que pretende. A implementação do seletor do cheerio é quase a mesma que a do jQuery. Pode usar o método seletor para percorrer e selecionar elementos no documento. Também pode usá-lo para obter e definir dados. Por exemplo, quer extrair o seguinte HTML de um sítio Web.

 id="cidades">
 class="large">Europa
 id="média">Turquia
 class="small">Salem

Podemos utilizar '#' para selecionar id's, '.' para selecionar classes. Os elementos podem ser seleccionados pelos seus nomes de etiquetas, como se mostra abaixo.

$('.large').text()
// Europa
$('#medium').text()
// Turquia
$('li[class=small]').html()

Podemos utilizar a função each() para iterar através de vários elementos. Podemos devolver o texto interno do item da lista utilizando o mesmo código HTML mostrado acima.

$('li').each(function(i, elem) {
 cities[i] = $(this).text();
});

É assim que se pode extrair dados de sítios Web utilizando o Node.js. Também é possível utilizar métodos adicionais para extrair os dados de elementos filhos de uma lista ou o HTML de um sítio Web.

A importância de usar o Node.js com proxies

Sabe que os proxies actuam como intermediários entre os clientes que solicitam recursos e o servidor que os fornece. Existem três tipos diferentes de proxies, conforme mostrado abaixo.

Proxy residencial - Este proxy contém endereços IP do fornecedor de serviços Internet (ISP) local, pelo que o sítio Web alvo não consegue determinar se é uma pessoa real ou o scraper que está a navegar no sítio Web. 

Proxy de centro de dados - Este tipo de proxy é de um fornecedor de serviços na nuvem e é utilizado por um grande número de pessoas porque é mais barato do que os proxies residenciais.

Proxy móvel - Os proxies móveis são IPs de dispositivos móveis privados e funcionam tal como os proxies residenciais. São fornecidos pelos operadores de redes móveis e são muito caros. 

Pode utilizar um proxy para a recolha de dados da Web utilizando o módulo requests do Python. Primeiro, tem de importar o módulo requests. Depois, tem de criar um conjunto de proxies e iterá-los. Pode utilizar requests.get() para enviar o pedido GET, passando um proxy como parâmetro para o URL, como se mostra abaixo.

import requests
proxy = 'http://114.121.248.251:8080'
url = 'https://ipecho.net/plain'
# Sending a GET request to the url and
# passing the proxy as a parameter.
page = requests.get(url,
                   proxies={"http": proxy, "https": proxy})
 # Printing the content of the requested url.
print(page.text)

Obterá o seguinte resultado.

Conclusão sobre Web Scraping usando Node.js

Até agora, discutimos que você pode extrair dados estruturados de sites usando o método automatizado chamado raspagem da Web. É possível extrair os sites usando diferentes linguagens, mas, neste artigo, aprendemos a usar o Node.js para coletar dados de sites. Tudo o que temos de fazer é adicionar código ao ficheiro index.js da pasta do projeto. Depois de configurar o projeto, podemos definir e fazer o pedido para extrair os dados. Além disso, podemos utilizar os dados para vários fins. Sabe-se que não é seguro fazer scrape de sítios Web. Por isso, é necessário utilizar proxies para recolher dados do sítio Web pretendido. Pode utilizar proxies residenciais ou de centros de dados, mas é preferível utilizar os proxies residenciais, uma vez que são rápidos e não podem ser facilmente detectados.