Web Scraping com Excel VBA: Extraindo Dados de Sites com Varias Paginas

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. 

O que é Web Scraping?

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.

Vantagens e Desvantagens de usar o VBA para Webscraping

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.

Vantagens

  • Integração Nativa com Excel: Visto que o VBA é a linguagem de programação integrada do Excel, não há necessidade de ferramentas ou softwares adicionais. Isso permite uma transição suave dos dados coletados para análises, gráficos e relatórios no Excel.
  • Independente de Navegador: Ao contrário de algumas ferramentas de web scraping que dependem de extensões de navegador ou automação de navegador, o VBA extrai dados diretamente, sem a necessidade de abrir ou interagir com um navegador web.
  • Não Requer Tabelas HTML: Enquanto algumas ferramentas, como o Power Query, são limitadas à extração de dados de tabelas HTML, o VBA permite acessar e extrair qualquer elemento de uma página da web, independentemente de sua estrutura.
  • Sem Downloads Adicionais: Não há necessidade de baixar ou instalar softwares ou bibliotecas adicionais. O VBA já está integrado ao Excel, tornando-o pronto para uso.

Desvantagens

  • Conhecimento Técnico: Para aqueles que não estão familiarizados com programação ou VBA, pode haver uma curva de aprendizado íngreme para começar.
  • Falta de Suporte para JavaScript: O VBA não pode interagir diretamente com páginas que carregam conteúdo dinamicamente usando JavaScript. Sites que dependem fortemente de AJAX ou frameworks modernos podem apresentar desafios.
  • Limitações de Plataforma: O VBA é específico para o Microsoft Office, o que significa que não é uma solução multiplataforma. Usuários de Mac ou Linux não terão a mesma experiência ou funcionalidade.

Tutorial

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.

Pré-requisitos

  • 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.

Etapas para Web Scraping com VBA no Excel

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.

Etapa 1: Identificar a Fonte de Dados

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. 

Etapa 2: Preparação da Planilha

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.

 

Etapa 3: Acesso ao VBE e Preparação

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.

Etapa 4: Adicionar Referências Necessárias

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.

  1. Microsoft HTML Object Library: Esta biblioteca permite manipular e acessar elementos HTML usando VBA. Para adicioná-la:

    • No VBE, vá para Ferramentas > Referências.
    • Na lista, procure por Microsoft HTML Object Library e marque a caixa ao lado dela.
  2. Microsoft XML, v6.0: Esta é a biblioteca que permite ao VBA fazer solicitações HTTP para acessar páginas da web. Para adicioná-la:

    • Ainda na janela 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.

Etapa 5: Escrever o Código de Web Scraping

5.1 Criação do Procedimento

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
				
			

5.2. Definindo Variáveis

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.

				
			

5.3. Definindo a Planilha de Destino

É 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")

				
			

CURSO

Programando o Excel com VBA (do Básico ao Profissional)

CURSO

Controle de Acesso e Permissões de Usuários aplicados à Ribbon do Excel

5.4. Definindo o Número de Páginas a Serem Raspadas

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


				
			

5.5. Iterando pelas Páginas Alvo

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

				
			

5.6. Estabelecendo Conexão e Recuperando Dados da Página

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

				
			

5.7. Extração e Armazenamento dos Dados na Planilha

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

				
			

5.8. Limpeza e Liberação de Recursos

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

				
			

5.9. Tratamento de Erros

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

				
			

Etapa 6: Unindo todas as Etapas

				
					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