Estendendo a série de artigos VBA + Web, lembrando que liberei tem pouco tempo um tutoria de Selenium VBA para o quase-mesmo propósito, este tutorial trata de como extrair informações da páginas web e principalmente serviços web, ou web services, como são mais conhecidos.
Para promover a façanha, faremos uso da biblioteca WinHTTP. Em resumo, é ela quem fornece funções para que através de nossos aplicativos no Windows, possamos acessar conteúdo através do protocolo HTTP. Isso significa tudo, ou seja, GET, POST, PUT, DELETE e tudo mais que o protocolo oferecer. Como o mais comum é o GET, vamos começar por ele.
Se você não está familiarizado com estas opções que são chamadas de “verbos”, toda vez que você trafega alpo pela internet, um deste verbos é utilizado. O GET, que na tradução literal do inglês significa “obter”, é exatamente o que acontece quando você digita um endereço de uma página na internet no seu navegador, não importa o qual e clica em Enter.
Vamos fazer isso acontencendo via código:
Sub http()
Dim MyRequest As Object
'coloca a instância do WinHTTP na memória
Set MyRequest = CreateObject("WinHttp.WinHttpRequest.5.1")
MyRequest.Open "GET", "http://www.tomasvasquez.com.br"
'Faz a requisição
MyRequest.Send
'obtém o conteúdo da resposta e coloca na janela de verificação imediata
Debug.Print MyRequest.ResponseText
End Sub |
Sub http()
Dim MyRequest As Object
'coloca a instância do WinHTTP na memória
Set MyRequest = CreateObject("WinHttp.WinHttpRequest.5.1")
MyRequest.Open "GET", "http://www.tomasvasquez.com.br"
'Faz a requisição
MyRequest.Send
'obtém o conteúdo da resposta e coloca na janela de verificação imediata
Debug.Print MyRequest.ResponseText
End Sub
O que vai acontecer aqui é a obtenção (verbo GET) de todo o conteúdo que o endereço informado, no caso, o www.tomasvaquez.com.br. Como estamos fazendo uma requisição ao documento padrão, que no caso é um HTML, é isto que veremos na janela do VBA, como mostrado abaixo:

Como mostrado acima, o resultado é um longo texto que representa o código HTML da página. Você verá a mesma coisa caso acesse o mesmo endereço no seu navegador e mandar exibir o código fonte.
Com isso, podemos começar a imaginar o que é possível fazer a partir desta biblioteca. Apesar de ser possível simular uma navegação em determinados sites, este não é o uso mais indicado para esta biblioteca. O mais adequado é fazer seu uso quando for preciso integrar com serviços REST, o que está mais do que na moda atualmente.
Para deixar o exemplo mais completo, vou usar o RSS do fórum e a partir dele, extrair quais foram as últimas postagens:
Sub UltimasDoForum()
Dim MyRequest As Object, _
resposta As String, _
respostaParcial As String, _
retorno As Long, _
stringTitulo As String, _
fimTitulo As Long
'coloca a instância do WinHTTP na memória
Set MyRequest = CreateObject("WinHttp.WinHttpRequest.5.1")
MyRequest.Open "GET", "http://www.tomasvasquez.com.br/forum/feed.php"
'Faz a requisição
MyRequest.Send
'obtém o conteúdo da resposta
resposta = MyRequest.ResponseText
stringTitulo = ""
'procura pelo título do post, se houver
retorno = InStr(1, resposta, stringTitulo, vbTextCompare)
'itera até o próximo e até não encontrar mais
While retorno > 0
fimTitulo = InStr(retorno, resposta, "", vbTextCompare)
respostaParcial = Left(resposta, fimTitulo)
Debug.Print Right(respostaParcial, Len(respostaParcial) - retorno - Len(stringTitulo))
resposta = Right(resposta, Len(resposta) - fimTitulo)
retorno = InStr(retorno, resposta, stringTitulo, vbTextCompare)
Wend
End Sub |
Sub UltimasDoForum()
Dim MyRequest As Object, _
resposta As String, _
respostaParcial As String, _
retorno As Long, _
stringTitulo As String, _
fimTitulo As Long
'coloca a instância do WinHTTP na memória
Set MyRequest = CreateObject("WinHttp.WinHttpRequest.5.1")
MyRequest.Open "GET", "http://www.tomasvasquez.com.br/forum/feed.php"
'Faz a requisição
MyRequest.Send
'obtém o conteúdo da resposta
resposta = MyRequest.ResponseText
stringTitulo = ""
'procura pelo título do post, se houver
retorno = InStr(1, resposta, stringTitulo, vbTextCompare)
'itera até o próximo e até não encontrar mais
While retorno > 0
fimTitulo = InStr(retorno, resposta, "", vbTextCompare)
respostaParcial = Left(resposta, fimTitulo)
Debug.Print Right(respostaParcial, Len(respostaParcial) - retorno - Len(stringTitulo))
resposta = Right(resposta, Len(resposta) - fimTitulo)
retorno = InStr(retorno, resposta, stringTitulo, vbTextCompare)
Wend
End Sub
Não é preciso dar atenção ao código que extrai o texto pois é apenas um tratamento de strings para limpar o código XML. O resultado pode ser visto na figura abaixo:

Ainda haveria que limpar um pouco as strings, mas já é possível ter uma ideia do que é possível começar a fazer com essa biblioteca.
Agora, é com vocês. Bom proveito!
Download do arquivo:
WinHTTP.zip (13.18 KiB)
Referências:
WinHTTP: https://msdn.microsoft.com/pt-br/library/windows/desktop/aa382925%28v=vs.85%29.aspx