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