Cómo scrapear un blog en C#

por Ahmed Aboelmagd

Usemos Iron WebScraper para extraer el contenido de un Blog usando C# o VB.NET.

Este tutorial muestra cómo un blog de WordPress (o similar) pueden volver a convertirse en contenido mediante .NET

Biblioteca NuGet C# para

Instalar con NuGet

Install-Package IronWebScraper
o
Java PDF JAR

Descargar DLL

Descargar DLL

Instalar manualmente en su proyecto

public class BlogScraper : WebScraper
{
    /// <summary>
    /// Anular este método inicializa tu web-scraper.
    /// Tareas importantes serán Solicitar al menos una url de inicio... y establecer patrones de dominios o urls permitidos/prohibidos.
    /// </summary>
    public override void Init()
    {
        License.LicenseKey = " LicenseKey ";
        this.LoggingLevel = WebScraper.LogLevel.All;
        this.WorkingDirectory = AppSetting.GetAppRoot() + @"\BlogSample\Output\";
        EnableWebCache(new TimeSpan(1, 30, 30));
        this.Request("http://blogSite.com/", Parse);
    }
}
public class BlogScraper : WebScraper
{
    /// <summary>
    /// Anular este método inicializa tu web-scraper.
    /// Tareas importantes serán Solicitar al menos una url de inicio... y establecer patrones de dominios o urls permitidos/prohibidos.
    /// </summary>
    public override void Init()
    {
        License.LicenseKey = " LicenseKey ";
        this.LoggingLevel = WebScraper.LogLevel.All;
        this.WorkingDirectory = AppSetting.GetAppRoot() + @"\BlogSample\Output\";
        EnableWebCache(new TimeSpan(1, 30, 30));
        this.Request("http://blogSite.com/", Parse);
    }
}
Public Class BlogScraper
	Inherits WebScraper

	''' <summary>
	''' Anular este método inicializa tu web-scraper.
	''' Tareas importantes serán Solicitar al menos una url de inicio... y establecer patrones de dominios o urls permitidos/prohibidos.
	''' </summary>
	Public Overrides Sub Init()
		License.LicenseKey = " LicenseKey "
		Me.LoggingLevel = WebScraper.LogLevel.All
		Me.WorkingDirectory = AppSetting.GetAppRoot() & "\BlogSample\Output\"
		EnableWebCache(New TimeSpan(1, 30, 30))
		Me.Request("http://blogSite.com/", Parse)
	End Sub
End Class
VB   C#

Como de costumbre, creamos un Scraper y heredamos de la clase WebScraper. En este caso es "BlogScraper".

Establecemos un directorio de trabajo a "\BlogSample\Output\" que es donde todos los archivos de salida y la memoria caché puede ir.

A continuación, activamos la caché web para guardar las páginas solicitadas en la carpeta de caché "WebCache".

Ahora vamos a escribir una función de análisis sintáctico:

/// <summary>
/// Sustituya este método para crear el manejador de respuesta predeterminado para su raspador web.
/// Si tiene varios tipos de página, puede añadir métodos similares adicionales.
/// </summary>
/// <param name="response">The http Response object to parse</param>
public override void Parse(Response response)
{
    foreach (var link in response.Css("div.section-nav > ul > li > a "))
    {
        switch(link.TextContentClean)
        {
            case "Reviews":
                {

                }break;
            case "Science":
                {

                }break;
            default:
                {
                    //  Guardar resultado en archivo
                    Scrape(new ScrapedData() { { "Title", link.TextContentClean } }, "BlogScraper.Jsonl");
                }
                break;
        }
    }
}
/// <summary>
/// Sustituya este método para crear el manejador de respuesta predeterminado para su raspador web.
/// Si tiene varios tipos de página, puede añadir métodos similares adicionales.
/// </summary>
/// <param name="response">The http Response object to parse</param>
public override void Parse(Response response)
{
    foreach (var link in response.Css("div.section-nav > ul > li > a "))
    {
        switch(link.TextContentClean)
        {
            case "Reviews":
                {

                }break;
            case "Science":
                {

                }break;
            default:
                {
                    //  Guardar resultado en archivo
                    Scrape(new ScrapedData() { { "Title", link.TextContentClean } }, "BlogScraper.Jsonl");
                }
                break;
        }
    }
}
''' <summary>
''' Sustituya este método para crear el manejador de respuesta predeterminado para su raspador web.
''' Si tiene varios tipos de página, puede añadir métodos similares adicionales.
''' </summary>
''' <param name="response">The http Response object to parse</param>
Public Overrides Sub Parse(ByVal response As Response)
	For Each link In response.Css("div.section-nav > ul > li > a ")
		Select Case link.TextContentClean
			Case "Reviews"

			Case "Science"

			Case Else
					'  Guardar resultado en archivo
					Scrape(New ScrapedData() From {
						{ "Title", link.TextContentClean }
					},
					"BlogScraper.Jsonl")
		End Select
	Next link
End Sub
VB   C#

Dentro del método parse; analizamos el menú superior para obtener todos los enlaces a todas las páginas de categorías (Cine, Ciencia, Críticas, etc.)

A continuación, cambiamos a un método de análisis adecuado basado en la categoría del enlace.

Preparemos nuestro modelo de objetos para la Página de Ciencia:

/// <summary>
/// CienciaModelo
/// </summary>
public class ScienceModel
{
    /// <summary>
    /// Obtiene o establece el título.
    /// </summary>
    /// <value>
    /// El título.
    /// </value>
    public string Title { get; set; }
    /// <summary>
    /// Obtiene o establece el autor.
    /// </summary>
    /// <value>
    /// El autor.
    /// </value>
    public string Author { get; set; }
    /// <summary>
    /// Obtiene o establece la fecha.
    /// </summary>
    /// <value>
    /// La fecha.
    /// </value>
    public string Date { get; set; }
    /// <summary>
    /// Obtiene o establece la imagen.
    /// </summary>
    /// <value>
    /// La imagen.
    /// </value>
    public string Image { get; set; }
    /// <summary>
    /// Obtiene o establece el texto.
    /// </summary>
    /// <value>
    /// El texto.
    /// </value>
    public string Text { get; set; }

}
/// <summary>
/// CienciaModelo
/// </summary>
public class ScienceModel
{
    /// <summary>
    /// Obtiene o establece el título.
    /// </summary>
    /// <value>
    /// El título.
    /// </value>
    public string Title { get; set; }
    /// <summary>
    /// Obtiene o establece el autor.
    /// </summary>
    /// <value>
    /// El autor.
    /// </value>
    public string Author { get; set; }
    /// <summary>
    /// Obtiene o establece la fecha.
    /// </summary>
    /// <value>
    /// La fecha.
    /// </value>
    public string Date { get; set; }
    /// <summary>
    /// Obtiene o establece la imagen.
    /// </summary>
    /// <value>
    /// La imagen.
    /// </value>
    public string Image { get; set; }
    /// <summary>
    /// Obtiene o establece el texto.
    /// </summary>
    /// <value>
    /// El texto.
    /// </value>
    public string Text { get; set; }

}
''' <summary>
''' CienciaModelo
''' </summary>
Public Class ScienceModel
	''' <summary>
	''' Obtiene o establece el título.
	''' </summary>
	''' <value>
	''' El título.
	''' </value>
	Public Property Title() As String
	''' <summary>
	''' Obtiene o establece el autor.
	''' </summary>
	''' <value>
	''' El autor.
	''' </value>
	Public Property Author() As String
	''' <summary>
	''' Obtiene o establece la fecha.
	''' </summary>
	''' <value>
	''' La fecha.
	''' </value>
	Public Property [Date]() As String
	''' <summary>
	''' Obtiene o establece la imagen.
	''' </summary>
	''' <value>
	''' La imagen.
	''' </value>
	Public Property Image() As String
	''' <summary>
	''' Obtiene o establece el texto.
	''' </summary>
	''' <value>
	''' El texto.
	''' </value>
	Public Property Text() As String

End Class
VB   C#

Ahora vamos a implementar un scrape de una sola página:

/// <summary>
/// Analiza las revisiones.
/// </summary>
/// <param name="response">The response.</param>
public void ParseReviews(Response response)
{
    //  Lista de enlaces científicos
    var scienceList = new List<ScienceModel>();

    foreach (var postBox in response.Css("section.main > div > div.post-list"))
    {
        var item = new ScienceModel();
        item.Title = postBox.Css("h1.headline > a")[0].TextContentClean;
        item.Author = postBox.Css("div.author > a")[0].TextContentClean;
        item.Date = postBox.Css("div.time > a")[0].TextContentClean;
        item.Image = postBox.Css("div.image-wrapper.default-state > img")[0].Attributes ["src"];
        item.Text = postBox.Css("div.summary > p")[0].TextContentClean;
        scienceList.Add(item);
    }

    Scrape(scienceList, "BlogScience.Jsonl");
}
/// <summary>
/// Analiza las revisiones.
/// </summary>
/// <param name="response">The response.</param>
public void ParseReviews(Response response)
{
    //  Lista de enlaces científicos
    var scienceList = new List<ScienceModel>();

    foreach (var postBox in response.Css("section.main > div > div.post-list"))
    {
        var item = new ScienceModel();
        item.Title = postBox.Css("h1.headline > a")[0].TextContentClean;
        item.Author = postBox.Css("div.author > a")[0].TextContentClean;
        item.Date = postBox.Css("div.time > a")[0].TextContentClean;
        item.Image = postBox.Css("div.image-wrapper.default-state > img")[0].Attributes ["src"];
        item.Text = postBox.Css("div.summary > p")[0].TextContentClean;
        scienceList.Add(item);
    }

    Scrape(scienceList, "BlogScience.Jsonl");
}
''' <summary>
''' Analiza las revisiones.
''' </summary>
''' <param name="response">The response.</param>
Public Sub ParseReviews(ByVal response As Response)
	'  Lista de enlaces científicos
	Dim scienceList = New List(Of ScienceModel)()

	For Each postBox In response.Css("section.main > div > div.post-list")
		Dim item = New ScienceModel()
		item.Title = postBox.Css("h1.headline > a")(0).TextContentClean
		item.Author = postBox.Css("div.author > a")(0).TextContentClean
		item.Date = postBox.Css("div.time > a")(0).TextContentClean
		item.Image = postBox.Css("div.image-wrapper.default-state > img")(0).Attributes ("src")
		item.Text = postBox.Css("div.summary > p")(0).TextContentClean
		scienceList.Add(item)
	Next postBox

	Scrape(scienceList, "BlogScience.Jsonl")
End Sub
VB   C#

Una vez creado nuestro modelo, podemos analizar el objeto de respuesta para desglosar sus elementos principales (título, autor, fecha, imagen, texto)

A continuación, guardamos el resultado en un archivo independiente utilizando Raspar(objeto, fileName).

Haga clic aquí para ver el tutorial completo de Ahmed sobre el uso de IronWebscraper

Webscrpaing nunca ha sido una tarea sencilla, sin frameworks dominantes para su uso en entornos de programación C# o .NET. Iron Web Scraper fue creado para cambiar esto
Ingeniero de Software .NET Para muchos esta es la forma más eficiente de generar archivos PDF desde .NET, porque no hay una API adicional que aprender, ni un complejo sistema de diseño por el que navegar.

Ahmed Aboelmagd

Arquitecto de soluciones de software .NET en una empresa multinacional de TI

Ahmed es un especialista certificado en tecnología Microsoft con más de 10 años de experiencia en TI y desarrollo de software. Ha trabajado en diversas empresas y ahora es director nacional de una multinacional de TI.

Ahmed lleva más de un año trabajando con IronPDF e IronWebScraper, utilizándolos en múltiples proyectos con su empresa.