Curso de Web scraping en C# .Net

En este nuevo curso te mostrare como puedes hacer web scraping de manera fácil y rápida con C# .Net.

1.- Obtener contenido HTML, seleccionar elementos por clase, nombre, id

En este video te muestro como puedes seleccionar elementos de una página web de manera natural, utilizando su clase, su id o su nombre de etiqueta.

2.- Guardar contenido de un sitio web en base de datos

En este segundo video te enseñare a como puedes guardar el contenido de un sitio web en una base de datos.

3.- Descargar todas las imágenes de una url

En este tercer video te enseñare como puedes descargarte todas las imagenes que se visualizan en una url de un sitio web.

4.- Descargar todas las imágenes de TODO un sitio web

En este video te enseñare a como navegar por todas las ligas de una url e ir recursivamente url por url del sitio entero descargando las imagenes.

Código fuente


using HtmlAgilityPack;
using ScrapySharp.Extensions;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using WebScraping.Models;

namespace WebScraping
{
    class Program
    {
        static List<string> lstYaInvocadas = new List<string>();
        static List<string> lstImagenesDescargadas = new List<string>();
        static string pathImages = @"C:\tuRuta\";
        static void Main(string[] args)
        {
           
            HtmlWeb oWeb = new HtmlWeb();
            string url = "https://hdeleon.net/";

           


            /*Video: 2 - Obtener titles ***********************************************/
             using (webscrapingEntities db = new webscrapingEntities()) {
                 for (int i = 1; i <= 32; i++) {


                     if (i > 1)
                         url += "/page/" + i + "/";

                     HtmlDocument doc2 = oWeb.Load(url);

                     foreach (var Nodo in doc2.DocumentNode.CssSelect(".entry-title"))
                     {

                         var NodoAnchor = Nodo.CssSelect("a").First();
                         var oTitle = new titles();
                         oTitle.title = NodoAnchor.InnerHtml;

                         db.titles.Add(oTitle);
                         //MisTitulos.Add(NodoAnchor.InnerHtml);


                     }

                     Console.WriteLine("se analizo la pagina: "+i);
                 }

                 db.SaveChanges();
             }
             

            /* Video 3 - Ejemplo de robar imagenes ********************************************/
            
          
            HtmlDocument doc = oWeb.Load(url);

            //obtenemos las imagenes
            int num = 0;
            foreach (var Nodo in doc.DocumentNode.CssSelect("img"))
            {
                Console.WriteLine("Imagen robada: " + Nodo.GetAttributeValue("src"));
                using (WebClient oClient = new WebClient())
                {
                    string urlImagen = Nodo.GetAttributeValue("src");
                    oClient.DownloadFile(new Uri(urlImagen), pathImages + num + ".jpg");
                }
                num++;
            }


            /*Video 4 - Obtener todas las imagenes de todo el sitio web *************************/
            HtmlDocument doc3 = oWeb.Load(url);

            //obtener las imagenes de la url
            foreach (var Nodo in doc3.DocumentNode.CssSelect("img"))
            {
                // Console.WriteLine("Imagen robada: " + Nodo.GetAttributeValue("src"));
                using (WebClient oClient = new WebClient())
                {
                    string urlImagen = Nodo.GetAttributeValue("src");
                    string[] arrUrlImagen = urlImagen.Split('/');
                    string nombreImagen = pathImages + arrUrlImagen[arrUrlImagen.Length - 1];
                    if (!lstImagenesDescargadas.Contains(arrUrlImagen[arrUrlImagen.Length - 1]))
                    {
                        oClient.DownloadFile(new Uri(urlImagen), nombreImagen);

                        lstImagenesDescargadas.Add(arrUrlImagen[arrUrlImagen.Length - 1]);
                    }
                }
            }

            //recursividad urls
            foreach (var Nodo in doc3.DocumentNode.CssSelect("a"))
            {
                string urlSon = Nodo.GetAttributeValue("href");
                if (!lstYaInvocadas.Contains(urlSon) && urlSon.StartsWith("https://hdeleon.net/"))
                {
                    Console.WriteLine(urlSon);
                    lstYaInvocadas.Add(urlSon);
                    ObtienesImagenes(urlSon);

                }
            }

        }

        #region Helpers

        private  static void ObtienesImagenes(string url,string tab="")
        {
            try
            {
                HtmlWeb oWeb = new HtmlWeb();
                HtmlDocument doc3 = oWeb.Load(url);

                foreach (var Nodo in doc3.DocumentNode.CssSelect("img"))
                {
                    // Console.WriteLine("Imagen robada: " + Nodo.GetAttributeValue("src"));
                    using (WebClient oClient = new WebClient())
                    {
                        string urlImagen = Nodo.GetAttributeValue("src");
                        string[] arrUrlImagen = urlImagen.Split('/');
                        string nombreImagen =pathImages+ arrUrlImagen[arrUrlImagen.Length - 1];
                        if (!lstImagenesDescargadas.Contains(arrUrlImagen[arrUrlImagen.Length - 1]))
                        {
                            oClient.DownloadFile(new Uri(urlImagen), nombreImagen);

                            lstImagenesDescargadas.Add(arrUrlImagen[arrUrlImagen.Length - 1]);
                        }
                    }
                }

                foreach (var Nodo in doc3.DocumentNode.CssSelect("a") )
                {
                    string urlSon = Nodo.GetAttributeValue("href");
                    if ( !lstYaInvocadas.Contains(urlSon) && urlSon.StartsWith("https://hdeleon.net/"))
                    {
                        Console.WriteLine(tab+urlSon);
                        lstYaInvocadas.Add(urlSon);
                        ObtienesImagenes(urlSon, tab + ">");
                       

                    }
                }
            }
            catch { }
          
        }

        #endregion
    }
}

Curso para crear sistema para facturación electrónica web gratis en C# .Net

En estos videos programados en vivo, te enseñare como hacer un sistema web que te sirva para la facturación electrónica, para que puedas generar tus facturas desde una interfaz amigable para el usuario.

El código fuente se encuentra al final de esta entrada; si quieres recibir un sistema con más elementos que este gratuito, puedes apoyarme vía patreon desde 1 USD al mes:
https://www.patreon.com/powerhdeleon

Puedes ver más videos gratis en mi canal de youtube: canal de hdeleon.net

1. Creación del proyecto en MVC .Net, y acceso de usuario

2. Librería para creación y sellado de xml 3.3 y catálogos del SAT en mysql

3. Creación de tablas en base de datos mysql para facturación

4. View Model para creación de factura

5. Seguridad y Vista para crear factura

6. Crear autocompletar de claves del SAT

7. Crear SelectList de catálogos del SAT – Parte 1

7. Crear SelectList de catálogos del SAT – Parte 2

8. Conceptos dinámicos

9. Crear objeto comprobante

10. Código para sellar el XML

11. Creación del archivo XML

12. Sellado de archivo XML

13.- Creación de capa de timbrado

14.- Timbrado de factura

Descargar el código fuente

Recuerda que la publicidad es para una buena causa, apoyar perros que están en la calle.

Curso para crear el complemento para recepción de pago del SAT en C# .Net gratis, cfdi 3.3

Este es un curso gratuito para que puedas crear tus xml con el complemento de pago.

Si gustas apoyarme, a la derecha puedes darme para una cerveza.

1. Convertir XSD del SAT a clases de c# .Net

2. Convertir XSD del SAT a clases de c# .Net.

3. Creación del xml, sellado y timbrado

4. Agregar documentos relacionados

Código fuente: clic aquí.

Curso complemento para recepción de pagos en C# .Net, Crear xml, timbrar | SAT cfdi 3.3, #3

En este video del curso para crear el complemento para recepción de pagos del cfdi 3.3, te enseñare como incorporar la clase que generamos en el video anterior en la clase Comprobante, y de esta manera crear el xml, para sellarlo y posteriormente timbrarlo.
También te explicare como debes armar el comprobante, ya que en este tipo de documento tiene validaciones en específico.

Video anterior: https://hdeleon.net/curso-complemento-para-recepcion-de-pagos-en-c-net-convertir-xsd-a-clases-de-c-sat-cfdi-3-3-2/

Código fuente: clic aquí.

Aprende a programar desde Cero, sin censura

Esta es una serie de videos que hice para que cualquier persona afín o no afín al desarrollo de software, pueda aprender a programar.

Aviso: el siguiente contenido contiene sátira y majaderías, ya que fue hecho con ese fin.

Prototype deep en C# .Net, Patrones de diseño, design patterns, #3

En este video explicare el patrón de diseño prototype deep en c# .Net, sis inconvenientes y su diferencia con el patrón de diseño prototype shallow.

Código

 public class Animal : ICloneable
    {
        public int Patas { get; set; }
        public string Nombre { get; set; }

        public Detalles Rasgos { get; set; }


        public object Clone()
        {
            Animal clonado = this.MemberwiseClone() as Animal;
            Detalles detalles = new Detalles();
            detalles.Color = this.Rasgos.Color;
            detalles.Raza = this.Rasgos.Raza;
            clonado.Rasgos = detalles;
            return clonado;
        }
    }

    public class Detalles
    {
        public string Color { get; set; }
        public string Raza { get; set; }
    }

//De esta manera se demuestra
 Animal oAnimal = new Animal() { Nombre = "Oveja Dolly", Patas = 4 };
oAnimal.Rasgos = new Detalles();
oAnimal.Rasgos.Color = "Blanca";
oAnimal.Rasgos.Raza = "Oveja";

Animal oAnimalClonado = oAnimal.Clone() as Animal;
oAnimalClonado.Rasgos.Color = "Negro";
oAnimalClonado.Nombre = "Oveja negra";

Console.WriteLine("animal original: "+oAnimal.Rasgos.Color);
Console.WriteLine("annimal clonado: "+oAnimalClonado.Rasgos.Color);
Console.WriteLine("animal original: "+oAnimal.Nombre);
Console.WriteLine("animal clonado: "+oAnimalClonado.Nombre);

Todos mis videos de patrones de diseño en C# .Net: https://www.youtube.com/watch?v=K902i_tsXl0&list=PLWYKfSbdsjJiiaXNIW1OYhRnStsyGvr6t

Curso de C# .Net

En este curso me enfoco a los aspectos de C# .Net directamente sin tanta teoria. El curso es grabado en vivo como los mejores programas de la televisión, en vivo y con errores.

Aquí no veras Programación Orientada a Objetos, que son las sentencias if o while, estos conceptos ya los debes conocer, e igual hay miles de sitios aburridos que te lo enseñan.

Yo me enfocare a enseñarte C# .Net de una manera original, directo al grano, todo con el fin de que te sirva como una herramienta real de trabajo.

A partir del video 2 comenzaremos a realizar un chat multiplataforma, el cual estará conectado por medio de un servicio web al cual se comunicara un sistema hecho en MVC y otro en Windows Form.

La lista de videos esta ordenada conforme van saliendo y se encuentran aquí abajo. (Igual puedes dar clic a uno y seguir la lista de reproducción)

Código del curso (se actualiza cada que hay nuevos videos): clic aquí

1. Introducción

2. Entornos y arquitectura (Windows Form, MVC, MVC Api)

3. Publicación y configuración de IIS

4. Json a Objeto, recibir datos por POST

5. Serializar y deserializar objetos, generics, enviar datos por POST

6. Creación de librerías, ¿Que es el administrador de paquetes NuGet?, appsettings

7. Vistas en MVC .Net, Razor

8. Validaciones con DataAnnotatios en MVC .Net

9. Autentificación en MVC API .Net

10. Autentificación en MVC .Net utilizando servicio web, filtros, seguridad

11. Solicitudes remotas en tiempo real con SignalR

12. Verificar Access Token, regresar listado en json

13. Utilizar if y try catch en LINQ con Lambda

14. Enviar y recibir datos en tiempo real con SignalR

15. Seguridad y grupos en SignalR

16. Introducción a Windows Forms

17. Sesiones en windows forms

18. Creación de elementos dinámicamente en windows forms

Prototype shallow en C# .Net, Patrones de diseño, design patterns, #2

En este video te explico el patrón de diseño Prototype superficial, y ejemplos de cuando utilizarlo y como programarlo.


//clase prototype superficial
public class Animal : ICloneable
    {
        public int Patas { get; set; }
        public string Nombre { get; set; }

        public object Clone()
        {
            return this.MemberwiseClone();
        }
    }

//como utilizarla
  Animal oAnimal = new Animal() { Nombre="Oveja Dolly", Patas=4};
  Animal oAnimalClonado = oAnimal.Clone() as Animal;
  oAnimalClonado.Patas = 5;

  Console.WriteLine(oAnimal.Patas);



Todos mis videos de patrones de diseño en C# .Net: https://www.youtube.com/watch?v=K902i_tsXl0&list=PLWYKfSbdsjJiiaXNIW1OYhRnStsyGvr6t

Singleton en C# .Net, Patrones de diseño, design patterns, #1

En este video te explico el patrón de diseño Singleton, sus características y cuando utilizarlo.


 public class Singleton
    {
        private static Singleton instance = null;
        public string mensaje = "";

        protected Singleton() {
            mensaje = "hola mundo";
        }

        public static Singleton Instance
        {
            get
            {
                if (instance == null)
                    instance = new Singleton();

                return instance;
            }
        }

    }