How to Scrape Data from Websites in C#

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

IronWebscraper ist eine .NET-Bibliothek für Web Scraping, Webdatenerfassung und Webinhaltsparsing. Es ist eine einfach zu nutzende Bibliothek, die zu Microsoft Visual Studio-Projekten hinzugefügt werden kann, um sie in der Entwicklung und Produktion zu nutzen.

IronWebscraper bietet viele einzigartige Funktionen und Fähigkeiten wie die Kontrolle über erlaubte und verbotene Seiten, Objekte, Medien usw. Es ermöglicht auch das Management mehrerer Identitäten, Webcache und viele andere Funktionen, die wir in diesem Tutorial behandeln werden.

Erste Schritte mit IronWebscraper

Nutzen Sie IronWebScraper heute kostenlos in Ihrem Projekt.

Erster Schritt:
green arrow pointer


Zielgruppe

Dieses Tutorial richtet sich an Softwareentwickler mit grundlegenden oder fortgeschrittenen Programmierkenntnissen, die Lösungen für erweiterte Scraping-Fähigkeiten (Webseiten-Scraping, Website-Datenerfassung und -extraktion, Webseiten-Inhaltsparsing, Web-Harvesting) entwickeln und implementieren möchten.

Webscraping Bild

Erforderliche Fähigkeiten

  1. Grundlegende Grundlagen des Programmierens mit Fähigkeiten in einer der Microsoft-Programmiersprachen wie C# oder VB.NET
  2. Grundlegendes Verständnis von Webtechnologien (HTML, JavaScript, JQuery, CSS usw.) und deren Funktionsweise
  3. Grundkenntnisse von DOM, XPath, HTML und CSS-Selektoren

Tools

  1. Microsoft Visual Studio 2010 oder neuer
  2. Webentwickler-Erweiterungen für Browser wie Webinspektor für Chrome oder Firebug für Firefox

Warum Scrapen? (Gründe und Konzepte)

Wenn Sie ein Produkt oder eine Lösung entwickeln möchten, die die Fähigkeit hat:

  1. Website-Daten zu extrahieren
  2. Inhalte, Preise, Funktionen usw. von mehreren Websites zu vergleichen
  3. Webseiteninhalte zu scannen und zu cachen

Wenn Sie einen oder mehrere der oben genannten Gründe haben, ist IronWebscraper eine großartige Bibliothek, die Ihren Bedürfnissen entspricht.

Wie installiert man IronWebScraper?

Nachdem Sie ein neues Projekt erstellt haben (siehe Anhang A), können Sie die IronWebScraper-Bibliothek zu Ihrem Projekt hinzufügen, indem Sie die Bibliothek automatisch über NuGet einfügen oder die DLL manuell installieren.

Installation über NuGet

Um die IronWebScraper-Bibliothek mit NuGet zu unserem Projekt hinzuzufügen, können wir dies über die visuelle Oberfläche (NuGet-Paketmanager) oder per Befehl über die Paket-Manager-Konsole tun.

Verwendung des NuGet-Paketmanagers

  1. Mit der Maus -> Rechtsklick auf den Projektnamen -> Auswahl von NuGet-Pakete verwalten Hinzufügen von IronWebscraper über GUI

  2. Aus dem Suchtabulator -> Nach IronWebScraper suchen -> Installieren Hinzufügen von IronWebscraper über GUI 2

  3. Klicken Sie auf OK Hinzufügen von IronWebscraper über GUI 3

  4. Und wir sind fertig Hinzufügen von IronWebscraper über GUI 4

Verwendung der NuGet-Paketkonsole

  1. Von Tools -> NuGet-Paket-Manager -> Paket-Manager-Konsole Hinzufügen von IronWebscraper über Konsole

  2. Wählen Sie Klassenbibliotheksprojekt als Standardprojekt
  3. Befehl ausführen -> Install-Package IronWebScraper Hinzufügen von IronWebscraper über Konsole 1

Manuelle Installation

  1. Gehen Sie zu https://ironsoftware.com
  2. Klicken Sie auf IronWebScraper oder besuchen Sie direkt dessen Seite mit der URL https://ironsoftware.com/csharp/webscraper/
  3. Klicken Sie auf DLL herunterladen.
  4. Entpacken Sie die heruntergeladene komprimierte Datei
  5. In Visual Studio Rechtsklick auf Projekt -> Referenz hinzufügen -> durchsuchen

    Hinzufügen von IronWebscraper über DLL

  6. Gehen Sie zum extrahierten Ordner -> netstandard2.0 -> und wählen Sie alle .dll-Dateien aus

    Hinzufügen von IronWebscraper über DLL 2

  7. Und es ist fertig!

HelloScraper - Unser erstes IronWebscraper-Beispiel

Wie üblich beginnen wir mit der Implementierung der Hello Scraper App, um unseren ersten Schritt mit IronWebscraper zu machen.

  • Wir haben eine neue Konsolenanwendung mit dem Namen „IronWebScraperSample“ erstellt

Schritte zur Erstellung des IronWebScraper-Beispiels

  1. Erstellen Sie einen Ordner und nennen Sie ihn „HelloScraperSample“
  2. Fügen Sie dann eine neue Klasse hinzu und nennen Sie sie „HelloScraper“ HelloScraper Klasse hinzufügen

  3. Fügen Sie diesen Codeausschnitt zu HelloScraper hinzu

    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. Um zu beginnen, den Scrape hinzuzufügen, fügen Sie diesen Codeausschnitt zu Main hinzu

    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. Das Ergebnis wird in einer Datei mit dem Format WebScraper.WorkingDirectory/classname.Json gespeichert HelloScraper Ergebnis

Codeübersicht

Scrape.Start() löst die Scraping-Logik wie folgt aus:

  1. Ruft die Init()-Methode auf, um Variablen, Scraper-Eigenschaften und Verhaltensattribute zu initiieren.
  2. Setzt die Startseitierungsanfrage in Init() mit Request("https://blog.scrapinghub.com", Parse).
  3. Bearbeitet mehrere HTTP-Anfragen und Threads parallel, wodurch der Code synchron und leichter zu debuggen bleibt.
  4. Die Parse()-Methode wird nach Init() ausgelöst, um die Antwort zu bearbeiten, Daten mit CSS-Selektoren zu extrahieren und im JSON-Format zu speichern.

IronWebscraper Bibliotheksfunktionen und Optionen

Aktualisierte Dokumentation kann in der mit der manuellen Installationsmethode heruntergeladenen Zip-Datei gefunden werden (IronWebScraper Documentation.chm File), oder Sie können die Online-Dokumentation für das neueste Update der Bibliothek unter https://ironsoftware.com/csharp/webscraper/object-reference/ einsehen.

Um IronWebScraper in Ihrem Projekt zu nutzen, müssen Sie von der IronWebScraper.WebScraper-Klasse erben, die Ihrer Klassenbibliothek Scraping-Funktionen hinzufügt. Darüber hinaus müssen Sie die Init()- und Parse(Response response)-Methoden implementieren.

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
Eigenschaften \ Funktionen Typ Beschreibung
Init () Methode Wird verwendet, um den Scraper einzurichten
Parse (Response response) Methode Wird verwendet, um die Logik zu implementieren, die der Scraper verwenden wird, und wie er diese verarbeiten wird. Kann mehrere Methoden für unterschiedliche Seitenverhaltensweisen oder -strukturen implementieren.
BannedUrls, AllowedUrls, BannedDomains Sammlungen Werden verwendet, um URLs und/oder Domains zu verbieten/erlauben. Ex: BannedUrls.Add("*.zip", "*.exe", "*.gz", "*.pdf"); Unterstützt Platzhalter und reguläre Ausdrücke.
ObeyRobotsDotTxt Boolesch Wird verwendet, um das Lesen und Befolgen der Direktiven in robots.txt zu aktivieren oder zu deaktivieren.
ObeyRobotsDotTxtForHost (string Host) Methode Wird verwendet, um das Lesen und Befolgen der Direktiven in robots.txt für eine bestimmte Domain zu aktivieren oder zu deaktivieren.
Scrape, ScrapeUnique Methode
ThrottleMode Enumeration Enum Optionen: ByIpAddress, ByDomainHostName. Ermöglicht intelligentes Anfragendrosseln, respektvoll gegenüber den IP-Adressen oder Domain-Hostnamen des Hosts.
EnableWebCache, EnableWebCache (TimeSpan cacheDuration) Methode Ermöglicht das Cachen von Web-Anfragen.
MaxHttpConnectionLimit Int Legt die Gesamtanzahl der erlaubten offenen HTTP-Anfragen (Threads) fest.
RateLimitPerHost TimeSpan Legt die minimale Höflichkeitsverzögerung (Pause) zwischen Anfragen an eine bestimmte Domain oder IP-Adresse fest.
OpenConnectionLimitPerHost Int Legt die erlaubte Anzahl gleichzeitiger HTTP-Anfragen (Threads) pro Hostnamen oder IP-Adresse fest.
WorkingDirectory string Legt einen Arbeitsverzeichnis-Pfad zum Speichern von Daten fest.

Reale Beispiele und Praxis

Scraping einer Online-Film-Website

Lassen Sie uns ein Beispiel erstellen, bei dem wir eine Film-Website scrapen.

Fügen Sie eine neue Klasse hinzu und nennen Sie sie MovieScraper:

MovieScraper-Klasse hinzufügen

HTML-Struktur

Dies ist ein Teil des HTML der Startseite, die wir auf der Website sehen:

<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

Wie wir sehen können, haben wir eine Film-ID, einen Titel und einen Link zu einer Detailseite. Fangen wir an, diese Daten zu scrapen:

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

Strukturierte Filmklasse

Um unsere formatierten Daten zu halten, implementieren wir eine Filmklasse:

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

Jetzt aktualisieren wir unseren Code, um die Filmklasse zu nutzen:

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

Detailseite scrapen

Erweitern wir unsere Filmklasse um neue Eigenschaften für die detaillierten Informationen:

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

Navigieren Sie dann zur Detailseite, um sie mit erweiterten Fähigkeiten von IronWebscraper zu scrapen:

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

IronWebscraper Bibliotheksfeatures

HttpIdentity Funktion

Einige Systeme erfordern, dass der Benutzer eingeloggt ist, um Inhalte anzeigen zu können; Verwenden Sie HttpIdentity für Anmeldedaten:

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

Webcache aktivieren

Gespeicherte Seiten für die Wiederverwendung während der Entwicklung cachen:

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

Drosselung

Verbindungskonfigurationen und Geschwindigkeitsregelung:

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

Drosselung properties

  • MaxHttpConnectionLimit
    Gesamtanzahl der erlaubten offenen HTTP-Anfragen (Threads)
  • RateLimitPerHost
    Minimale Höflichkeitsverzögerung oder Pause (in Millisekunden) zwischen Anfragen an eine bestimmte Domain oder IP-Adresse
  • OpenConnectionLimitPerHost
    Erlaubte Anzahl gleichzeitiger HTTP-Anfragen (Threads)
  • ThrottleMode
    Lässt den Webscraper Anfragen nicht nur nach Hostnamen, sondern auch nach den IP-Adressen der Host-Server intelligent drosseln. Dies ist höflich, falls mehrere gescrapten Domains auf derselben Maschine gehostet werden.

Anhang

Wie erstellt man eine Windows-Formularanwendung?

Verwenden Sie Visual Studio 2013 oder höher.

  1. Öffnen Sie Visual Studio. Enterprise 2015

  2. Datei -> Neu -> Projekt Datei Neues Projekt

  3. Wählen Sie Visual C# oder VB -> Windows -> Windows Forms Application. Windows-App erstellen

Projektname: IronScraperSample Standort: Wählen Sie einen Standort auf Ihrer Festplatte.

Wie erstellt man eine ASP.NET Webformularanwendung?

  1. Öffnen Sie Visual Studio. Enterprise 2015

  2. Datei -> Neu -> Projekt Datei Neues Projekt

  3. Wählen Sie Visual C# oder VB -> Web -> ASP.NET Webanwendung (.NET Framework). ASP .Net Webanwendung

Projektname: IronScraperSample Standort: Wählen Sie einen Standort auf Ihrer Festplatte.

  1. Wählen Sie aus Ihren ASP.NET-Vorlagen eine leere Vorlage und aktivieren Sie Web Formulare. ASP .Net Vorlagen

  2. Ihr grundlegendes ASP.NET-Webformularprojekt wird erstellt. ASP .Net Webformularprojekt

Laden Sie den vollständigen Beispielcode des Tutorials hier herunter.

Häufig gestellte Fragen

Wie kann man Daten von Websites in C# scrapern?

Sie können IronWebScraper verwenden, um Daten von Websites in C# zu scrapern. Beginnen Sie mit der Installation der Bibliothek über NuGet und richten Sie eine einfache Konsolenanwendung ein, um effizient mit der Extraktion von Webdaten zu beginnen.

Was sind die Voraussetzungen für Web-Scraping in C#?

Um Web-Scraping in C# durchzuführen, sollten Sie grundlegende Programmierkenntnisse in C# oder VB.NET haben und Webtechnologien wie HTML, JavaScript und CSS verstehen, sowie mit DOM, XPath und CSS-Selektoren vertraut sein.

Wie kann ich eine Web-Scraping-Bibliothek in einem .NET-Projekt installieren?

Um IronWebScraper in einem .NET-Projekt zu installieren, verwenden Sie die NuGet-Paket-Manager-Konsole mit dem Befehl Install-Package IronWebScraper oder navigieren Sie über die NuGet-Paket-Manager-Oberfläche in Visual Studio.

Wie kann ich die Anforderungsdrosselung in meinem Web-Scraper implementieren?

IronWebScraper ermöglicht Ihnen die Implementierung der Anforderungsdrosselung, um die Häufigkeit der Anfragen an einen Server zu verwalten. Dies kann durch Einstellungen wie MaxHttpConnectionLimit, RateLimitPerHost und OpenConnectionLimitPerHost konfiguriert werden.

Was ist der Zweck der Aktivierung des Web-Caches beim Web-Scraping?

Die Aktivierung des Web-Caches beim Web-Scraping hilft dabei, die Anzahl der an einen Server gesendeten Anfragen zu reduzieren, indem vorherige Antworten gespeichert und wiederverwendet werden. Dies kann in IronWebScraper durch die Verwendung der Methode EnableWebCache eingerichtet werden.

Wie kann die Authentifizierung beim Web-Scraping gehandhabt werden?

Mit IronWebScraper können Sie HttpIdentity verwenden, um die Authentifizierung zu verwalten, wodurch der Zugriff auf Inhalte hinter Login-Formularen oder eingeschränkten Bereichen ermöglicht wird, um das Scraping geschützter Ressourcen zu ermöglichen.

Was ist ein einfaches Beispiel für einen Web-Scraper in C#?

Der 'HelloScraper' ist ein einfaches Beispiel im Tutorial. Er demonstriert das Einrichten eines grundlegenden Web-Scrapers mit IronWebScraper, einschließlich wie man Anfragen initiiert und Antworten parst.

Wie kann ich meinen Web-Scraper erweitern, um komplexe Seitenstrukturen zu handhaben?

Mit IronWebScraper können Sie Ihren Scraper erweitern, um komplexe Seitenstrukturen zu handhaben, indem Sie die Parse-Methoden anpassen, um verschiedene Seitentypen zu verarbeiten, was flexible Datenextraktionsstrategien ermöglicht.

Was sind die Vorteile der Verwendung einer Web-Scraping-Bibliothek?

Die Verwendung einer Web-Scraping-Bibliothek wie IronWebScraper bietet Vorteile wie optimierte Datenextraktion, Domainverwaltung, Anforderungsdrosselung, Caching und Unterstützung für Authentifizierung, was eine effiziente Handhabung von Web-Scraping-Aufgaben ermöglicht.

Curtis Chau
Technischer Autor

Curtis Chau hat einen Bachelor-Abschluss in Informatik von der Carleton University und ist spezialisiert auf Frontend-Entwicklung mit Expertise in Node.js, TypeScript, JavaScript und React. Leidenschaftlich widmet er sich der Erstellung intuitiver und ästhetisch ansprechender Benutzerschnittstellen und arbeitet gerne mit modernen Frameworks sowie der Erstellung gut strukturierter, optisch ansprechender ...

Weiterlesen
Bereit anzufangen?
Nuget Downloads 122,916 | Version: 2025.11 gerade veröffentlicht