Você já precisou obter informações de uma site da web ?

Se você é um programador Visual Basic (ou C#) provavelmente se deparou ou vai deparar com essa tarefa, afinal hoje praticamente quase todas as informações são acessadas através de uma página web.

Este artigo procura apresentar alternativas viáveis de como você pode realizar esta tarefa usando a linguagem VB .NET

Para acompanhar os exemplos deste artigo você vai precisar usar o Visual Basic 2010 Express Edition.

Um pouco de teoria

A plataforma .NET fornece duas classes presentes no namespace System.NET que podemos usar para podermos interagir diretamente com servidores usando HTTP. São elas:

WebRequest - Realiza uma requisição para uma URI - Uniform Resource Identifier . É uma classe abstrata.
WebResponse - Fornece uma resposta a partir de uma URI - Uniform Resource Identifier . É uma classe abstrata.
Para podermos usar os recursos da classe WebRequest podemos usar as classes HttpWebRequest e HttpWebResponse que fornecem implementações específicas destas classes.

Dessa forma a classe HttpWebRequest fornece suporte para as propriedades e métodos definidos na classe WebRequest e para propriedades e métodos adicionais que permitem interagir usando o protocolo HTTP.

- O método Create() de uma instância da classe WebRequest para iniciar os objetos HttpWebRequest;
- O método GetResponse() realiza uma requisição síncrona através da propriedade RequestUri, retornando um objeto HttpWebResponse contendo a resposta de uma requisição;
- O método GetRequestStream() obtém um objeto stream usado para escrever os dados da requisição;

Usando estas duas classes, temos tudo que precisamos para fazer o download de uma página Web completa em um stream ou postar dados para uma URL.

Criando o projeto

Abra o Visual Basic 2010 Express Edition e crie um novo projeto (File-> New Project) do tipo Windows Forms Application com o nome ExtraindoDadosWeb;

[Tens de ter uma conta e sessão iniciada para poderes visualizar esta imagem]

A seguir vamos incluir uma classe no projeto via menu Project -> Add Class com o nome Web.vb e definir o seguinte código nesta classe:

1- Namespaces

Imports System.Net
Imports System.Text.RegularExpressions
Imports System.IO
Imports System.Data

2- Método RequestDadosWeb que retorna uma string contendo o código de uma URL definida:

Código:

Public Function RequestDadosWeb(ByVal pstrURL As String) As String
        Dim oWebRequest As WebRequest
        Dim oWebResponse As WebResponse = Nothing
        Dim strBuffer As String = ""
        Dim objSR As StreamReader = Nothing
        'conecta com o website
        Try
            oWebRequest = HttpWebRequest.Create(pstrURL)
            oWebResponse = oWebRequest.GetResponse()
            'Le a resposta do web site e armazena em uma stream
            objSR = New StreamReader(oWebResponse.GetResponseStream)
            strBuffer = objSR.ReadToEnd
        Catch ex As Exception
            Throw ex
        Finally
            objSR.Close()
            oWebResponse.Close()
        End Try
        Return strBuffer
    End Function



A seguir vamos mostrar como usar este método para obter informações de uma página Web.

Inclua no formulário form1.vb, a partir da ToolBox, os controles TextBox(txtDados Multiline=True), Button (btnObterPagina), TextBox(txtUrl).

No evento Click do botão Obter Links inclua o código a seguir:

Código:


 Private Sub btnLinks_Click(sender As System.Object, e As System.EventArgs) Handles btnLinks.Click
        Dim wc As New Web
        dgvDados.DataSource = wc.ExtrairLinks(txtLinks.Text.Trim)
    End Sub

Executando o projeto e fornecendo a URL, após clicar no botão Obter Links e veja o resultado obtido.

Que tal obter imagens de páginas web ?

Vamos fazer isso primeiro alterando o leiaute do formulário form1.vb, incluindo dois controles Button(btnImage1 e btnImage2) e dois controles PictureBox.

___________________________________
amos agora incluir na classe Web.vb o método RequestImagemWeb que retorna uma imagem obtida do website conforme a seguir:

Código:

Public Function RequestImagemWeb(ByVal pstrURL As String, ByVal imagem As String) As String
        Dim oWebRequest As WebRequest
        Dim oWebResponse As WebResponse

        'conecta com o website
        oWebRequest = HttpWebRequest.Create(pstrURL)
        oWebResponse = oWebRequest.GetResponse()

        'Le a resposta do website e armazena em uma stream
        Dim objStream As Stream
        objStream = oWebResponse.GetResponseStream
        Dim inBuf(100000) As Byte
        Dim bytesToRead As Integer = CInt(inBuf.Length)
        Dim bytesRead As Integer = 0
        While bytesToRead > 0
            Dim n As Integer = objStream.Read(inBuf, bytesRead, bytesToRead)
            If n = 0 Then
                Exit While
            End If
            bytesRead += n
            bytesToRead -= n
        End While
        Dim fstr As New FileStream(imagem, FileMode.OpenOrCreate, FileAccess.Write)
        fstr.Write(inBuf, 0, bytesRead)
        objStream.Close()
        fstr.Close()

        oWebResponse.Close()
        'retorna a imagem
        Return imagem
    End Function


No evento Click de cada um dos botões - Obter Imagem - inclua o código abaixo:

Código:


Private Sub btnImagem1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnImagem1.Click
        Dim strArquivo As String
        Dim wc As New Web
        strArquivo = wc.RequestImagemWeb("http://www.exemplo.com/images/maco1b.gif", "maco1b.gif")
        PictureBox1.Image = Image.FromFile(strArquivo)
    End Sub

    Private Sub btnImagem2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnImagem2.Click
        Dim strArquivo As String
        Dim wc As New Web
        strArquivo = wc.RequestImagemWeb("http://www.exemplo.com/images/dvdnet2.gif", "dvdnet2.gif")
        PictureBox2.Image = Image.FromFile(strArquivo)
    End Sub

O código acima recebe a imagem do website e a exibe em um controle PictureBox.

Executando o projeto e clicando em cada um dos botões de comando teremos:

[Tens de ter uma conta e sessão iniciada para poderes visualizar esta imagem]

Creditos:
macoratti - Pelo Tutorial
Fox - Por corrigir alguns bugs.