Scraping y extracción de datos en C#: cuando Python no es la única opción
\n\nSi estás acostumbrado a que el scraping sea dominio de Python con sus BeautifulSoup y Scrapy, tengo una sorpresa para ti. C# en el mundo del web scraping es como una navaja suiza: potente, confiable y con un montón de herramientas que ni siquiera sabías que existían. El scraping en C# abre las puertas a la integración con el ecosistema .NET, aplicaciones de alto rendimiento y un tipado estricto que evita errores tontos durante la compilación.
\n\nEn este artículo te mostraré cómo usar C# para la recolección de datos, analizaré ejemplos reales de código y te contaré por qué tu próximo parser debería escribirse en C#, incluso si nunca lo habías considerado antes.
\n\n¿Por qué C# y no Python? Tres argumentos de hierro
\n\nSí, Python es el rey de la creación de prototipos. Pero cuando se trata de scraping de datos a nivel industrial en C#, obtienes:
\n\n- \n
- Rendimiento: C# se compila a código máquina (a través de JIT o AOT), lo que proporciona un aumento de velocidad de 2 a 5 veces en el scraping de grandes volúmenes de datos. \n
- Seguridad de tipos: Nunca pasarás un número donde se espera una cadena. El compilador detectará el error antes de la ejecución. \n
- Ecosistema .NET: Un parser en C# se integra fácilmente en ASP.NET, WPF, utilidades de consola e incluso en Unity (sí, se pueden extraer datos de un juego). \n
Y lo más importante: C# maneja excelentemente tareas que requieren scraping multihilo, trabajo con bases de datos y lógica compleja de extracción de información.
\n\nHerramientas: eligiendo una biblioteca para scraping en C#
\n\nEl scraping de sitios web en C# comienza con la elección de la herramienta adecuada. Destacaré tres enfoques principales que cubren el 95% de las tareas de web scraping.
\n\nHtmlAgilityPack: el clásico para parsear HTML
\n\nEsta es la biblioteca más popular para scraping en C#. Convierte el HTML en una estructura de árbol con la que es fácil trabajar mediante XPath o LINQ. Es ideal para páginas estáticas.
\n\nusing HtmlAgilityPack;\n\nvar web = new HtmlWeb();\nvar doc = web.Load("https://example.com/articles");\n\n// Seleccionamos todos los encabezados h2 con la clase "title"\nvar titles = doc.DocumentNode\n .SelectNodes("//h2[@class='title']")\n .Select(node => node.InnerText.Trim())\n .ToList();\n\nforeach (var title in titles)\n{\n Console.WriteLine($"Encabezado encontrado: {title}");\n}\n\nEste código carga la página, la parsea y recopila los encabezados. HtmlAgilityPack puede manejar HTML mal formado, corrigiendo etiquetas no cerradas, algo común en sitios web reales.
\n\nAngleSharp: la alternativa moderna
\n\nAngleSharp es una biblioteca más reciente que admite selectores CSS (como en jQuery) y trabaja con el modelo DOM. La extracción de datos en C# con AngleSharp resulta natural para quienes conocen JavaScript.
\n\nusing AngleSharp;\nusing AngleSharp.Html.Parser;\n\nvar context = BrowsingContext.New(Configuration.Default);\nvar parser = context.GetService<IHtmlParser>();\n\nvar document = await parser.ParseDocumentAsync(htmlString);\nvar prices = document.QuerySelectorAll(".product-price")\n .Select(el => el.TextContent.Trim())\n .ToList();\n\nAngleSharp es ideal cuando no solo necesitas recopilar datos, sino también realizar manipulaciones en el DOM, como modificar atributos antes de guardarlos.
\n\nSelenium WebDriver: para sitios dinámicos
\n\nCuando un sitio carga contenido mediante JavaScript (React, Vue, Angular), un parser normal no sirve. Aquí entra en juego Selenium. Este emula el funcionamiento de un navegador y permite extraer datos después de que la página se haya cargado por completo.
\n\nusing OpenQA.Selenium;\nusing OpenQA.Selenium.Chrome;\n\nusing (var driver = new ChromeDriver())\n{\n driver.Navigate().GoToUrl("https://example.com/dynamic-page");\n \n // Esperamos a que aparezca el elemento\n var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));\n wait.Until(d => d.FindEleme