Pop

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();
        }

No hay comentarios:

Publicar un comentario

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