Web Scraping com VBA: Como Capturar Dados de Sites no Excel

Para capturar dados de um site direto no Excel via VBA, use o objeto MSXML2.XMLHTTP para fazer uma requisição HTTP direta à página (sem abrir navegador), pegue o HTML retornado em .responseText, e extraia as informações desejadas com funções de texto como InStr e Mid — a antiga automação via InternetExplorer está obsoleta, já que o Internet Explorer foi descontinuado e não é mais confiável nas versões atuais do Windows.

Você já quis trazer para dentro de uma planilha uma informação que só existe publicada numa página da web, sem precisar copiar e colar manualmente toda vez que o valor muda?

Sem uma forma automatizada de capturar esse dado, a alternativa vira visitar o site manualmente e atualizar a planilha à mão, um processo repetitivo e sujeito a esquecimento, especialmente quando a informação muda com frequência.

Neste artigo iremos mostrar as duas abordagens históricas de web scraping em VBA, por que uma delas está obsoleta, e como usar o XMLHTTP para capturar e extrair dados de uma página de forma direta e mais confiável.

DOMINE EXCEL COMIGO

QUERO APRENDER EXCEL

Duas abordagens históricas de web scraping em VBA

Historicamente, existiam duas formas de capturar dados da web em VBA. A primeira, mais antiga, controlava o próprio Internet Explorer via automação COM (CreateObject(“InternetExplorer.Application”)), abrindo uma janela de navegador de verdade e lendo o conteúdo carregado nela. A segunda faz uma requisição HTTP direta ao servidor, sem abrir navegador nenhum, usando o objeto MSXML2.XMLHTTP.

Por que evitar a automação via Internet Explorer

O Internet Explorer foi descontinuado pela Microsoft, e o objeto de automação COM associado a ele está cada vez menos confiável nas versões atuais do Windows, podendo simplesmente falhar ou não estar mais disponível. Por esse motivo, esse método não deve mais ser usado como abordagem principal para scraping em código novo — a alternativa recomendada hoje é a requisição direta via XMLHTTP.

A abordagem recomendada: MSXML2.XMLHTTP

O XMLHTTP faz uma requisição HTTP (o mesmo tipo de pedido que um navegador faz) diretamente ao servidor do site, e devolve o HTML da página como texto puro, sem renderizar nada visualmente — isso torna a captura muito mais rápida do que abrir um navegador inteiro, mas só funciona bem em páginas cujo conteúdo já vem pronto no HTML devolvido pelo servidor (sites que montam o conteúdo depois, via JavaScript, não aparecem completos nesse texto).

Referência necessária

É possível usar o XMLHTTP com ou sem referência de biblioteca. Com early binding, adicione a referência Microsoft XML, v6.0 em Ferramentas > Referências, e declare Dim http As MSXML2.XMLHTTP60. Sem referência (late binding), basta usar CreateObject(“MSXML2.XMLHTTP60”), mais portátil entre computadores diferentes.

Fazendo a requisição e capturando o HTML

Sub CapturarPaginaWeb()
    Dim http As Object
    Dim html As String
    Set http = CreateObject(“MSXML2.XMLHTTP60”)

    http.Open “GET”, “https://www.exemplo.com.br/pagina”, False
    http.send
    html = http.responseText
End Sub

O terceiro argumento do Open, definido como False, faz a requisição de forma síncrona — ou seja, o código espera a resposta chegar antes de continuar, o que simplifica bastante o controle do fluxo em macros simples.

Extraindo dados do HTML retornado

Com o HTML inteiro dentro da variável html, use InStr para localizar uma tag ou um trecho de referência conhecido, e Mid para extrair o valor que vem logo depois dela. Por exemplo, se o valor procurado sempre aparece entre as marcações <span class=”valor”> e </span> no HTML da página:

Dim posInicio As Long, posFim As Long
Dim marcador As String
marcador = “<span class=” & Chr(34) & “valor” & Chr(34) & “>”

posInicio = InStr(html, marcador) + Len(marcador)
posFim = InStr(posInicio, html, “</span>”)

Dim valorCapturado As String
valorCapturado = Mid(html, posInicio, posFim – posInicio)
Range(“A1”).Value = valorCapturado

O Chr(34) é usado para representar as aspas duplas dentro do próprio texto de busca, já que aspas duplas literais fechariam a string do VBA antes da hora.

Limitações do XMLHTTP

Como o XMLHTTP recebe só o HTML bruto entregue pelo servidor, sites que carregam os dados depois, dinamicamente, via JavaScript, não trazem essa informação no responseText — nesses casos, a saída é usar uma ferramenta que realmente renderize a página como um navegador faria, como o Selenium Basic (uma biblioteca de automação de navegador para VBA), que abre um Chrome, Edge ou Firefox de verdade e espera o conteúdo carregar antes de ler.

Cuidados éticos e técnicos

Antes de automatizar a captura de um site, verifique os termos de uso da página e o arquivo robots.txt do domínio, que costuma indicar quais partes do site não devem ser acessadas por automação. Evite também rodar a captura em loop muito rápido e repetido, já que isso pode sobrecarregar o servidor do site ou fazer seu IP ser bloqueado.

Disponibilidade

O objeto MSXML2.XMLHTTP está disponível em todas as versões recentes do Excel para Windows, já que a biblioteca Microsoft XML vem instalada junto com o próprio Windows. Esse tipo de automação não está disponível no Excel para Mac, no Excel Online nem no Google Sheets, que exigem abordagens completamente diferentes (como o Apps Script com o serviço UrlFetchApp, no caso do Google Sheets).

Perguntas frequentes

Ainda dá para usar o objeto InternetExplorer para capturar dados de sites?

Tecnicamente o objeto ainda existe, mas está obsoleto: o Internet Explorer foi descontinuado pela Microsoft, e essa automação tende a falhar ou já não funcionar de forma confiável nas versões atuais do Windows. A abordagem recomendada hoje é o XMLHTTP.

Web scraping com VBA funciona para qualquer site?

Não. Funciona bem para sites que entregam o HTML já pronto no servidor. Sites que montam o conteúdo depois, via JavaScript, no navegador, não aparecem completos no responseText do XMLHTTP — nesses casos, é preciso uma ferramenta que renderize a página, como o Selenium Basic.

Preciso instalar alguma coisa para usar o XMLHTTP?

Não. A biblioteca Microsoft XML já vem instalada no Windows por padrão; basta referenciá-la em Ferramentas > Referências, ou usar CreateObject sem marcar nenhuma referência.

Veja também: Power Query no Excel para Web: Como Transformar Dados Diretamente no Navegador, uma alternativa sem código, baseada em Power Query, para importar dados estruturados de páginas da web sem escrever nenhuma macro VBA.

Compartilhe ou Comente

Se você curtiu esse artigo aonde mostramos as duas abordagens de web scraping em VBA — a automação via Internet Explorer, hoje obsoleta, e a requisição direta com XMLHTTP — com um exemplo prático de captura e extração de dados de uma página, compartilhe com as suas redes sociais e não se esqueça de deixar um comentário aqui embaixo caso você tenha ficado com alguma dúvida.

Você já precisou trazer dados de algum site para dentro de uma planilha do Excel? Prefere uma solução via VBA ou uma alternativa sem código, como o Power Query? Conta para nós nos comentários!

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *