Como fazer web scrape com Node.js
Esse tutorial é indicado para iniciantes em Web scraping ou caso você precise saber quais recursos utilizar para realizar essa tarefa no Node.js. Você verá a poderosa combinação do Node.js + Cheerio + Axios para a raspagem de dados.
Pré requisitos
- NodeJs 18+ e npm 8+: Qualquer versão do Node.js 18+ com o npm é suficiente.
- Uma IDE ou editor de código de sua preferência. Recomendamos o Visual Studio Code, o qual foi utilizado pra criação desse tutorial.
Desejável:
- Conhecimento básico de javascript e chamadas HTTP - mas se não tiver, tudo bem também, vou explicar um pouco mais no decorrer do tutorial e você pode aprofundar depois :)
Mão na massa
Crie uma nova pasta e inicie um projeto javascript:
npm init -y
Adicione as bibliotecas do axios
e cheerio
:
npm install axios cheerio
Na raiz da pasta crie o arquivo ìndex.js
:
No arquivo index.js
faça a importação do cheerio
e axios
:
const axios = require('axios');
const cheerio = require('cheerio');
Ainda no index.js
crie o método executeScrape()
e faça a chamada dele ao final do arquivo:
async function executeScrape() {
}
executeScrape();
Agora utilizaremos o axios para fazer a chamada ao website que desejamos fazer a raspagem de dados
.
💡O axios é utilizado para realizarmos chamadas HTTP para outros sistemas. No nosso projeto o usaremos para fazer um request GET
e recuperar o HTML do site o qual nós faremos a raspagem dos dados. Para aprofundar no axios acesse a documentação.
Neste tutorial vamos usar o site do NodeBr para recuperar os dados da aba "Quem somos":
const url = 'https://nodebr.org/sobre/';
async function executeScrape() {
const { data } = await axios.get(url);
console.log(data);
}
executeScrape();
Execute o programa para validar o retorno do axios:
node index.js
Ao executar o programa devemos ver o HTML da página logado no console:
<!DOCTYPE html>
<html lang="en-US">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Quem Somos – NodeBR</title>
...
Agora utilizaremos o cheerio
para ler o HTML retornado pelo axios e simula-lo em uma espécie de estrutura de DOM virtual, onde conseguiremos realizar consultas utilizando seletores CSS.
💡O Cheerio analisa o HTML e fornece uma API para percorrer/manipular a estrutura de dados. Especificamente, ele não produz uma renderização visual, aplica CSS, carrega recursos externos ou executa JavaScript que é comum para um SPA (aplicativo de página única). Isso torna o Cheerio muito, muito mais rápido do que outras soluções. Mais informações acesse a documentação oficial.
Podemos nos livrar do console.log(data)
e faremos o carregamento do HTML no cheerio
a partir do método load()
, atribuindo o retorno para a variável $
:
async function executeScrape() {
const { data } = await axios.get(url);
const $ = cheerio.load(data);
}
Pronto, agora podemos realizar consultas utilizando seletores CSS a partir da variável $
.
💡Seletores CSS são padrões usados para selecionar elementos no HTML. Referência aqui
Para descobrir qual seletor usar para recuperar os dados que queremos vamos acessar a página https://nodebr.org/sobre/ e selecionar Inspecionar (ou apertar o comando CTRL + SHIFT + C
que também abre o seletor) e verificar a árvore HTML da página.
Podemos ver que o texto de "Quem somos" fica em um parágrafo dentro de uma div
com a classe "entry-content":
O seletor que retorna a informação que queremos é o 'div.entry-content > p'
. Para realizar a consulta utilizando um seletor podemos passa-lo para a variável $
. Por fim, usamos o método text()
para extrair o texto do parágrafo (este método funciona em outras tags HTML também!):
async function executeScrape() {
const { data } = await axios.get(url);
const $ = cheerio.load(data);
const entryContent = $('div.entry-content > p').text();
console.log(entryContent);
}
// A NodeBR é a maior comunidade brasileira de Node.js. Com uma organização descentralizada oferecemos ajuda, dicas, eventos e todo tipo de recursos gratuitos para que a plataforma Node.js possa ganhar tração no Brasil.
Prontinho, temos nosso web scraper feito com Node.js + Cheerio + Axios :)
Caso precise consultar o código final do projeto, basta acessar o repositório on github - não esqueça de deixar um like por lá :)
Até a próxima!
Top comments (0)