WebScraping com Nodejs e Puppeteer (Chrome)
Coletando dados de uma página web e salvando as informações em json e xls (excel).
Caso você não tenha lido, já temos outro post bem similar a este, o qual inclusive recomendo a leitura, porém conforme descrito nele, seu desenvolvimento foi baseado em tecnologias depreciadas / não recomendadas, no caso PhantomJs e o próprio JQuery.
Por se tratar de uma tecnologia que não recebe mais atualizações e que possui limitações, por exemplo a própria versão do javascript (Apenas ES5) que pode ser utilizada, resolvi seguir meu próprio conselho do final daquela publicação e testar o puppeteer como ferramenta para webscraping.
Já antecipando o a conclusão deste post, é uma ótima alternativa.
Código fonte do projeto estará disponível em meu github. Link no final do post.
Conhecimentos Necessários
Para implementar o projeto, alguns conhecimento básicos se fazem necessários, dentre os quais:
- NodeJs / Javascript (básico / intermediário)
- Html / CSS (básico/intermediário)
Puppeteer
Grande parte do que você pode fazer manualmente no navegador, pode ser feito / automatizado utilizando o Puppeteer! Alguns exemplos abaixo:
- Criar screenshots e PDFs de páginas.
- Automatizar preenchimento de formulários, testes de UI, entradas via teclado, etc.
- Criar um ambiente de testes atualizado e automatizado. Rodar seus testes diretamente na ultima versão do chrome, utilizando as ultimas features do JavaScript e do Chrome.
- Testar extensões do Chrome.
- Etc
Preparação do Projeto
Em um terminal, dentro da pasta onde o projeto será criado:
mkdir puppeteer_test #Criar a pasta
cd puppeteer_test #Entrar na pasta criada
npm init #Iniciar npm no projeto
npm i --save puppeteer #Instalar o puppeteer no projeto
Preparação realizada, vamos realizar um teste inicial, para verificar se tudo está ok, conforme própria documentação do puppteer.
- Dentro da pasta puppeteer_test, crie um arquivo chamado exemplo.js
- Abra o arquivo e cole esta sequência de códigos
const puppeteer = require('puppeteer')puppeteer.launch({ headless:false,
args: ['--start-maximized']
}).then( async browser => {
const page = await browser.newPage()
await page.goto('https://example.com')
await page.screenshot({path: 'example.png'})
await browser.close()
})
O que vamos fazer aqui, é navegar até a página example.com e tirar um screenshot da página, que será salva como example.png.
Acrescentei o parâmetro headless: false, para que o navegador seja aberto e seja possível visualiza-lo funcionando de forma automatizada.
Conforme podemos ver no vídeo a cima, executamos o script através do comando node ./scrapTest.js e visualizamos o screenshot na pasta do projeto.
Introdução a ferramenta realizada, é hora de por a mão na massa, e trabalharmos em algum projeto real.
Bibliotecas adicionais
Para atingirmos nossos objetivos, vamos necessitar de algumas bibliotecas adicionais, que terão as seguintes funcionalidades:
XLSX — Será responsável por pegar nossos dados, e gravar eles em uma planilha de excel, no formato .xlsb, que é um formato binário do excel, permitindo o armazenamento de uma quantidade significativa de dados, em comparação aos formatos tradicionais (xlsx, xls, csv ..)
Se você programa em nodejs, você certamente conhece esse biblioteca. O lodash nos dará funções que facilitarão o trabalho com os dados que serão extraídos do DOM, tornando a captura dos dados ainda mais simples de ser realizada.
Por ultimo e definitivamente não menos importante, esta biblioteca nos permite camuflar nosso puppeteer, fazendo com que ele seja interpretado como um navegador comum e não de testes automatizados, conforme o comportamento padrão da ferramenta.
Este pacote contornou um possível problema que teríamos na extração dos dados, que é o captcha do google.
Sim, por incrível que pareça ele conseguiu de algum modo burlar esse captcha, e tornar a extração dos códigos em massa possível e extremamente simples. Se é um erro de implementação do desenvolvedor da página ? Possivelmente …
Todos esses pacotes podem ser instalados via yarn ou npm, ou caso você opte por clonar meu repositório do github, apenas siga os procedimentos padrões.
O vídeo abaixo, demostra o webscraping funcionando na prática, onde através das estruturas html e css percorremos todos os dados e utilizamos o nodejs como linguagem para extração dos dados.
Link para o repositório do projeto:
That’s all folks!
Obrigado e até o próximo post