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, Web-Datenextraktion und Web-Content-Parsing. Es ist eine benutzerfreundliche Bibliothek, die zu Microsoft Visual Studio-Projekten für die Verwendung in der Entwicklung und Produktion hinzugefügt werden kann.

IronWebScraper bietet viele einzigartige Funktionen und Fähigkeiten, wie z. B. die Steuerung erlaubter und verbotener Seiten, Objekte, Medien usw. Es ermöglicht auch die Verwaltung mehrerer Identitäten, Webcache und viele weitere Funktionen, die wir in diesem Tutorial behandeln werden.

Fangen Sie mit IronWebScraper an

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 der Programmierung mit Kenntnissen 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? (Reasons and Concepts)

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, dann ist IronWebScraper eine großartige Bibliothek, die Ihren Anforderungen entspricht.

Wie installiert man IronWebScraper?

Nachdem Sie Create a New Project (siehe Anhang A) ausgeführt haben, können Sie die IronWebScraper-Bibliothek zu Ihrem Projekt hinzufügen, indem Sie die Bibliothek automatisch mit NuGet einfügen oder die DLL manuell installieren.

Installation über NuGet

Um die IronWebScraper-Bibliothek zu unserem Projekt hinzuzufügen, können wir dies über die visuelle Oberfläche (NuGet-Paket-Manager) 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
  2. Im Durchsuchungs-Tab -> suchen Sie nach IronWebScraper -> Installieren
  3. Klicken Sie auf OK
  4. Und wir sind fertig

Verwendung der NuGet-Paketkonsole

  1. Von Tools -> NuGet-Paket-Manager -> Paket-Manager-Konsole
  2. Wählen Sie Klassenbibliotheksprojekt als Standardprojekt
  3. Befehl ausführen -> Install-Package IronWebScraper

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 Download DLL.
  4. Entpacken Sie die heruntergeladene komprimierte Datei
  5. In Visual Studio Rechtsklick auf Projekt -> Referenz hinzufügen -> durchsuchen

    IronWebScraper mit DLL hinzufügen

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

    IronWebScraper mit DLL 2 hinzufügen

  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 Code-Schnipsel 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 Scrape zu starten, fügen Sie diesen Code-Schnipsel 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, Scrape-Eigenschaften und Verhaltensattribute zu initiieren.
  2. Setzt die Startseitenanfrage 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 finden Sie in der Zip-Datei, die bei der manuellen Installationsmethode (IronWebScraper Documentation.chm File) heruntergeladen wurde, oder Sie können die Online-Dokumentation für das neueste Update der Bibliothek unter https://ironsoftware.com/csharp/webscraper/object-reference/ einsehen.

Um mit der Verwendung von IronWebScraper in Ihrem Projekt zu beginnen, müssen Sie von der IronWebScraper.WebScraper-Klasse erben, die Ihre Klassenbibliothek erweitert und ihr Scraping-Funktionalität hinzufügt. Außerdem 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 Zum Einrichten des Scrapers verwendet
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 6. Zum Verbot/Erlauben von URLs/Domains. Bsp.: BannedUrls.Add("*.zip", "*.exe", "*.gz", "*.pdf"); Unterstützt Platzhalter und reguläre Ausdrücke.
ObeyRobotsDotTxt Boolesch Wird verwendet, um das Lesen und Befolgen der Anweisungen in robots.txt zu aktivieren oder zu deaktivieren.
ObeyRobotsDotTxtForHost (string Host) Methode Wird verwendet, um das Lesen und Befolgen der Anweisungen 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. Beginnen wir mit dem Scrapen dieser Daten:

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; }
}
Public Class Movie
    Public Property Id As Integer
    Public Property Title As String
    Public Property URL As String
End Class
$vbLabelText   $csharpLabel

Aktualisieren Sie jetzt unseren Code, um die Movie-Klasse zu verwenden:

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

Lassen Sie uns unsere Movie-Klasse erweitern, um neue Eigenschaften für die detaillierten Informationen zu haben:

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
$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 Anmeldeinformationen:

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

Kontrollieren Sie die Verbindungszahlen und die Geschwindigkeit:

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

Drosselungseigenschaften

  • MaxHttpConnectionLimit
    Gesamtanzahl der zulässigen offenen HTTP-Anfragen (Threads)
  • RateLimitPerHost
    Minimale höfliche Verzögerung (Pause) zwischen Anfragen an eine gegebene Domain oder IP-Adresse
  • OpenConnectionLimitPerHost
    Zulässige Anzahl gleichzeitiger HTTP-Anfragen (Threads) pro Hostname oder IP-Adresse
  • ThrottleMode
    Macht den WebScraper intelligent gedrosselte Anfragen nicht nur nach Hostname, sondern auch nach IP-Adressen der Hostserver. 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.
  2. Datei -> Neu -> Projekt Enterprise 2015

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

Project Name: 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

Project Name: 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 Webformular-Projekt

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

Häufig gestellte Fragen

Wie kann man Daten von Websites in C# scrapen?

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.

Darrius Serrant
Full-Stack-Software-Ingenieur (WebOps)

Darrius Serrant hat einen Bachelor-Abschluss in Informatik von der University of Miami und arbeitet als Full-Stack-WebOps-Marketing-Ingenieur bei Iron Software. Seit seiner Jugend vom Programmieren angezogen, sah er die Informatik als sowohl mysteriös als auch zugänglich, was es zum perfekten Medium für Kreativität und Problemlösung ...

Weiterlesen
Bereit anzufangen?
Nuget Downloads 140,761 | Version: 2026.7 gerade veröffentlicht
Still Scrolling Icon

Scrollst du immer noch?

Sie brauchen schnell einen Beweis? PM > Install-Package IronWebScraper
Führen Sie ein Beispiel aus und beobachten Sie, wie Ihre Zielsite zu strukturierten Daten wird.