Comment extraire des données de sites Web en C

This article was translated from English: Does it need improvement?
Translated
View the article in English

IronWebscraper est une bibliothèque .NET pour le web scraping, l'extraction de données web et l'analyse de contenu web. Il s'agit d'une bibliothèque facile à utiliser qui peut être ajoutée aux projets Microsoft Visual Studio pour une utilisation en développement et en production.

IronWebscraper possède de nombreuses fonctionnalités uniques, telles que le contrôle des pages, objets, médias, etc. autorisés et interdits. Il permet également la gestion de plusieurs identités, du cache web et de nombreuses autres fonctionnalités que nous aborderons dans ce tutoriel.

Commencez à utiliser IronWebscraper

Commencez à utiliser IronWebScraper dans votre projet aujourd'hui avec un essai gratuit.

Première étape :
green arrow pointer


Public cible

Ce tutoriel s'adresse aux développeurs de logiciels possédant des compétences en programmation de base ou avancées, qui souhaitent concevoir et mettre en œuvre des solutions pour des capacités de web scraping avancées (web scraping de sites web, collecte et extraction de données de sites web, analyse du contenu de sites web, web harvesting).

! Image extraite du Web

Compétences requises

  1. Maîtrise des fondamentaux de la programmation et des compétences liées à l'utilisation d'un langage de programmation Microsoft tel que C# ou VB.NET.
  2. Connaissance de base des technologies web (HTML, JavaScript, jQuery, CSS, etc.) et de leur fonctionnement.
  3. Connaissances de base du DOM, de XPath, du HTML et des sélecteurs CSS

Outils

  1. Microsoft Visual Studio 2010 ou version ultérieure
  2. Extensions pour développeurs web destinées aux navigateurs, telles que l'inspecteur web pour Chrome ou Firebug pour Firefox.

Pourquoi gratter ? (Reasons and Concepts)

Si vous souhaitez créer un produit ou une solution capable de :

  1. Extraire les données du site web
  2. Comparez le contenu, les prix, les fonctionnalités, etc. de plusieurs sites web
  3. Analyse et mise en cache du contenu du site web

Si vous vous reconnaissez dans une ou plusieurs des raisons mentionnées ci-dessus, alors IronWebscraper est une excellente bibliothèque qui répondra à vos besoins.

Comment installer IronWebScraper ?

Après avoir créé un nouveau projet (voir l'annexe A), vous pouvez ajouter la bibliothèque IronWebScraper à votre projet en insérant automatiquement la bibliothèque à l'aide de NuGet ou en installant manuellement la DLL.

Installer à l'aide de NuGet

Pour ajouter la bibliothèque IronWebScraper à notre projet en utilisant NuGet, nous pouvons le faire via l'interface visuelle (Gestionnaire de packages NuGet) ou par ligne de commande via la console du Gestionnaire de packages.

Utilisation de NuGet Package Manager

  1. À l'aide de la souris, cliquez avec le bouton droit sur le nom du projet, puis sélectionnez " Gérer les packages NuGet ". Ajoutez IronWebScraper via l'interface graphique .

  2. Dans l'onglet Parcourir -> recherchez IronWebScraper -> Installer ! Ajouter IronWebScraper via l'interface graphique 2

  3. Cliquez sur OK ! Ajouter IronWebScraper à l'aide de l'interface graphique 3

  4. Et c'est terminé. ! Ajouter IronWebScraper en utilisant l'interface graphique 4

Utilisation de la console de packages NuGet

  1. Dans Outils -> Gestionnaire de packages NuGet -> Console du gestionnaire de packages ! Ajouter IronWebScraper via la console

  2. Choisissez le projet de bibliothèque de classes comme projet par défaut
  3. Exécuter la commande -> Install-Package IronWebScraper ! Ajouter IronWebScraper via la console 1

Installation manuelle

  1. Allez àhttps://ironsoftware.com
  2. Cliquez sur IronWebScraper ou accédez directement à sa page via l'URL.https://ironsoftware.com/csharp/webscraper/
  3. Cliquez sur Télécharger la DLL.
  4. Extraire le fichier compressé téléchargé
  5. Dans Visual Studio, cliquez avec le bouton droit sur le projet -> Ajouter -> Références -> Parcourir

! Ajoutez IronWebScraper en utilisant une DLL

  1. Accédez au dossier extrait -> netstandard2.0 -> et sélectionnez tous les fichiers .dll

! Ajouter IronWebScraper en utilisant la DLL 2

  1. Et voilà !

HelloScraper - Notre premier exemple d'IronWebScraper

Comme d'habitude, nous commencerons par implémenter l'application Hello Scraper pour faire nos premiers pas avec IronWebScraper.

Nous avons créé une nouvelle application console nommée " IronWebScraperSample ".

Étapes pour créer un exemple d'IronWebScraper

  1. Créez un dossier et nommez-le " HelloScraperSample ".
  2. Ensuite, ajoutez une nouvelle classe et nommez-la " HelloScraper ". ! HelloScraper Ajouter une classe

  3. Ajoutez cet extrait de code à HelloScraper

    public class HelloScraper : WebScraper
    {
        /// <summary>
        /// Override this method to initialize your web scraper.
        /// Important tasks will be to request at least one start URL and set allowed/banned domain or URL patterns.
        /// </summary>
        public override void Init()
        {
            License.LicenseKey = "LicenseKey"; // Write License Key
            this.LoggingLevel = WebScraper.LogLevel.All; // Log all events
            this.Request("https://blog.scrapinghub.com", Parse); // Initialize a web request to the given URL
        }
    
        /// <summary>
        /// Override this method to create the default Response handler for your web scraper.
        /// If you have multiple page types, you can add additional similar methods.
        /// </summary>
        /// <param name="response">The HTTP Response object to parse</param>
        public override void Parse(Response response)
        {
            // Set working directory for the project
            this.WorkingDirectory = AppSetting.GetAppRoot() + @"\HelloScraperSample\Output\";
            // Loop on all links
            foreach (var titleLink in response.Css("h2.entry-title a"))
            {
                // Read link text
                string title = titleLink.TextContentClean;
                // Save result to file
                Scrape(new ScrapedData() { { "Title", title } }, "HelloScraper.json");
            }
    
            // Loop on all links for pagination
            if (response.CssExists("div.prev-post > a[href]"))
            {
                // Get next page URL
                var nextPage = response.Css("div.prev-post > a[href]")[0].Attributes["href"];
                // Scrape next URL
                this.Request(nextPage, Parse);
            }
        }
    }
    public class HelloScraper : WebScraper
    {
        /// <summary>
        /// Override this method to initialize your web scraper.
        /// Important tasks will be to request at least one start URL and set allowed/banned domain or URL patterns.
        /// </summary>
        public override void Init()
        {
            License.LicenseKey = "LicenseKey"; // Write License Key
            this.LoggingLevel = WebScraper.LogLevel.All; // Log all events
            this.Request("https://blog.scrapinghub.com", Parse); // Initialize a web request to the given URL
        }
    
        /// <summary>
        /// Override this method to create the default Response handler for your web scraper.
        /// If you have multiple page types, you can add additional similar methods.
        /// </summary>
        /// <param name="response">The HTTP Response object to parse</param>
        public override void Parse(Response response)
        {
            // Set working directory for the project
            this.WorkingDirectory = AppSetting.GetAppRoot() + @"\HelloScraperSample\Output\";
            // Loop on all links
            foreach (var titleLink in response.Css("h2.entry-title a"))
            {
                // Read link text
                string title = titleLink.TextContentClean;
                // Save result to file
                Scrape(new ScrapedData() { { "Title", title } }, "HelloScraper.json");
            }
    
            // Loop on all links for pagination
            if (response.CssExists("div.prev-post > a[href]"))
            {
                // Get next page URL
                var nextPage = response.Css("div.prev-post > a[href]")[0].Attributes["href"];
                // Scrape next URL
                this.Request(nextPage, Parse);
            }
        }
    }
    Public Class HelloScraper
    	Inherits WebScraper
    
    	''' <summary>
    	''' Override this method to initialize your web scraper.
    	''' Important tasks will be to request at least one start URL and set allowed/banned domain or URL patterns.
    	''' </summary>
    	Public Overrides Sub Init()
    		License.LicenseKey = "LicenseKey" ' Write License Key
    		Me.LoggingLevel = WebScraper.LogLevel.All ' Log all events
    		Me.Request("https://blog.scrapinghub.com", AddressOf Parse) ' Initialize a web request to the given URL
    	End Sub
    
    	''' <summary>
    	''' Override this method to create the default Response handler for your web scraper.
    	''' If you have multiple page types, you can add additional similar methods.
    	''' </summary>
    	''' <param name="response">The HTTP Response object to parse</param>
    	Public Overrides Sub Parse(ByVal response As Response)
    		' Set working directory for the project
    		Me.WorkingDirectory = AppSetting.GetAppRoot() & "\HelloScraperSample\Output\"
    		' Loop on all links
    		For Each titleLink In response.Css("h2.entry-title a")
    			' Read link text
    			Dim title As String = titleLink.TextContentClean
    			' Save result to file
    			Scrape(New ScrapedData() From {
    				{ "Title", title }
    			},
    			"HelloScraper.json")
    		Next titleLink
    
    		' Loop on all links for pagination
    		If response.CssExists("div.prev-post > a[href]") Then
    			' Get next page URL
    			Dim nextPage = response.Css("div.prev-post > a[href]")(0).Attributes("href")
    			' Scrape next URL
    			Me.Request(nextPage, AddressOf Parse)
    		End If
    	End Sub
    End Class
    $vbLabelText   $csharpLabel
  4. Pour démarrer le scraping, ajoutez cet extrait de code à Main.

    static void Main(string[] args)
    {
        // Create Object From Hello Scrape class
        HelloScraperSample.HelloScraper scrape = new HelloScraperSample.HelloScraper();
        // Start Scraping
        scrape.Start();
    }
    static void Main(string[] args)
    {
        // Create Object From Hello Scrape class
        HelloScraperSample.HelloScraper scrape = new HelloScraperSample.HelloScraper();
        // Start Scraping
        scrape.Start();
    }
    Shared Sub Main(ByVal args() As String)
    	' Create Object From Hello Scrape class
    	Dim scrape As New HelloScraperSample.HelloScraper()
    	' Start Scraping
    	scrape.Start()
    End Sub
    $vbLabelText   $csharpLabel
  5. Le résultat sera enregistré dans un fichier au format WebScraper.WorkingDirectory/classname.Json ! Résultat de HelloScraper

Aperçu du code

Scrape.Start() déclenche la logique de récupération comme suit :

  1. Appelle la méthode Init() pour initialiser les variables, extraire les propriétés et définir les attributs de comportement.
  2. Définit la requête de page de démarrage dans Init() avec Request(&quot;https://blog.scrapinghub.com&quot;, Parse) .
  3. Gère plusieurs requêtes HTTP et threads en parallèle, maintenant le code synchrone et facilitant le débogage.
  4. La méthode Parse() est déclenchée après Init() pour traiter la réponse, extraire les données à l'aide de sélecteurs CSS et les enregistrer au format JSON.

Fonctions et options de la bibliothèque IronWebScraper

La documentation mise à jour se trouve dans le fichier zip téléchargé lors de l'installation manuelle ( IronWebScraper Documentation.chm File ). Vous pouvez également consulter la documentation en ligne pour obtenir la dernière mise à jour de la bibliothèque à l'adresse suivante :https://ironsoftware.com/csharp/webscraper/object-reference/ .

Pour commencer à utiliser IronWebScraper dans votre projet, vous devez hériter de la classe IronWebScraper.WebScraper , qui étend votre bibliothèque de classes et y ajoute des fonctionnalités de scraping. De plus, vous devez implémenter les méthodes Init() et Parse(Response response) .

namespace IronWebScraperEngine
{
    public class NewsScraper : IronWebScraper.WebScraper
    {
        public override void Init()
        {
            throw new NotImplementedException();
        }

        public override void Parse(Response response)
        {
            throw new NotImplementedException();
        }
    }
}
namespace IronWebScraperEngine
{
    public class NewsScraper : IronWebScraper.WebScraper
    {
        public override void Init()
        {
            throw new NotImplementedException();
        }

        public override void Parse(Response response)
        {
            throw new NotImplementedException();
        }
    }
}
Namespace IronWebScraperEngine
	Public Class NewsScraper
		Inherits IronWebScraper.WebScraper

		Public Overrides Sub Init()
			Throw New NotImplementedException()
		End Sub

		Public Overrides Sub Parse(ByVal response As Response)
			Throw New NotImplementedException()
		End Sub
	End Class
End Namespace
$vbLabelText   $csharpLabel
Propriétés et fonctions Taper Description
Init () Méthode Utilisé pour installer le racleur
Parse (Response response) Méthode Utilisé pour implémenter la logique que le scraper utilisera et la manière dont il traitera les données. Il est possible d'implémenter plusieurs méthodes pour différents comportements ou structures de page.
BannedUrls , AllowedUrls , BannedDomains Collections Utilisé pour interdire/autoriser des URL et/ou des domaines. Ex : BannedUrls.Add(&quot; *.zip&quot;, &quot;* .exe&quot;, &quot; *.gz&quot;, &quot;* .pdf&quot;); Prend en charge les caractères génériques et les expressions régulières.
ObeyRobotsDotTxt booléen Permet d'activer ou de désactiver la lecture et le suivi des directives du fichier robots.txt .
ObeyRobotsDotTxtForHost (string Host) Méthode Permet d'activer ou de désactiver la lecture et le suivi des directives du fichier robots.txt pour un domaine donné.
Scrape , ScrapeUnique Méthode
ThrottleMode Énumération Options d'énumération : ByIpAddress , ByDomainHostName . Permet une limitation intelligente du débit des requêtes, respectueuse des adresses IP des hôtes ou des noms de domaine.
EnableWebCache , EnableWebCache (TimeSpan cacheDuration) Méthode Active la mise en cache des requêtes Web.
MaxHttpConnectionLimit Int Définit le nombre total de requêtes HTTP ouvertes autorisées (threads).
RateLimitPerHost Durée Définit le délai minimal de politesse (pause) entre les requêtes adressées à un domaine ou une adresse IP donnée.
OpenConnectionLimitPerHost Int Définit le nombre autorisé de requêtes HTTP simultanées (threads) par nom d'hôte ou adresse IP.
WorkingDirectory chaîne Définit le chemin du répertoire de travail pour le stockage des données.

Exemples et exercices pratiques en situation réelle

Extraction de données d'un site web de films en ligne

Prenons l'exemple d'une extraction de données d'un site web de films.

Ajoutez une nouvelle classe et nommez-la MovieScraper :

! Ajouter la classe MovieScraper

Structure HTML

Voici une partie du code HTML de la page d'accueil que l'on voit sur le site web :

<div id="movie-featured" class="movies-list movies-list-full tab-pane in fade active">
    <div data-movie-id="20746" class="ml-item">
        <a href="https://website.com/film/king-arthur-legend-of-the-sword-20746/">
            <span class="mli-quality">CAM</span>
            <img data-original="https://img.gocdn.online/2017/05/16/poster/2116d6719c710eabe83b377463230fbe-king-arthur-legend-of-the-sword.jpg" 
                 class="lazy thumb mli-thumb" alt="King Arthur: Legend of the Sword"
                  src="https://img.gocdn.online/2017/05/16/poster/2116d6719c710eabe83b377463230fbe-king-arthur-legend-of-the-sword.jpg" 
                 style="display: inline-block;">
            <span class="mli-info"><h2>King Arthur: Legend of the Sword</h2></span>
        </a>
    </div>
    <div data-movie-id="20724" class="ml-item">
        <a href="https://website.com/film/snatched-20724/" >
            <span class="mli-quality">CAM</span>
            <img data-original="https://img.gocdn.online/2017/05/16/poster/5ef66403dc331009bdb5aa37cfe819ba-snatched.jpg" 
                 class="lazy thumb mli-thumb" alt="Snatched" 
                 src="https://img.gocdn.online/2017/05/16/poster/5ef66403dc331009bdb5aa37cfe819ba-snatched.jpg" 
                 style="display: inline-block;">
            <span class="mli-info"><h2>Snatched</h2></span>
        </a>
    </div>
</div>
<div id="movie-featured" class="movies-list movies-list-full tab-pane in fade active">
    <div data-movie-id="20746" class="ml-item">
        <a href="https://website.com/film/king-arthur-legend-of-the-sword-20746/">
            <span class="mli-quality">CAM</span>
            <img data-original="https://img.gocdn.online/2017/05/16/poster/2116d6719c710eabe83b377463230fbe-king-arthur-legend-of-the-sword.jpg" 
                 class="lazy thumb mli-thumb" alt="King Arthur: Legend of the Sword"
                  src="https://img.gocdn.online/2017/05/16/poster/2116d6719c710eabe83b377463230fbe-king-arthur-legend-of-the-sword.jpg" 
                 style="display: inline-block;">
            <span class="mli-info"><h2>King Arthur: Legend of the Sword</h2></span>
        </a>
    </div>
    <div data-movie-id="20724" class="ml-item">
        <a href="https://website.com/film/snatched-20724/" >
            <span class="mli-quality">CAM</span>
            <img data-original="https://img.gocdn.online/2017/05/16/poster/5ef66403dc331009bdb5aa37cfe819ba-snatched.jpg" 
                 class="lazy thumb mli-thumb" alt="Snatched" 
                 src="https://img.gocdn.online/2017/05/16/poster/5ef66403dc331009bdb5aa37cfe819ba-snatched.jpg" 
                 style="display: inline-block;">
            <span class="mli-info"><h2>Snatched</h2></span>
        </a>
    </div>
</div>
HTML

Comme nous pouvons le constater, nous avons un identifiant de film, un titre et un lien vers une page détaillée. Commençons à extraire ces données :

public class MovieScraper : WebScraper
{
    public override void Init()
    {
        License.LicenseKey = "LicenseKey";
        this.LoggingLevel = WebScraper.LogLevel.All;
        this.WorkingDirectory = AppSetting.GetAppRoot() + @"\MovieSample\Output\";
        this.Request("www.website.com", Parse);
    }

    public override void Parse(Response response)
    {
        foreach (var div in response.Css("#movie-featured > div"))
        {
            if (div.GetAttribute("class") != "clearfix")
            {
                var movieId = div.GetAttribute("data-movie-id");
                var link = div.Css("a")[0];
                var movieTitle = link.TextContentClean;
                Scrape(new ScrapedData() { { "MovieId", movieId }, { "MovieTitle", movieTitle } }, "Movie.Jsonl");
            }
        }           
    }
}
public class MovieScraper : WebScraper
{
    public override void Init()
    {
        License.LicenseKey = "LicenseKey";
        this.LoggingLevel = WebScraper.LogLevel.All;
        this.WorkingDirectory = AppSetting.GetAppRoot() + @"\MovieSample\Output\";
        this.Request("www.website.com", Parse);
    }

    public override void Parse(Response response)
    {
        foreach (var div in response.Css("#movie-featured > div"))
        {
            if (div.GetAttribute("class") != "clearfix")
            {
                var movieId = div.GetAttribute("data-movie-id");
                var link = div.Css("a")[0];
                var movieTitle = link.TextContentClean;
                Scrape(new ScrapedData() { { "MovieId", movieId }, { "MovieTitle", movieTitle } }, "Movie.Jsonl");
            }
        }           
    }
}
Public Class MovieScraper
	Inherits WebScraper

	Public Overrides Sub Init()
		License.LicenseKey = "LicenseKey"
		Me.LoggingLevel = WebScraper.LogLevel.All
		Me.WorkingDirectory = AppSetting.GetAppRoot() & "\MovieSample\Output\"
		Me.Request("www.website.com", AddressOf Parse)
	End Sub

	Public Overrides Sub Parse(ByVal response As Response)
		For Each div In response.Css("#movie-featured > div")
			If div.GetAttribute("class") <> "clearfix" Then
				Dim movieId = div.GetAttribute("data-movie-id")
				Dim link = div.Css("a")(0)
				Dim movieTitle = link.TextContentClean
				Scrape(New ScrapedData() From {
					{ "MovieId", movieId },
					{ "MovieTitle", movieTitle }
				},
				"Movie.Jsonl")
			End If
		Next div
	End Sub
End Class
$vbLabelText   $csharpLabel

Cours de cinéma structuré

Pour stocker nos données formatées, implémentons une classe film :

public class Movie
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string URL { get; set; }
}
public class Movie
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string URL { get; set; }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Maintenant, mettez à jour notre code pour utiliser la classe Movie :

public class MovieScraper : WebScraper
{
    public override void Init()
    {
        License.LicenseKey = "LicenseKey";
        this.LoggingLevel = WebScraper.LogLevel.All;
        this.WorkingDirectory = AppSetting.GetAppRoot() + @"\MovieSample\Output\";
        this.Request("https://website.com/", Parse);
    }

    public override void Parse(Response response)
    {
        foreach (var div in response.Css("#movie-featured > div"))
        {
            if (div.GetAttribute("class") != "clearfix")
            {
                var movie = new Movie
                {
                    Id = Convert.ToInt32(div.GetAttribute("data-movie-id")),
                    Title = div.Css("a")[0].TextContentClean,
                    URL = div.Css("a")[0].Attributes["href"]
                };
                Scrape(movie, "Movie.Jsonl");
            }
        }
    }
}
public class MovieScraper : WebScraper
{
    public override void Init()
    {
        License.LicenseKey = "LicenseKey";
        this.LoggingLevel = WebScraper.LogLevel.All;
        this.WorkingDirectory = AppSetting.GetAppRoot() + @"\MovieSample\Output\";
        this.Request("https://website.com/", Parse);
    }

    public override void Parse(Response response)
    {
        foreach (var div in response.Css("#movie-featured > div"))
        {
            if (div.GetAttribute("class") != "clearfix")
            {
                var movie = new Movie
                {
                    Id = Convert.ToInt32(div.GetAttribute("data-movie-id")),
                    Title = div.Css("a")[0].TextContentClean,
                    URL = div.Css("a")[0].Attributes["href"]
                };
                Scrape(movie, "Movie.Jsonl");
            }
        }
    }
}
Public Class MovieScraper
	Inherits WebScraper

	Public Overrides Sub Init()
		License.LicenseKey = "LicenseKey"
		Me.LoggingLevel = WebScraper.LogLevel.All
		Me.WorkingDirectory = AppSetting.GetAppRoot() & "\MovieSample\Output\"
		Me.Request("https://website.com/", AddressOf Parse)
	End Sub

	Public Overrides Sub Parse(ByVal response As Response)
		For Each div In response.Css("#movie-featured > div")
			If div.GetAttribute("class") <> "clearfix" Then
				Dim movie As New Movie With {
					.Id = Convert.ToInt32(div.GetAttribute("data-movie-id")),
					.Title = div.Css("a")(0).TextContentClean,
					.URL = div.Css("a")(0).Attributes("href")
				}
				Scrape(movie, "Movie.Jsonl")
			End If
		Next div
	End Sub
End Class
$vbLabelText   $csharpLabel

Extraction de données détaillée de pages

Élargissons notre classe Cinéma pour y inclure de nouvelles propriétés permettant d'obtenir des informations détaillées :

public class Movie
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string URL { get; set; }
    public string Description { get; set; }
    public List<string> Genre { get; set; }
    public List<string> Actor { get; set; }
}
public class Movie
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string URL { get; set; }
    public string Description { get; set; }
    public List<string> Genre { get; set; }
    public List<string> Actor { get; set; }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Accédez ensuite à la page détaillée pour extraire les données, en utilisant les fonctionnalités étendues d'IronWebScraper :

public class MovieScraper : WebScraper
{
    public override void Init()
    {
        License.LicenseKey = "LicenseKey";
        this.LoggingLevel = WebScraper.LogLevel.All;
        this.WorkingDirectory = AppSetting.GetAppRoot() + @"\MovieSample\Output\";
        this.Request("https://domain/", Parse);
    }

    public override void Parse(Response response)
    {
        foreach (var div in response.Css("#movie-featured > div"))
        {
            if (div.GetAttribute("class") != "clearfix")
            {
                var movie = new Movie
                {
                    Id = Convert.ToInt32(div.GetAttribute("data-movie-id")),
                    Title = div.Css("a")[0].TextContentClean,
                    URL = div.Css("a")[0].Attributes["href"]
                };
                this.Request(movie.URL, ParseDetails, new MetaData() { { "movie", movie } });
            }
        }           
    }

    public void ParseDetails(Response response)
    {
        var movie = response.MetaData.Get<Movie>("movie");
        var div = response.Css("div.mvic-desc")[0];
        movie.Description = div.Css("div.desc")[0].TextContentClean;
        movie.Genre = div.Css("div > p > a").Select(element => element.TextContentClean).ToList();
        movie.Actor = div.Css("div > p:nth-child(2) > a").Select(element => element.TextContentClean).ToList();

        Scrape(movie, "Movie.Jsonl");
    }
}
public class MovieScraper : WebScraper
{
    public override void Init()
    {
        License.LicenseKey = "LicenseKey";
        this.LoggingLevel = WebScraper.LogLevel.All;
        this.WorkingDirectory = AppSetting.GetAppRoot() + @"\MovieSample\Output\";
        this.Request("https://domain/", Parse);
    }

    public override void Parse(Response response)
    {
        foreach (var div in response.Css("#movie-featured > div"))
        {
            if (div.GetAttribute("class") != "clearfix")
            {
                var movie = new Movie
                {
                    Id = Convert.ToInt32(div.GetAttribute("data-movie-id")),
                    Title = div.Css("a")[0].TextContentClean,
                    URL = div.Css("a")[0].Attributes["href"]
                };
                this.Request(movie.URL, ParseDetails, new MetaData() { { "movie", movie } });
            }
        }           
    }

    public void ParseDetails(Response response)
    {
        var movie = response.MetaData.Get<Movie>("movie");
        var div = response.Css("div.mvic-desc")[0];
        movie.Description = div.Css("div.desc")[0].TextContentClean;
        movie.Genre = div.Css("div > p > a").Select(element => element.TextContentClean).ToList();
        movie.Actor = div.Css("div > p:nth-child(2) > a").Select(element => element.TextContentClean).ToList();

        Scrape(movie, "Movie.Jsonl");
    }
}
Public Class MovieScraper
	Inherits WebScraper

	Public Overrides Sub Init()
		License.LicenseKey = "LicenseKey"
		Me.LoggingLevel = WebScraper.LogLevel.All
		Me.WorkingDirectory = AppSetting.GetAppRoot() & "\MovieSample\Output\"
		Me.Request("https://domain/", AddressOf Parse)
	End Sub

	Public Overrides Sub Parse(ByVal response As Response)
		For Each div In response.Css("#movie-featured > div")
			If div.GetAttribute("class") <> "clearfix" Then
				Dim movie As New Movie With {
					.Id = Convert.ToInt32(div.GetAttribute("data-movie-id")),
					.Title = div.Css("a")(0).TextContentClean,
					.URL = div.Css("a")(0).Attributes("href")
				}
				Me.Request(movie.URL, AddressOf ParseDetails, New MetaData() From {
					{ "movie", movie }
				})
			End If
		Next div
	End Sub

	Public Sub ParseDetails(ByVal response As Response)
		Dim movie = response.MetaData.Get(Of Movie)("movie")
		Dim div = response.Css("div.mvic-desc")(0)
		movie.Description = div.Css("div.desc")(0).TextContentClean
		movie.Genre = div.Css("div > p > a").Select(Function(element) element.TextContentClean).ToList()
		movie.Actor = div.Css("div > p:nth-child(2) > a").Select(Function(element) element.TextContentClean).ToList()

		Scrape(movie, "Movie.Jsonl")
	End Sub
End Class
$vbLabelText   $csharpLabel

Fonctionnalités de la bibliothèque IronWebScraper

Fonctionnalité HttpIdentity

Certains systèmes exigent que l'utilisateur soit connecté pour consulter le contenu ; Utilisez HttpIdentity pour les informations d'identification :

HttpIdentity id = new HttpIdentity
{
    NetworkUsername = "username",
    NetworkPassword = "pwd"
};
Identities.Add(id);
HttpIdentity id = new HttpIdentity
{
    NetworkUsername = "username",
    NetworkPassword = "pwd"
};
Identities.Add(id);
Dim id As New HttpIdentity With {
	.NetworkUsername = "username",
	.NetworkPassword = "pwd"
}
Identities.Add(id)
$vbLabelText   $csharpLabel

Activer le cache Web

Les pages demandées en cache sont réutilisées pendant le développement :

public override void Init()
{
    License.LicenseKey = "LicenseKey";
    this.LoggingLevel = WebScraper.LogLevel.All;
    this.WorkingDirectory = AppSetting.GetAppRoot() + @"\ShoppingSiteSample\Output\";
    EnableWebCache();
    this.Request("http://www.WebSite.com", Parse);
}
public override void Init()
{
    License.LicenseKey = "LicenseKey";
    this.LoggingLevel = WebScraper.LogLevel.All;
    this.WorkingDirectory = AppSetting.GetAppRoot() + @"\ShoppingSiteSample\Output\";
    EnableWebCache();
    this.Request("http://www.WebSite.com", Parse);
}
Public Overrides Sub Init()
	License.LicenseKey = "LicenseKey"
	Me.LoggingLevel = WebScraper.LogLevel.All
	Me.WorkingDirectory = AppSetting.GetAppRoot() & "\ShoppingSiteSample\Output\"
	EnableWebCache()
	Me.Request("http://www.WebSite.com", Parse)
End Sub
$vbLabelText   $csharpLabel

Étranglement

Contrôler le nombre de connexions et la vitesse :

public override void Init()
{
    License.LicenseKey = "LicenseKey";
    this.LoggingLevel = WebScraper.LogLevel.All;
    this.WorkingDirectory = AppSetting.GetAppRoot() + @"\ShoppingSiteSample\Output\";
    this.MaxHttpConnectionLimit = 80;
    this.RateLimitPerHost = TimeSpan.FromMilliseconds(50);
    this.OpenConnectionLimitPerHost = 25;
    this.ObeyRobotsDotTxt = false;
    this.ThrottleMode = Throttle.ByDomainHostName;
    this.Request("https://www.Website.com", Parse);
}
public override void Init()
{
    License.LicenseKey = "LicenseKey";
    this.LoggingLevel = WebScraper.LogLevel.All;
    this.WorkingDirectory = AppSetting.GetAppRoot() + @"\ShoppingSiteSample\Output\";
    this.MaxHttpConnectionLimit = 80;
    this.RateLimitPerHost = TimeSpan.FromMilliseconds(50);
    this.OpenConnectionLimitPerHost = 25;
    this.ObeyRobotsDotTxt = false;
    this.ThrottleMode = Throttle.ByDomainHostName;
    this.Request("https://www.Website.com", Parse);
}
Public Overrides Sub Init()
	License.LicenseKey = "LicenseKey"
	Me.LoggingLevel = WebScraper.LogLevel.All
	Me.WorkingDirectory = AppSetting.GetAppRoot() & "\ShoppingSiteSample\Output\"
	Me.MaxHttpConnectionLimit = 80
	Me.RateLimitPerHost = TimeSpan.FromMilliseconds(50)
	Me.OpenConnectionLimitPerHost = 25
	Me.ObeyRobotsDotTxt = False
	Me.ThrottleMode = Throttle.ByDomainHostName
	Me.Request("https://www.Website.com", Parse)
End Sub
$vbLabelText   $csharpLabel

propriétés d'étranglement

  • MaxHttpConnectionLimit
    nombre total de requêtes HTTP ouvertes autorisées (threads)
  • RateLimitPerHost
    Délai ou pause minimale polie (en millisecondes) entre une requête adressée à un domaine ou une adresse IP donnée
  • OpenConnectionLimitPerHost
    nombre autorisé de requêtes HTTP simultanées (threads)
  • ThrottleMode
    Permet à WebSraper de limiter intelligemment les requêtes non seulement par nom d'hôte, mais aussi par adresse IP des serveurs hôtes. C'est une pratique courante dans le cas où plusieurs domaines extraits seraient hébergés sur la même machine.

Annexe

Comment créer une application Windows Forms ?

Utilisez Visual Studio 2013 ou une version ultérieure.

  1. Ouvrez Visual Studio. ! Entreprise 2015

  2. Fichier -> Nouveau -> Projet ! Créer un nouveau projet

  3. Choisissez Visual C# ou VB -> Windows -> Application Windows Forms. ! Créer une application Windows

Nom du projet : IronScraperSample Emplacement : Sélectionnez un emplacement sur votre disque.

Comment créer une application Web Forms ASP.NET ?

  1. Ouvrez Visual Studio. ! Entreprise 2015

  2. Fichier -> Nouveau -> Projet ! Créer un nouveau projet

  3. Choisissez Visual C# ou VB -> Web -> Application Web ASP.NET (.NET Framework). ! Application Web ASP.NET

Nom du projet : IronScraperSample Emplacement : Sélectionnez un emplacement sur votre disque.

  1. Dans vos modèles ASP.NET, sélectionnez un modèle vide et cochez la case Formulaires Web. ! Modèles ASP.NET

  2. Votre projet de formulaire Web ASP.NET de base est créé. Projet de formulaire Web ASP.NET

Téléchargez ici le code source complet du projet d'exemple du tutoriel .

Questions Fréquemment Posées

Comment extraire des données de sites Web en C# ?

Vous pouvez utiliser IronWebScraper pour extraire des données de sites Web en C#. Commencez par installer la bibliothèque via NuGet et configurez une application console de base pour commencer à extraire efficacement les données Web.

Quelles sont les conditions préalables pour le scraping Web en C# ?

Pour effectuer du scraping Web en C#, vous devez avoir des compétences de base en programmation en C# ou VB.NET, comprendre les technologies Web telles que HTML, JavaScript et CSS, ainsi qu'une familiarité avec le DOM, XPath et les sélecteurs CSS.

Comment puis-je installer une bibliothèque de scraping Web dans un projet .NET ?

Pour installer IronWebScraper dans un projet .NET, utilisez la console du gestionnaire de packages NuGet avec la commande Install-Package IronWebScraper ou naviguez à travers l'interface du gestionnaire de packages NuGet dans Visual Studio.

Comment puis-je implémenter la limitation des requêtes dans mon scraper Web ?

IronWebScraper vous permet d'implémenter la limitation des requêtes pour gérer la fréquence des requêtes envoyées à un serveur. Cela peut être configuré en utilisant des paramètres tels que MaxHttpConnectionLimit, RateLimitPerHost et OpenConnectionLimitPerHost.

Quel est le but d'activer la mise en cache Web dans le scraping Web ?

L'activation de la mise en cache Web dans le scraping Web aide à réduire le nombre de requêtes envoyées à un serveur en stockant et réutilisant les réponses précédentes. Cela peut être configuré dans IronWebScraper en utilisant la méthode EnableWebCache.

Comment l'authentification peut-elle être gérée dans le scraping Web ?

Avec IronWebScraper, vous pouvez utiliser HttpIdentity pour gérer l'authentification, permettant l'accès au contenu derrière les formulaires d'identification ou les zones restreintes, autorisant ainsi le scraping de ressources protégées.

Quel est un exemple simple de scraper Web en C# ?

Le 'HelloScraper' est un exemple simple fourni dans le tutoriel. Il démontre la configuration d'un scraper Web de base en utilisant IronWebScraper, y compris comment initier des requêtes et analyser les réponses.

Comment puis-je étendre mon scraper Web pour gérer des structures de pages complexes ?

En utilisant IronWebScraper, vous pouvez étendre votre scraper pour gérer des structures de pages complexes en personnalisant les méthodes Parse pour traiter différents types de pages, permettant des stratégies d'extraction de données flexibles.

Quels sont les avantages d'utiliser une bibliothèque de scraping Web ?

Utiliser une bibliothèque de scraping Web telle qu'IronWebScraper offre des avantages tels que l'extraction de données simplifiée, la gestion de domaine, la limitation des requêtes, la mise en cache, et le support de l'authentification, permettant de gérer efficacement les tâches de scraping Web.

Darrius Serrant
Ingénieur logiciel Full Stack (WebOps)

Darrius Serrant est titulaire d'un baccalauréat en informatique de l'université de Miami et travaille comme ingénieur marketing WebOps Full Stack chez Iron Software. Attiré par le codage dès son plus jeune âge, il a vu l'informatique comme à la fois mystérieuse et accessible, en faisant le ...

Lire la suite
Prêt à commencer?
Nuget Téléchargements 125,527 | Version: 2025.11 vient de sortir