Comment faire du Web Scraping en C# avec IronWebScraper
IronWebscraper est une bibliothèque .NET pour le web scraping, l'extraction de données web et l'analyse de contenu web. Ce scraper web facile à utiliser peut être ajouté 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.
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).

Compétences requises
- Les bases de la programmation avec des compétences utilisant l'un des langages de programmation de Microsoft tels que C# ou VB.NET
- Compréhension de base des technologies Web (HTML, JavaScript, JQuery, CSS, etc.) et de leur fonctionnement
- Connaissances de base du DOM, de XPath, du HTML et des sélecteurs CSS
Outils
- Microsoft Visual Studio 2010 ou supérieur
- Extensions pour développeurs web destinées aux navigateurs, telles que l'inspecteur web pour Chrome ou Firebug pour Firefox.
Pourquoi faire du Web Scraping ? (Raisons et concepts)
Si vous souhaitez créer un produit ou une solution capable de :
- Extraire les données d'un site web
- Comparer le contenu, les prix, les caractéristiques, etc. de plusieurs sites web
- 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
- À l'aide de la souris -> clic droit sur le nom du projet -> Sélectionner gérer le package NuGet
- Depuis l'onglet Parcourir -> rechercher IronWebscraper -> Installer
- Cliquez sur Ok
- Et c'est terminé.
Utilisation de la console de packages NuGet
- Depuis les outils -> NuGet Package Manager -> Console du Package Manager
- Choisissez le projet de bibliothèque de classes comme projet par défaut
- Exécuter la commande ->
Install-Package IronWebScraper
Installation manuelle
- Aller à https://ironsoftware.com
- Cliquez sur IronWebScraper ou visitez sa page directement à l'aide de l'URL https://ironsoftware.com/csharp/webscraper/
- Cliquez sur Télécharger la DLL.
- Extraire le fichier compressé téléchargé
-
Dans Visual Studio, faites un clic droit sur le projet -> ajouter -> référence -> parcourir

-
Accédez au dossier extrait ->
netstandard2.0-> et sélectionnez tous les fichiers.dll
- 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
- Créez un dossier et nommez-le "HelloScraperSample"
-
Ajoutez ensuite une nouvelle classe et nommez-la "HelloScraper"

-
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 -
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 - Le résultat sera enregistré dans un fichier au format
WebScraper.WorkingDirectory/classname.Json

Aperçu du code
Scrape.Start() déclenche la logique de récupération comme suit :
- Appelle la méthode
Init()pour initialiser les variables, extraire les propriétés et les attributs de comportement. - Définit la requête de page de démarrage dans
Init()avecRequest("https://blog.scrapinghub.com", Parse). - Gère plusieurs requêtes HTTP et threads en parallèle, maintenant le code synchrone et facilitant le débogage.
- La méthode
Parse()est déclenchée aprèsInit()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é avec la méthode d'installation manuelle (IronWebScraper Documentation.chm File), ou vous pouvez consulter la documentation en ligne pour 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
| Propriétés et fonctions | Taper | Description du projet |
|---|---|---|
Init () |
Méthode | Utilisé pour mettre en place le scraper |
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("*.zip", "*.exe", "*.gz", "*.pdf"); Prend en charge les caractères génériques et les expressions régulières. |
ObeyRobotsDotTxt |
booléen | Utilisé pour activer ou désactiver la lecture et le suivi des directives dans robots.txt. |
ObeyRobotsDotTxtForHost (string Host) |
Méthode | Utilisé pour activer ou désactiver la lecture et le suivi des directives dans 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 un exemple dans lequel nous récupérons un site web de films.
Ajoutez une nouvelle classe et nommez-la 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>
Comme nous pouvons le constater, nous avons un identifiant de film, un titre et un lien vers une page détaillée. Commençons à rechercher 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
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; }
}
Public Class Movie
Public Property Id As Integer
Public Property Title As String
Public Property URL As String
End Class
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
Extraction de données détaillée de pages
Étendons notre classe Movie pour qu'elle ait de nouvelles propriétés pour les 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; }
}
Public Class Movie
Public Property Id As Integer
Public Property Title As String
Public Property URL As String
Public Property Description As String
Public Property Genre As List(Of String)
Public Property Actor As List(Of String)
End Class
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
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 identifiants :
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)
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
É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
propriétés d'étranglement
MaxHttpConnectionLimit
nombre total de requêtes HTTP ouvertes autorisées (threads)RateLimitPerHost
délai minimal poli (pause) entre les requêtes adressées à un domaine ou une adresse IP donnésOpenConnectionLimitPerHost
Nombre autorisé de requêtes HTTP simultanées (threads) par nom d'hôte ou adresse IPThrottleMode
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.
- Ouvrez Visual Studio.
-
Fichier -> Nouveau -> Projet

- Choisissez Visual C# ou VB -> Windows -> Application Windows Forms.

Nom du projet : IronScraperSample Emplacement : Sélectionnez un emplacement sur votre disque.
Comment créer une application Web Forms ASP.NET ?
-
Ouvrez Visual Studio.

-
Fichier -> Nouveau -> Projet

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

Nom du projet : IronScraperSample Emplacement : Sélectionnez un emplacement sur votre disque.
-
Dans vos modèles ASP.NET, sélectionnez un modèle vide et cochez la case Formulaires Web.

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

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.

