Pop

Curso HTML5. Novedades - 2.Nuevas etiquetas

2. Curso HTML5. Novedades. Nuevas etiquetas

  • Vamos a continuar con nuestro curso de html . Después de ver en la entrada anterior una introducción al mundo html. En este capítulo vamos a conocer algunas de las nuevas etiquetas que se introdujeron con la llega de html5.
  • Las etiquetas con las que vamos a trabajar en esta entrada son: <header>,<footer>, <nav>,<section>,<aside>.  Vamos con una breve descripción de cada una de ellas:
  1. <Header>: <head> Tradicionalmente es la cabecera de un documento. <header> aparece para ser considerada como la cabecera de cualquier otra cosa.
  2. <Footer>: Aparece para ser considerada como el pie de cualquier cosa.
  3. <Section>: contiene la información más relevante del documento.
  4. <nav>: Representa un bloque de navegación. 
  5. <aside>: Es una sección que está relacionada con la principal que que ocupa una posición lateral
  • Aquí os dejo un vídeo con ejemplos de uso de estas etiquetas:


  • Os dejo también los elementos creados en nuestra hoja de estilos:
ul {
list-style-type: none;
margin: 0;
padding: 0;
overflow: hidden;
background-color: #333333;
}

li {
float: left;
}

li a {
display: block;
color: white;
text-align: center;
padding: 16px;
text-decoration: none;
}

li a:hover {
background-color: #111111;
}

.pagina {
display: table;
width: 100%
}

.contenedor {
float: left;
width: 60%
}

aside {
float: right;
width: 40%
}

  • y nuestra página html donde estamos haciendo las pruebas:

   <header>
<h1>  Mi primera página html</h1> 
</header>
<nav>
<ul>
<li><a href="#">Uno 1</a></li>
<li><a href="#">Dos 2</a></li>
<li><a href="#">Tres 3</a></li>
</ul>
</nav>
<div class="pagina">
<section class="contenedor">
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXxxx<br />
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXxxx<br />
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXxxx<br />
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXxxx<br />
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXxxx<br />
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXxxx<br />
</section>
<aside>
<p>YYYYYYYYYYYYYYYYYYYYYYYYYYYYYy</p>
</aside>

</div>
<footer>
<ul>
<li><a href="#">Derecho de uso</a></li>
<li><a href="#">Copyright</a></li>
</ul>
</footer>

Curso HTML5. Novedades - 1. Introducción

1. Curso HTML5. Novedades. Introducción

  • En esta ocasión vamos a comenzar un nuevo curso. Después de ver en entradas anteriores conceptos relacionados con el lenguaje de programación c# y el manejo de bases de datos con SQL. Ahora  empezaremos a ver las novedades que introdujo html5
  •  Antes de continuar, aclarar que yo considero html un lenguaje de marcado, no un lenguaje de programación. Históricamente los lenguajes de marcado suelen confundirse con lenguajes de programación. Sin embargo, no son lo mismo, ya que el lenguaje de marcado no tiene funciones aritméticas o variables, como poseen los lenguajes de programación
  • Ahora os dejo el vídeo donde cuento que temas trataremos en el curso y donde creamos nuestra primera página html:


  • También como acostumbro os dejo las etiquetas correspondientes a nuestra primera página web:
  <!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Pruebas</title>
<link href="StyleSheet1.css" rel="stylesheet" />
</head>
<body>
<b>Mi primera página html</b>
</body>
</html>

Bot web Scraping en español - ESPN- Parte 8 (Final)

8. Web Scraping de la página ESPN

  •  En este capítulo del curso de programación en c# con visual studio 2017 finalizamos nuestro tutorial sobre web Scraping. El último paso que nos queda es guardar en nuestras tablas las estadísticas de cada temporada de los jugadores que conseguimos de la web ESPN. Nos quedan por rellenar la tabla JUGADORES_HISTORICO  y la tabla ESTADISTICAS , correspondientes a este diagrama:
  • Para rellenar estas tablas hemos creado un procedimiento almacenado al que llamaremos desde nuestra aplicación de consola.En el vídeo os lo cuento con más detalle:

  • El procedimiento almacenado que ejecutamos es el siguiente:
ALTER PROCEDURE [dbo].[GuardarEstadisticasJugadorNBA](
@Jugador varchar(500),
@Equipo varchar(50),
@temporada varchar(50),
@PJugados int,
@Minutos float,
@Puntos float,
@rebotes float,
@tapones float,
@asistencias float,
@robos float,
@totCArrera bit
)
AS
BEGIN

SET NOCOUNT ON;

DECLARE @idJugador int
DECLARE @idEquipo int
DECLARE @idEst int
INSERT INTO dbo.ESTADISTICAS(PJugados,Minutos,Puntos,Rebotes,Tapones,Asistencias,Robos,TotalCarrera)
VALUES (@PJugados,@Minutos,@Puntos,@rebotes,@tapones,@asistencias,@robos,@totCArrera)

SET @idEst =SCOPE_IDENTITY() 

-- Obtenemos el idjugador 
SELECT @idjugador = id FROM  JUGADORES with(nolock) where Jugador=@Jugador
SELECT @idEquipo=Id FROM EQUIPOS with(nolock) where Acronimo=@Equipo


INSERT INTO dbo.JUGADORES_HISTORICO(IdJugador,IdEquipo,Temporada,IdEstadisticas)
     VALUES(@idjugador,@idEquipo,@temporada,@idEst)
END

  • El código que hemos añadido a nuestra aplicación de consola para poder efectuar el guardado de datos en nuestra base de datos es este:
  static void guardarEstadisticasugadoresRetirados()
        {

            SqlConnection conexion = null;


            DirectoryInfo directorio = new DirectoryInfo(@"D:\JugadoresNBA\");
            FileInfo[] archivos = directorio.GetFiles();
            String linea = String.Empty;
            int cont = 0;
            string jugador = String.Empty;
            string temporada = String.Empty;
            string equipo = String.Empty;
            string Pjugados = String.Empty;
            string minutos = String.Empty;
            string puntos = String.Empty;
            string rebotes = String.Empty;
            string tapones = String.Empty;
            string asistencias = String.Empty;
            string robos = String.Empty;
            bool totalCArrera = false;
            Boolean tieneTemporadas = false;
            foreach (FileInfo archivo in archivos)
            {
              
                HtmlDocument doc = new HtmlDocument();
                HtmlNode.ElementsFlags["br"] = HtmlElementFlag.Empty;
                doc.OptionWriteEmptyNodes = true;
                doc.Load(archivo.FullName);

                string selector = "//table[@class='tablehead']//tr";
                HtmlNodeCollection nodoColecion = doc.DocumentNode.SelectNodes(selector);

                //Comprobamos si el fichero contiene lel texto Last 5 Games.Si no contiene esto es un jugador retirado
                if (nodoColecion != null && !doc.Text.Contains("Last 5 Games") && !doc.Text.Contains("OPP") && !doc.Text.Contains("Postseason") )
                {
                    foreach (HtmlNode nodo in nodoColecion)
                    {
                        if (!nodo.InnerText.Contains("STATS") && !nodo.InnerText.Contains("SEASON"))
                        {
                            conexion = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ToString());
                            try
                            {
                             
                                cont++;
                                if (!nodo.InnerText.Contains("Career") && !nodo.InnerHtml.Contains("<th>"))
                                {
                                    Console.WriteLine(cont.ToString());
                                    Console.WriteLine();
                                    jugador = archivo.Name.Substring(0, archivo.Name.Length - 5);
                                    Console.WriteLine(jugador);
                                    temporada = nodo.ChildNodes[0].InnerText;
                                    Console.WriteLine(temporada);
                                    equipo = nodo.ChildNodes[1].InnerText;
                                    Console.WriteLine(equipo);
                                    Pjugados = nodo.ChildNodes[2].InnerText;
                                    Console.WriteLine(Pjugados);
                                    minutos = nodo.ChildNodes[4].InnerText;
                                    Console.WriteLine(minutos);
                                    puntos = nodo.ChildNodes[19].InnerText;
                                    Console.WriteLine(puntos);
                                    rebotes = nodo.ChildNodes[13].InnerText;
                                    Console.WriteLine(rebotes);
                                    tapones = nodo.ChildNodes[15].InnerText;
                                    Console.WriteLine(tapones);
                                    asistencias = nodo.ChildNodes[14].InnerText;
                                    Console.WriteLine(asistencias);
                                    robos = nodo.ChildNodes[16].InnerText;
                                    Console.WriteLine(robos);
                                    Console.WriteLine();
                                    totalCArrera = false;
                                    tieneTemporadas = true;
                                }
                                else if (tieneTemporadas)
                                {
                                    totalCArrera = true;
                                    Console.WriteLine(cont.ToString());
                                    Console.WriteLine();
                                    jugador = archivo.Name.Substring(0, archivo.Name.Length - 5);
                                    Console.WriteLine(jugador);
                                    temporada = nodo.ChildNodes[0].InnerText;
                                    Console.WriteLine(temporada);
                                    equipo = "RESUMEN CARRERA";
                                    Console.WriteLine(equipo);
                                    Pjugados = nodo.ChildNodes[1].InnerText;
                                    Console.WriteLine(Pjugados);
                                    minutos = nodo.ChildNodes[3].InnerText;
                                    Console.WriteLine(minutos);
                                    puntos = nodo.ChildNodes[18].InnerText;
                                    Console.WriteLine(puntos);
                                    rebotes = nodo.ChildNodes[12].InnerText;
                                    Console.WriteLine(rebotes);
                                    tapones = nodo.ChildNodes[14].InnerText;
                                    Console.WriteLine(tapones);
                                    asistencias = nodo.ChildNodes[13].InnerText;
                                    Console.WriteLine(asistencias);
                                    robos = nodo.ChildNodes[15].InnerText;
                                    Console.WriteLine(robos);
                                    Console.WriteLine();
                                    totalCArrera = true;
                                    tieneTemporadas = false;
                                }


                                conexion.Open();

                                SqlCommand Comm = conexion.CreateCommand();
                                Comm.CommandText = "dbo.GuardarEstadisticasJugadorNBA";
                                Comm.CommandType = CommandType.StoredProcedure;
                                Comm.Parameters.Add("@Jugador", SqlDbType.VarChar, 500).Value = jugador;
                                Comm.Parameters.Add("@Equipo", SqlDbType.VarChar, 50).Value = equipo;
                                Comm.Parameters.Add("@temporada", SqlDbType.VarChar, 50).Value = temporada;
                                Comm.Parameters.Add("@Pjugados", SqlDbType.Int).Value = Pjugados;
                                Comm.Parameters.Add("@Minutos", SqlDbType.Float).Value = minutos.Replace('.', ',');
                                Comm.Parameters.Add("@Puntos", SqlDbType.Float).Value = puntos.Replace('.',',');
                                Comm.Parameters.Add("@rebotes", SqlDbType.Float).Value = rebotes.Replace('.', ',');
                                Comm.Parameters.Add("@tapones", SqlDbType.Float).Value = tapones.Replace('.', ',');
                                Comm.Parameters.Add("@asistencias", SqlDbType.Float).Value = asistencias.Replace('.', ',');
                                Comm.Parameters.Add("@robos", SqlDbType.Float).Value = robos.Replace('.', ',');
                                Comm.Parameters.Add("@totCArrera", SqlDbType.Bit).Value = totalCArrera;
                                Comm.ExecuteNonQuery();

                            }


                            catch (Exception ex)
                            {
                                Console.WriteLine(ex.ToString());
                                Console.ReadLine();


                            }
                            finally
                            {
                                conexion.Close();
                                conexion.Dispose();
                            }
                        }


                    }

                }

            }

            Console.WriteLine("Operacion completada");
            Console.ReadLine();
        }

Bot web Scraping - Web ESPN - Parte 7

7. Web Scraping de la página ESPN

  •  En este capítulo del curso de programación en c# con visual studio 2017 guardaremos los datos de los jugadores en nuestra base de datos llamando a un procedimiento almacenado desde nuestra aplicación de consola.Os dejo nuestro diseño de tablas:

  • Para poder guardar los datos necesarios en la tabla jugadores necesitamos obtenerlos de los ficheros que tenemos almacenados en nuestro disco duro.Para ello tenemos que ver de que manera obtener los datos. Os lo cuento en el vídeo:


  • Os dejo los métodos vistos en el vídeo:
        static void guardarDatosJugadores()
        {
            SqlConnection conexion = null;


            DirectoryInfo directorio = new DirectoryInfo(@"D:\JugadoresNBA\");
            FileInfo[] archivos = directorio.GetFiles();
            String linea = String.Empty;
            int cont = 0;
            foreach (FileInfo archivo in archivos)
            {
                Jugador j = new Jugador();
                HtmlDocument doc = new HtmlDocument();
                HtmlNode.ElementsFlags["br"] = HtmlElementFlag.Empty;
                doc.OptionWriteEmptyNodes = true;
                doc.Load(archivo.FullName);

                string selector = "//ul[@class='general-info']";
                HtmlNodeCollection nodoColecion = doc.DocumentNode.SelectNodes(selector);



                if (nodoColecion != null)
                {
                    foreach (HtmlNode nodo in nodoColecion)
                    {
                        conexion = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ToString());
                        try
                        {

                            cont++;
                            Console.WriteLine(cont.ToString());
                            Console.WriteLine();
                            j.Nombre = archivo.Name.Substring(0, archivo.Name.Length - 5);
                            DameDatosFisicos("//ul[@class='general-info']//li", doc, ref j);
                            Console.WriteLine(j.Nombre);
                            Console.WriteLine(j.Posicion);

                            if (j.Posicion.Contains("#"))
                                j.EnActivo = true;
                            else
                                j.EnActivo = false;

                            Console.WriteLine(j.Peso.ToString());
                            Console.WriteLine(j.Altura.ToString());
                            DameDatosExperiencia("//ul[@class='player-metadata floatleft']//li", doc, ref j);
                            Console.WriteLine(j.AnyiosActivo.ToString());


                             conexion.Open();

                             SqlCommand Comm = conexion.CreateCommand();
                             Comm.CommandText = "dbo.GuardarJugadorNBA";
                             Comm.CommandType = CommandType.StoredProcedure;
                             Comm.Parameters.Add("@Jugador", SqlDbType.VarChar, 500).Value = j.Nombre;
                             Comm.Parameters.Add("@Poscion", SqlDbType.VarChar, 50).Value = j.Posicion;
                             Comm.Parameters.Add("@altura", SqlDbType.VarChar, 50).Value = j.Altura;
                             Comm.Parameters.Add("@Peso", SqlDbType.Int).Value =j.Peso;
                             Comm.Parameters.Add("@anyio", SqlDbType.Int).Value = j.AnyiosActivo;
                             Comm.Parameters.Add("@enactivo", SqlDbType.Bit).Value = j.EnActivo;
                              Comm.ExecuteNonQuery();
                        }

                        catch (Exception ex)
                        {
                            Console.WriteLine(ex.ToString());
                            Console.ReadLine();


                        }
                        finally
                        {
                            conexion.Close();
                            conexion.Dispose();
                        }


                    }

                }

            }

            Console.WriteLine("Operacion completada");
            Console.ReadLine();
        }

     static void DameDatosFisicos(string selector, HtmlDocument doc, ref Jugador j)
        {

            HtmlNodeCollection nodoColecion = doc.DocumentNode.SelectNodes(selector);
            if (nodoColecion != null)
            {
                //vienen dos lineas una para la posición y otra para el peso y la ultura
                if (nodoColecion.Count == 2)
                    foreach (HtmlNode nodo in nodoColecion)
                    {
                        if (j.Posicion == String.Empty)
                            j.Posicion = nodo.InnerText;
                        else if (j.Peso == 0)
                        {
                            string[] x = nodo.InnerText.Split(',');
                            if (x.Length > 0)
                            {
                                string altura = x[0].Replace("\"", "").Replace("'", ".").Replace(" ", "");
                                j.Altura = altura;
                                if (x.Length > 1)
                                    j.Peso = Convert.ToInt32(Convert.ToInt32(x[1].Replace("lbs", "").Trim()) * 0.453592);
                            }
                        }
                    }
                else if (nodoColecion.Count == 3)
                {
                    int cont = 0;
                    foreach (HtmlNode nodo in nodoColecion)
                    {
                        cont++;
                        if (j.Posicion == String.Empty)
                            j.Posicion = nodo.InnerText;
                        else if (j.Peso == 0 && cont == 2)
                        {
                            string[] x = nodo.InnerText.Split(',');
                            string altura = x[0].Replace("\"", "").Replace("'", ".").Replace(" ", "");

                            j.Altura = altura;
                            if (x.Length > 1)
                                j.Peso = Convert.ToInt32(Convert.ToInt32(x[1].Replace("lbs", "").Trim()) * 0.453592);
                        }
                    }
                }
            }


        }
        static void DameDatosExperiencia(string selector, HtmlDocument doc, ref Jugador j)
        {
            HtmlNodeCollection nodoColecion = doc.DocumentNode.SelectNodes(selector);
            if (nodoColecion != null)
            {
                int cont = 0;
                foreach (HtmlNode nodo in nodoColecion)
                {

                    cont++;
                    if (cont == 4 && nodo.InnerText.Contains("year"))
                        j.AnyiosActivo = Convert.ToInt32(nodo.InnerText.Replace("Experience", "").Replace("years", "").Replace("year","").Trim()); 
                }
            }

        }

Bot web Scraping - Web ESPN - Parte 6

6. Web Scraping de la página ESPN

  •  En este capítulo del curso de programación en c# con visual studio 2017 guardaremos los equipos en nuestra base de datos llamando a un procedimiento almacenado desde nuestra aplicación de consola.Os dejo nuestro diseño de tablas:

  • Para poder guardar los datos también veremos como leerlos de una manera fácil de los fichero que tenemos almacenados. En el vídeo os lo cuento con más detalle:
  • Os dejo el procedimiento almacenado utilizado en el vídeo para almacenar los equipos:

CREATE PROCEDURE [dbo].[GuardarEquiposNBA](
@Equipo varchar(500),
@Acrononimo varchar(50)
)
AS
BEGIN

SET NOCOUNT ON;


IF(SELECT count(*) FROM  EQUIPOS where Acronimo=@Acrononimo)=0
BEGIN
INSERT INTO dbo.EQUIPOS(Equipo,Acronimo) VALUES(@Equipo,@Acrononimo)
END
END


  • Código utilizado para guardar los equipos en la base de datos:
   static void guardarEquipos()
        {

            SqlConnection conexion = null;
    

            DirectoryInfo directorio = new DirectoryInfo(@"D:\JugadoresNBA\");
            FileInfo[] archivos = directorio.GetFiles();
            String linea = String.Empty;

            foreach (FileInfo archivo in archivos)
            {
                HtmlDocument doc = new HtmlDocument();
                HtmlNode.ElementsFlags["br"] = HtmlElementFlag.Empty;
                doc.OptionWriteEmptyNodes = true;
                doc.Load(archivo.FullName);

                string selector = "//li[@class='team-name']";
                HtmlNodeCollection nodoColecion = doc.DocumentNode.SelectNodes(selector);

                if (nodoColecion != null)
                {
                    foreach (HtmlNode nodo in nodoColecion)
                    {
                        conexion = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ToString());
                        try
                        {
                          
                            conexion.Open();

                            SqlCommand Comm = conexion.CreateCommand();
                            Comm.CommandText = "dbo.GuardarEquiposNBA";
                            Comm.CommandType = CommandType.StoredProcedure;
                            Comm.Parameters.Add("@Equipo", SqlDbType.VarChar, 500).Value = dameEquipo(nodo.InnerText.ToUpper());
                            Comm.Parameters.Add("@Acrononimo", SqlDbType.VarChar, 50).Value = nodo.InnerText;
                            Comm.ExecuteNonQuery();
                           
                        }
                        catch (Exception ex)
                        {
                            Console.WriteLine(ex.ToString());
                            Console.ReadLine();


                        }
                        finally
                        {
                            conexion.Close();
                            conexion.Dispose();
                        }


                    }

                }


            }
            Console.WriteLine("Operacion completada");
            Console.ReadLine();


        }

        static string dameEquipo(string equipo)
        {
            string equipoCompleto = String.Empty;
            switch (equipo)
            {
                case "BOS":
                    equipoCompleto = "Boston Celtics";
                    break;
                case "BKN":
                    equipoCompleto = "Brooklyn Nets";
                    break;
                case "NY":
                    equipoCompleto = "New York Knicks";
                    break;
                case "PHI":
                    equipoCompleto = "Philadelphia 76ers";
                    break;
                case "TOR":
                    equipoCompleto = "Toronto Raptors";
                    break;
                case "CHI":
                    equipoCompleto = "Chicago Bulls";
                    break;
                case "CLE":
                    equipoCompleto = "Cleveland Cavaliers";
                    break;
                case "DET":
                    equipoCompleto = "Detroit Pistons";
                    break;
                case "IND":
                    equipoCompleto = "Indiana Pacers";
                    break;
                case "MIL":
                    equipoCompleto = "Milwaukee Bucks";
                    break;
                case "DEN":
                    equipoCompleto = "Denver Nuggets";
                    break;
                case "MIN":
                    equipoCompleto = "Minnesota Timberwolves";
                    break;
                case "OKC":
                    equipoCompleto = "Oklahoma City Thunder";
                    break;
                case "POR":
                    equipoCompleto = "Portland Trail Blazers";
                    break;
                case "UTAH":
                    equipoCompleto = "Utah Jazz";
                    break;
                case "GS":
                    equipoCompleto = "Golden State Warriors";
                    break;
                case "LAC":
                    equipoCompleto = "LA Clippers";
                    break;
                case "LAL":
                    equipoCompleto = "Los Angeles Lakers";
                    break;
                case "SAC":
                    equipoCompleto = "Sacramento Kings";
                    break;
                case "PHX":
                    equipoCompleto = "Phoenix Suns";
                    break;
                case "ATL":
                    equipoCompleto = "Atlanta Hawks";
                    break;
                case "CHA":
                    equipoCompleto = "Charlotte Hornets";
                    break;
                case "MIA":
                    equipoCompleto = "Miami Heat";
                    break;
                case "ORL":
                    equipoCompleto = "Orlando Magic";
                    break;
                case "WSH":
                    equipoCompleto = "Washington Wizards";
                    break;
                case "DAL":
                    equipoCompleto = "Dallas Mavericks";
                    break;
                case "HOU":
                    equipoCompleto = "Houston Rockets";
                    break;
                case "MEM":
                    equipoCompleto = "Memphis Grizzlies";
                    break;
                case "NO":
                    equipoCompleto = "New Orleans Pelicans";
                    break;
                case "SA":
                    equipoCompleto = "San Antonio Spurs";
                    break;
                case "NJ":
                    equipoCompleto = "New Jersey Nets";
                    break;
                case "VAN":
                    equipoCompleto = "Vancover Grizlies";
                    break;
                case "SEA":
                    equipoCompleto = "Seattle";
                    break;
                default:
                  break;
            }
            return equipoCompleto;
          }

    }

Bot web Scraping - Web ESPN - Parte 5

5. Web Scraping de la página ESPN

  •  En este capítulo del curso de programación en c# con visual studio 2017, empezaremos a preparar el entorno para poder guardar en nuestra base de datos los ficheros que tenemos almacenados en nuestro disco.Obtenidos previamente de la página de la ESPN. 
  • Recordar que en esta base de datos guardaremos algunos de los datos obtenidos para luego consultarlos en una aplicación que nos de las estadísticas que nosotros queramos consultar.De momento en este vídeo os cuento las modificaciones que he hecho  en nuestra aplicación para convertirlo en un aplicación con un menú que nos permita elegir entre varias opciones.Además dejo preparado el programa para ir leyendo los casi 2000 fichero que tenemos almacenados.
  • En el vídeo os lo cuento con más detalle:



  • Os dejo el código visto en el vídeo:

  1. Método con el que presentamos el menú en pantalla al usuario:
 static void Menu()
        {

            char opcion;



            do
            {
                Console.Clear();
                Console.WriteLine("\t************************************************");
                Console.WriteLine("\t  1- Recopilar datos              ");
                Console.WriteLine("\t  2- Guardar equipos                 ");
                Console.WriteLine("\t  0- Salir             ");
                Console.WriteLine("\t************************************************");
                Console.Write("Opcion: ");
                do
                {
                    opcion = Console.ReadKey(true).KeyChar;
                } while (opcion < '0' || opcion > '8');
                Console.WriteLine(opcion + "\n");

                switch (opcion)
                {
                    case '1':
                        try
                        {
                            recopilarDatos();
                        }
                        catch (Exception ex)
                        {
                            Console.WriteLine(ex.ToString());
                        }
                        break;
                    case '2':
                        try
                        {
                            guardarEquipos();
                        }
                        catch (Exception ex)
                        {
                            Console.WriteLine(ex.ToString());
                            Console.ReadLine();
                        }
                        break;



                }


            } while (opcion != '0');
        }

2. Método que recorre los fichero en una ruta determinada:

   static void guardarEquipos()
        {
            DirectoryInfo directorio = new DirectoryInfo(@"D:\JugadoresNBA\");
            FileInfo[] archivos = directorio.GetFiles();
            String linea = String.Empty;

            foreach (FileInfo archivo in archivos)
            {
                StreamReader file = new StreamReader(archivo.FullName);
                while ((linea = file.ReadLine()) != null)
                {
                   //TRATAR LOS DATOS System.Console.WriteLine(linea);

                }

                file.Close();
            }


        }

Bot web Scraping - Web ESPN - Parte 4 🤔

4. Web Scraping de la página ESPN

  •  En este capítulo del curso de programación en c# con visual studio 2017 acabaremos de descargar los datos de los jugadores de la nba con nuestro bot. Además  empezaremos a pensar el diseño de nuestra base de datos para almacenar esta información.
  • En esta base de datos guardaremos algunos de los datos obtenidos para luego consultarlos en una aplicación que nos de las estadísticas que nosotros queramos consultar.En principio la idea que tengo es crear 4 tablas: una para guardar las estadísticas( puntos, rebotes, tapones ... ),otra para guardar los equipos , otra que guarda los datos del jugador (nombre, posición, altura....) y una última tabla que relacione estas tres tablas. Os dejo una imagen de como quedaría el diseño:



  • Os dejo el vídeo donde podemos ver lo que acabo de contar:

Bot web Scraping - Web ESPN - Parte 3 ✔

3. Web Scraping de la página ESPN

  •  En este capítulo del curso de programación en c# con visual studio 2017 continuamos con la técnica conocida como web scraping.  A grandes rasgos podemos decir que se trata de una técnica para extraer información de sitios web, es  un proceso para  recopilar información de forma automática de páginas que encontremos publicadas en la red.
  • En esta entrada volcamos de manera masiva a nuestra máquina los datos de unos 5000 jugadores. Como comentamos en el capítulo anterior buscamos en la página un div con  un  class que se llama 'player-bio': div[@class='player-bio'] , buscamos también la etiqueta h1 para guardar el nombre del jugador y por último buscamos otro div cuya clase sea 'mod-container mod-table mod-player-stats': div[@class='mod-container mod-table mod-player-stats'] . Una vez encontremos estos valores escribimos los n ficheros en disco mediante peticiones a la páginas que contienen la información de cada jugador dentro de un bucle while.
  • Os dejo el vídeo donde podemos ver lo que acabo de contar:

  • Os dejo el código visto en el vídeo:
static void Main(string[] args)
        {

            WebClient client = new WebClient();
            int contador = 1689;
            try
            {
                while (contador < 1000000)
                {
                    HtmlDocument doc = new HtmlDocument();
                    HtmlNode.ElementsFlags["br"] = HtmlElementFlag.Empty;
                    doc.OptionWriteEmptyNodes = true;

                    var web = HttpWebRequest.Create("http://www.espn.com/nba/player/_/id/" + contador.ToString() + "/");
                    Stream stream = web.GetResponse().GetResponseStream();
                    doc.Load(stream);

                    HtmlNode nombreJugador = doc.DocumentNode.SelectSingleNode("//body//h1");
                    StreamWriter sw = new StreamWriter("D:\\JugadoresNBA\\" + nombreJugador.InnerText + ".html", false);

                    string selector = "//div[@class='player-bio']";
                    HtmlNodeCollection nodoColecionInicio = doc.DocumentNode.SelectNodes(selector);
                    if (nodoColecionInicio != null && nodoColecionInicio.Count > 0)
                        foreach (HtmlNode node in nodoColecionInicio)
                        {
                            sw.WriteLine(node.InnerHtml);
                        }

                    selector = "//div[@class='mod-container mod-table mod-player-stats']";
                    HtmlNodeCollection nodoColecion = doc.DocumentNode.SelectNodes(selector);
                    if (nodoColecion != null && nodoColecion.Count > 0)
                        foreach (HtmlNode nodo in nodoColecion)
                        {
                            sw.WriteLine("ESTADISTICAS:");
                            sw.WriteLine(nodo.InnerHtml);
                        }

                    Console.WriteLine(contador.ToString());
                    sw.Close();
                    sw.Dispose();
                    contador++;
                    System.Threading.Thread.Sleep(3000);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
        }

Aprende web Scraping - Web ESPN - Parte 2 👀

2. Web Scraping de la página ESPN

  •  En este capítulo del curso de programación en c# con visual studio 2017 continuamos con la técnica conocida como web scraping.  A grandes rasgos podemos decir que se trata de una técnica para extraer información de sitios web, se trata de un proceso para  recopilar información de forma automática de páginas que encontremos publicadas en la red.
  • En esta entrada comenzaremos ha obtener los datos referentes a las estadísticas de los jugadores. Para ello, utilizando la herramienta para desarrolladores que traen integrada los diferentes navegadores vemos como se llaman los componentes html de la paginas que queremos descargarnos a nuestra máquina. En nuestro caso las páginas que tienen una  estructura de url similar a:  http://www.espn.com/nba/player/_/id/1/  tienen un div   con  un  class que se llama   'player-bio':  div[@class='player-bio'] . Basándonos en esto podemos empezar  nuestro bot.
  • Os dejo el vídeo donde podemos ver lo que acabo de contar:

  • Os dejo el código visto en el vídeo:

        static void Main(string[] args)
        {

            WebClient client = new WebClient();
            HtmlDocument doc = new HtmlDocument();
            HtmlNode.ElementsFlags["br"] = HtmlElementFlag.Empty;
            doc.OptionWriteEmptyNodes = true;

            var web = HttpWebRequest.Create("http://www.espn.com/nba/player/_/id/1/");
            Stream stream = web.GetResponse().GetResponseStream();
            doc.Load(stream);

            foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//div[@class='player-bio']"))
            {
                Console.WriteLine(node.InnerHtml);
            }

            Console.ReadLine();
                
       }
    }

Aprende web Scraping - Web ESPN - Parte 1

1. Web Scraping de la página ESPN

  •  En este capítulo del curso de programación en c# con visual studio 2017 vamos ha empezar con la técnica conocida como web scraping.  A grandes rasgos podemos decir que se trata de una técnica para extraer información de sitios web, se trata de un proceso para  recopilar información de forma automática de páginas que encontremos publicadas en la red. 
  • Antes de continuar  con la entrada del blog comentaros que en España el web scraping en sí, es legal. Es importante que entendamos que el problema no está en el uso de los crawlers o bots  para rastrear la red, sino en el uso que damos de los datos conseguidos. Como en nuestro caso el objetivo es simplemente aprender ha construir un bot para realizar esta tarea, y no le vamos a dar ningún uso comercial no creo que haya ningún problema. 
  • Una vez aclaradas estás cuestiones paso a comentaros lo que nos espera en las siguientes semanas en nuestro blog :
  1. Crearemos un programa que rastree la web  ESPN para obtener estadísticas de los jugadores.
  2. Una vez hecho esto guardaremos en nuestro disco duro un fichero por cada jugador encontrado. Como esto se trata de un ejemplo sólo me bajaré la información de unos 5000 jugadores.
  3.  Una vez tengamos almacenada la información en disco definir tablas en una base de datos para guardar la información.
  4. Volcar la información de los ficheros a nuestras base de datos.
  5. Crear un página web o aplicación de escritorio donde consultar las estadísticas.
  • Os dejo un enlace al vídeo donde os cuento la película:

Creando bot monitorización en c# - Capítulo 4

4. Creando bot monitorización en c# 

  •  En este capítulo del curso de programación en c# con visual studio 2017 finalizamos  la construcción de nuestro bot para monitorizar los cambios que se produzcan en un página determinada. Básicamente queremos saber cuando cambia un texto en una zona determinada de una página. 
  • En este capítulo veremos como hacer que una aplicación se ejecute con la periodicidad que nosotros le indiquemos.Para ello hacemos uso de las tareas programadas.Las tareas programadas son aquellas que usted puede configurar para que cualquier proceso, programa o archivo se ejecute el tiempo o fecha que usted desee. Los pasos a seguir son los siguientes:
  • Abrimos el programador de tareas:



  • Nos encontraremos con algo similar a esto:

  • Ahora pulsamos el botón derecho para crear una nueva tarea:



  • Nos aparecerá una ventana similar a la siguiente  donde configuraremos las características de la tarea:



  • Seleccionamos el archivos que queremos que se ejecute en la pestaña acciones:

  • Una vez hecho esto sólo nos queda configurar la periocidad. Tenéis la información al completo en el vídeo.

Curso .NET Core en C# - 34.Creamos nuestro propio log

34.Creamos nuestro propio log Hola a todos. En este curso, analizaremos todos los conceptos básicos, intermedios y avanzados de  ASP.NET...