sábado, febrero 19, 2011

VB.Net - Obtener codigo Html


"Si usa algún código del siguiente tutorial, den el icono de ME GUSTA del Facebook que se encuentra en su mano derecha, para que se vuelva Seguidor del Blog y también comentenos que tal les pareció el tutorial"


En el siguiente tutorial le mostrare como obtener el código HTML de una pagina web para poder usarlo como data para un sistema web. Ademas utilizaremos un método para buscar sentencias de texto dentro de todo el código html que obtenemos. Para eso lo aplicaremos en un caso practico de como obtener los cursos que se dictan por cada carrera en la UPAO.


1. Obtener codigo HTML


El siguiente metodo sirve para obtener el codigo HTML de una pagina web, solo necesita la URL de la pagina

Public Function GetHTML(ByVal strUrl As String) As String
  Dim WR As System.Net.WebRequest
  Dim Rsp As System.Net.WebResponse
  Try
    WR = System.Net.WebRequest.Create(strUrl)
    Rsp = WR.GetResponse()
    Return New StreamReader(Rsp.GetResponseStream()).ReadToEnd()
  Catch ex As System.Net.WebException
    Throw ex
  End Try
End Function

2. Servidores UPAO


Si se dan cuenta para obtener los servidores de la UPAO, solo es necesario cambiar un parámetro de la dirección URL de la pagina web. Fíjense en la imagen que si escojo Servidor 01 la URL tiene el valor de ss01 y si elijo Servidor 02 la URL seria ss02 A continuación les mostrare el método










Crear un combo con las URL de los servidores. Como hay 4 servidores tengo que hacer un for desde 1 hasta el 4

Public Function servidoresUpao() As DataTable
Dim dtServidor As New DataTable("Servidor")
  dtServidor.Columns.Add("URL", System.Type.GetType("System.String"))
  dtServidor.Columns.Add("Servidor", System.Type.GetType("System.String"))
  Dim rowNingun As DataRow = dtServidor.NewRow
  rowNingun(0) = "NINGUNA"
  rowNingun(1) = "NINGUNA"
  dtServidor.Rows.Add(rowNingun)
  For i As Integer = 1 To 4
    Dim url As String = "http://ss0" & i & ".upao.edu.pe:808" & i & "/pls/proddad/zschedule.p_horarios_clase"
    Dim row As DataRow = dtServidor.NewRow
    row(0) = url
    row(1) = "SERVIDOR 0" & i
    dtServidor.Rows.Add(row)
  Next
  Return dtServidor
End Function

3. Obteniendo las carreras


En el paso anterior guardábamos la URL para ir a la siguiente pagina de la UPAO donde nos muestra las carreras disponibles. Que seria la siguiente pagina

















Y si revisamos el codigo fuente veremos que en cada nombre de las carreras están dentro de un estilo que se llama lk_curso y si buscamos cada lk_curso dentro de nuestro codigo html podremos obtener todas las carreras y ademas guardaremos la URL a la cual direcciona para ir a la pagina de obtener los cursos de la carrera seleccionada.

















Public Function carrerasUpao(ByVal direccionWeb As String) As DataTable
  Dim tabla As New DataTable("Carreras")
  tabla.Columns.Add("URL", System.Type.GetType("System.String"))
  tabla.Columns.Add("Carrera", System.Type.GetType("System.String"))
  Dim codigoHtml As String = GetHTML(direccionWeb)
  'Metodo utilizado para buscar un linea de codigo dentro un fragmento de texto
  Dim buscarInicioCarrera As Integer = InStr(codigoHtml, "lk_curso", CompareMethod.Binary)
  Dim carrera As String = ""
  Dim url As String = ""
  'Sirve para obtener la url de la pagina web
  Dim ubicacionHref As Integer
  While buscarInicioCarrera <> 0
    'Chancamos el codigo html hasta la ubicacion de la sentencia
    codigoHtml = codigoHtml.Substring(buscarInicioCarrera)
    'Buscamos la letra h ... porque hace referencia a href 
ubicacionHref = InStr(codigoHtml, "h", CompareMethod.Binary) ubicacionHref = ubicacionHref + 5 'La url de la pagina web que tienen los curos url = codigoHtml.Substring(ubicacionHref, 29) Dim inicioNombreCarrera As Integer = InStr(codigoHtml, ">", CompareMethod.Binary) Dim finNombreCarrera As Integer = InStr(codigoHtml, "<", CompareMethod.Binary) 'El nombre de las carrera carrera = codigoHtml.Substring(inicioNombreCarrera, (finNombreCarrera - inicioNombreCarrera) - 1) buscarInicioCarrera = InStr(codigoHtml, "lk_curso") Dim row As DataRow = tabla.NewRow row(0) = url row(1) = carrera tabla.Rows.Add(row) End While Return tabla End Function

4. Obteniendo los cursos

Cuando estamos en la pagina de obtener los cursos de la carrera que hemos seleccionado. También vemos que en su código HTML existe un patrón de código que en cada lk_cursos se guarda el código del curso y en el siguiente td que encontremos se mostrara el nombre del curso



El código de como obtener los cursos

Public Function cursosUpao(ByVal urlNueva As String) As DataTable

  Dim cursos As New DataTable("Cursos")
  cursos.Columns.Add("CodigoCarrera", System.Type.GetType("System.String"))
  cursos.Columns.Add("CodigoCurso", System.Type.GetType("System.String"))
  cursos.Columns.Add("NombreCurso", System.Type.GetType("System.String"))
  cursos.Columns.Add("URL", System.Type.GetType("System.String"))
  Dim codigoCarrera As String
  codigoCarrera = urlNueva.Substring(InStr(urlNueva, "V_MAJOR=", CompareMethod.Binary) + 7, 4)
  Dim codigoHtml As String = New Logic.Utilitarios().GetHTML(urlNueva)
  Dim buscarInicioCurso As Integer = InStr(codigoHtml, "lk_curso")
  Dim codigoIcsi As String = ""
  While buscarInicioCurso <> 0
    codigoHtml = codigoHtml.Substring(buscarInicioCurso)
    Dim ubicacionHref As Integer = InStr(codigoHtml, "h", CompareMethod.Binary)
    Dim ubicacionFinalHref As Integer = InStr(codigoHtml, "MAJOR=" & codigoCarrera, CompareMethod.Binary)
    ubicacionHref = ubicacionHref - 4

    'La url nueva del curso
    Dim url As String = codigoHtml.Substring(ubicacionHref, (ubicacionFinalHref - ubicacionHref) + 9)


    'El codigo ICSI del curso
    Dim inicioCodigoICSI As Integer = InStr(codigoHtml, ">", CompareMethod.Binary)
    Dim finCodigoICSI As Integer = InStr(codigoHtml, "<", CompareMethod.Binary)
    codigoIcsi = codigoHtml.Substring(inicioCodigoICSI, (finCodigoICSI - inicioCodigoICSI) - 1)


    'El nombre del curso
    Dim inicioCurso As Integer = InStr(codigoHtml, "<td>", CompareMethod.Binary)
    codigoHtml = codigoHtml.Substring(inicioCurso)
    Dim finCurso As Integer = InStr(codigoHtml, "</td>", CompareMethod.Binary)
    Dim nombreCurso As String = codigoHtml.Substring(3, finCurso - 4)

    'Buscar el siguiente curso
    buscarInicioCurso = InStr(codigoHtml, "lk_curso")


    Dim row As DataRow = cursos.NewRow
    row("CodigoCarrera") = codigoCarrera
    row("CodigoCurso") = codigoIcsi
    row("NombreCurso") = nombreCurso
    row("URL") = url
    cursos.Rows.Add(row)
  End While
  Return cursos
End Function

5. Ejemplo de la Aplicación




6. Explicación del Ejemplo :)


El ejemplo que lo mostré fue desarrollado para Visual Basic.Net y para una pagina web en ASP.Net, debido a que en mi época de estudiantes a mi me pidieron una aplicación para hacer horarios para la UPAO y solo lo hice de manera interna con Oracle Forms y acceso a la BD, pero luego un profesor me pidió que lo pase a web y lo pase a ASP.Net y pero ya no me dieron acceso a la BD y tuve que ingeniarme y por eso use el código HTML de la pagina.

Pero si desean ver una aplicación de como obtener los horarios de forma completa y hecho en Java. Lo pueden encontrar en la pagina de un alumno de la UPAO que se llama Diego Cueva ... Ahí pueden encontrar su aplicación que se llama APHU, que sirve para generar los horarios de la UPAO. Y lo he probado y funciona de la perfección.

5 comentarios:

Vaya Henry está genial el post, no tenía idea que también habías tenido que hacer algo tan similar sobre los horarios cuando estudiabas. Por cierto gracias por la mención al final.
Saludos

Hola te hago una consulta

En el punto 1
1. OBTENER CODIGO HTML

Donde pongo de que URL extrae?

tu le mandas el valor de la URL en la variable strUrl que es del tipo String

Buen aporte Henry, lo acabo de chekear y es justo lo q andaba viendo para una funcionalidad que se está haciendo para el proyecto de campus virtual UPAO.

Saludos
Jose Utia

PD: Adicionar que falto mencionar los imports para que no de error el code XD