Enquanto ferramentas como o Power Query do Excel são incrivelmente úteis para extrair dados de tabelas HTML, elas têm suas limitações. O que acontece quando a informação que você deseja não está em uma tabela? Ou quando está distribuída por várias páginas? É aqui que o web scraping com VBA entra em jogo, oferecendo uma flexibilidade que outras ferramentas não conseguem alcançar. Neste post, exploraremos as maravilhas do web scraping usando VBA, especialmente focando em como extrair informações de sites com múltiplas páginas.
Web scraping é o processo de extrair e coletar dados de páginas da web de forma automatizada. Utilizando softwares ou scripts específicos, é possível navegar por sites, acessar informações e armazená-las em formatos desejados, como tabelas ou bancos de dados, permitindo análises e utilizações diversas desses dados.
O web scraping com VBA no Excel oferece uma solução integrada que elimina a necessidade de ferramentas externas, proporcionando flexibilidade e automação diretamente no ambiente familiar do Excel. No entanto, como qualquer ferramenta, vem com suas próprias limitações. A seguir, estão listadas algumas das principais vantagens e desvantagens.
Antes de mergulharmos no coração do tutorial, é crucial abordar a importância dos pré-requisitos. Assim como um chef precisa garantir que tem todos os ingredientes certos antes de começar a cozinhar, quem deseja fazer web scraping com VBA no Excel precisa garantir que todas as ferramentas e conhecimentos necessários estão prontamente disponíveis.
Conhecimento Básico de VBA: Ter uma compreensão básica da linguagem VBA é fundamental. Isso não apenas facilita a compreensão do código que você estará escrevendo ou modificando, mas também permite que você solucione problemas ou personalize o código para atender às suas necessidades específicas.
Entendimento de HTML: Como o objetivo é extrair dados de páginas da web, ter uma noção de como as páginas da web são estruturadas (usando HTML) é essencial. Isso ajudará a identificar e acessar os dados que você deseja extrair.
Excel e Ambiente de Desenvolvimento: Certifique-se de que seu Excel esteja com a guia desenvolvedor visível para poder acessar o Editor VBA (ou use o atalho ALT+F11).
Conhecimento dos Termos de Uso do Site: Antes de começar a raspar um site, é vital entender e respeitar seus termos de uso. Alguns sites proíbem explicitamente o web scraping, e ignorar essas regras pode levar a consequências legais.
Agora que entendemos a importância dos pré-requisitos e temos nosso ambiente de desenvolvimento pronto, podemos mergulhar nas etapas específicas para realizar o web scraping com VBA no Excel.
Antes de começar a codificar, identifique o site ou a página da web de onde deseja extrair os dados. Examine a estrutura da página, especialmente os elementos HTML que contêm as informações desejadas.
Em nosso exemplo iremos usar o link “https://www.telelistas.net/pa/belem/pet+shops?pag=1″ para realização do tutorial, que lista todos os PetShops da Cidade de Belém do Para.
Antes de mergulhar no código, é essencial preparar sua planilha para receber os dados. Isso garante que, quando os dados forem extraídos, eles sejam organizados de maneira lógica e eficiente.
Pressione ALT + F11
para abrir o VBE. Uma vez dentro, insira um novo módulo clicando com o botão direito na janela do Projeto, selecionando Inserir
e depois Módulo
.
No VBE, é crucial adicionar as bibliotecas corretas para que seu código funcione sem problemas. Essas bibliotecas fornecem os objetos e métodos necessários para o web scraping.
Microsoft HTML Object Library: Esta biblioteca permite manipular e acessar elementos HTML usando VBA. Para adicioná-la:
Ferramentas
> Referências
.Microsoft HTML Object Library
e marque a caixa ao lado dela.Microsoft XML, v6.0: Esta é a biblioteca que permite ao VBA fazer solicitações HTTP para acessar páginas da web. Para adicioná-la:
Referências
, procure por Microsoft XML, v6.0
e marque a caixa ao lado dela.Clique em OK
para fechar a janela e salvar suas seleções.
Com essas referências adicionadas, você garante que o VBA tenha os recursos necessários para interagir com páginas da web e extrair dados delas.
Comece definindo um novo procedimento (subrotina) onde seu código de web scraping residirá. No VBE, dentro do módulo que você inseriu, comece digitando:
Sub MeuWebScraper()
'Seu codigo aqui...
End Sub
Antes de escrever o código principal, defina as variáveis que você usará. Isso pode incluir objetos para a conexão HTTP, o documento HTML e quaisquer variáveis auxiliares para loops ou armazenamento temporário de dados.
Dim http As New MSXML2.ServerXMLHTTP60 ' Objeto usado para fazer requisições HTTP. Permite que você acesse e baixe páginas da web.
Dim html As New MSHTML.HTMLDocument ' Objeto que representa um documento HTML. Usado para parsear e acessar elementos da página da web baixada.
Dim pet As Object ' Objeto para armazenar os nomes dos pet shops extraídos da página da web.
Dim endereco As Object ' Objeto para armazenar os endereços dos pet shops extraídos da página da web.
Dim tel As Object ' Objeto para armazenar os números de telefone dos pet shops extraídos da página da web.
Dim Pl As Worksheet ' Representa a planilha do Excel onde os dados raspados serão armazenados.
Dim i As Integer ' Variável de controle para o loop principal que itera através das páginas da web.
Dim uLin As Long ' Representa a última linha usada na planilha do Excel. Usado para determinar onde inserir novos dados.
Dim URL As String ' String que armazena a URL da página da web que está sendo raspada.
Dim nPag As Integer ' Representa o número total de páginas que serão raspadas.
Dim j As Integer ' Variável de controle para o loop interno que itera através dos elementos extraídos em uma única página da web.
É crucial definir qual planilha será usada para armazenar esses dados. Isso ajuda a garantir que os dados sejam inseridos no local correto, evitando possíveis confusões ou sobreposições.
' Define a planilha de destino onde os dados raspados serão armazenados.
Set Pl = ThisWorkbook.Sheets("Planilha1")
Um aspecto crucial do web scraping, especialmente ao lidar com sites que têm conteúdo distribuído em várias páginas, é determinar quantas páginas você deseja raspar. Isso é representado pela variável nPag
no código.
' Define o número total de páginas que serão raspadas.
nPag = 5
Uma vez que muitos sites distribuem conteúdo em várias páginas, é comum que o web scraping envolva a iteração através dessas páginas para coletar todos os dados necessários. O loop For
é usado para esse propósito.
' Itera através das páginas definidas para raspagem.
For i = 1 To nPag
' Constrói a URL da página atual baseada no número da página (i).
URL = "https://www.telelistas.net/pa/belem/pet+shops?pag=" & i
Next i
Depois de construir a URL para a página alvo, o próximo passo é realmente conectar-se a essa página, recuperar seu conteúdo e prepará-lo para a extração de dados. Aqui está como o código faz isso:
' Estabelece uma conexão com a página da web e recupera seu conteúdo.
http.Open "GET", URL, False
http.setRequestHeader "User-Agent", "Mozilla/5.0"
http.send
' Carrega o conteúdo da página no objeto HTML para posterior extração.
html.body.innerHTML = http.responseText
Após estabelecer a conexão e carregar o conteúdo da página, o próximo passo é identificar e extrair os dados específicos que você deseja e, em seguida, armazená-los na sua planilha do Excel.
' Identifica e extrai os elementos desejados da página da web.
Set pet = html.getElementsByClassName("card-title loga-class go-info")
Set endereco = html.getElementsByClassName("card-text text-muted")
Set tel = html.getElementsByClassName("botao loga-class ver-tel")
' Itera através dos elementos extraídos e os armazena na planilha.
For j = 0 To pet.Length - 1
uLin = Pl.Cells(Pl.Rows.Count, "A").End(xlUp).Row
Pl.Cells(uLin + 1, 1).Value = pet.Item(j).innerText
Pl.Cells(uLin + 1, 2).Value = endereco.Item(j).innerText
Pl.Cells(uLin + 1, 3).Value = tel.Item(j).getAttribute("data-telefone")
Next j
Após a extração e armazenamento dos dados, é essencial limpar e liberar os recursos utilizados. Isso ajuda a garantir que a memória seja liberada e que os objetos não continuem a consumir recursos após a conclusão do script.
' Limpa e libera os objetos utilizados.
Set http = Nothing
Set html = Nothing
Set Pl = Nothing
Set pet = Nothing
Set endereco = Nothing
Set tel = Nothing
Em web scraping, é comum encontrar páginas que não têm todos os dados esperados ou que possuem uma estrutura ligeiramente diferente. Para garantir que o código continue a executar mesmo quando se depara com tais inconsistências, é importante implementar um tratamento de erros.
' Implementa o tratamento de erros para continuar a execução mesmo quando um erro ocorre.
On Error Resume Next
Option Explicit
Sub MeuWebScraper()
Dim http As New MSXML2.ServerXMLHTTP60 ' Objeto usado para fazer requisições HTTP. Permite que você acesse e baixe páginas da web.
Dim html As New MSHTML.HTMLDocument ' Objeto que representa um documento HTML. Usado para parsear e acessar elementos da página da web baixada.
Dim pet As Object ' Objeto para armazenar os nomes dos pet shops extraídos da página da web.
Dim endereco As Object ' Objeto para armazenar os endereços dos pet shops extraídos da página da web.
Dim tel As Object ' Objeto para armazenar os números de telefone dos pet shops extraídos da página da web.
Dim Pl As Worksheet ' Representa a planilha do Excel onde os dados raspados serão armazenados.
Dim i As Integer ' Variável de controle para o loop principal que itera através das páginas da web.
Dim uLin As Long ' Representa a última linha usada na planilha do Excel. Usado para determinar onde inserir novos dados.
Dim URL As String ' String que armazena a URL da página da web que está sendo raspada.
Dim nPag As Integer ' Representa o número total de páginas que serão raspadas.
Dim j As Integer ' Variável de controle para o loop interno que itera através dos elementos extraídos em uma única página da web.
' Define a planilha de destino onde os dados raspados serão armazenados.
Set Pl = ThisWorkbook.Sheets("Planilha1")
' Define o número total de páginas que serão raspadas.
nPag = 5
On Error Resume Next
For i = 1 To nPag
URL = "https://www.telelistas.net/pa/belem/pet+shops?pag=" & i
' Estabelece uma conexão com a página da web e recupera seu conteúdo.
http.Open "GET", URL, False
http.setRequestHeader "User-Agent", "Mozilla/5.0"
http.send
' Carrega o conteúdo da página no objeto HTML para posterior extração.
html.body.innerHTML = http.responseText
' Identifica e extrai os elementos desejados da página da web.
Set pet = html.getElementsByClassName("card-title loga-class go-info")
Set endereco = html.getElementsByClassName("card-text text-muted")
Set tel = html.getElementsByClassName("botao loga-class ver-tel")
' Itera através dos elementos extraídos e os armazena na planilha.
For j = 0 To pet.Length - 1
uLin = Pl.Cells(Pl.Rows.Count, "A").End(xlUp).Row
Pl.Cells(uLin + 1, 1).Value = pet.Item(j).innerText
Pl.Cells(uLin + 1, 2).Value = endereco.Item(j).innerText
Pl.Cells(uLin + 1, 3).Value = tel.Item(j).getAttribute("data-telefone")
Next j
Next i
' Limpa e libera os objetos utilizados.
Set http = Nothing
Set html = Nothing
Set Pl = Nothing
Set pet = Nothing
Set endereco = Nothing
Set tel = Nothing
End Sub