Nuevo esquema de cancelación de facturas electrónicas en C# .Net, CFDI 3.3 SAT

En este video abarcare todo lo que debes saber cómo programador para cancelar bajo el nuevo esquema del SAT para la cancelación de facturas electrónicas que entro en vigor este pasado 1 de noviembre del 2018.

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

Patrones de diseño en C# .Net

Los patrones de diseño son un conjunto de técnicas que nos ayudaran a no reinventar la rueda, con estas técnicas ya tendremos soluciones a problemas comunes.

El aprender Patrones de diseño es darle un brinco a tu conocimiento como programador, el cual te ayudara a tener lista la solución de problemas a los que te enfrentaras en el día a día.

Si deseas un curso de Patrones de diseño en C# con ejemplos reales de su uso da CLIC AQUÍ.

Puedes ver el listado de patrones de diseño a continuación o si lo deseas puedes verlo en youtube dando clic aquí:

Crear CRUD en Windows Forms con C# .Net, Entity Framework y Sql Server

En este video te enseñare a crear un CRUD en Windows forms, después de ver el video serás capaz de obtener los datos de una base de datos, insertar datos, editar datos y eliminaros, todo a través de una interfaz hecha en Windows forms.

Juego de la vida en C# .Net, autómata celular, Universo holograma

En este video te enseñare como representar el juego de la vida en C# .Net paso por paso, al igual que te daré una explicación breve sobre que significa y para qué sirve este sistema determinista.

Descargar código fuente