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, die Extraktion von Webdaten und das Parsen von Webinhalten. Es handelt sich um eine benutzerfreundliche Bibliothek, die zu Microsoft Visual Studio-Projekten hinzugefügt und in der Entwicklung und Produktion eingesetzt werden kann.

IronWebscraper verfügt über zahlreiche einzigartige Funktionen und Möglichkeiten, wie beispielsweise die Steuerung zulässiger und unzulässiger Seiten, Objekte, Medien usw. Es ermöglicht zudem die Verwaltung mehrerer Identitäten, eines Web-Caches und vieler weiterer 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-Funktionen (Websites-Scraping, Erfassung und Extraktion von Website-Daten, Parsen von Website-Inhalten, Web Harvesting) entwickeln und implementieren möchten.

Webscraping-Bild

Erforderliche Fähigkeiten

  1. Grundlegende Programmierkenntnisse mit Erfahrung 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 in DOM, XPath, HTML und CSS-Selektoren

Tools

  1. Microsoft Visual Studio 2010 oder höher
  2. Erweiterungen für Webentwickler für Browser wie Web Inspector für Chrome oder Firebug für Firefox

Warum Web Scraping? (Reasons and Concepts)

Wenn Sie ein Produkt oder eine Lösung entwickeln möchten, die folgende Funktionen bietet:

  1. Website-Daten extrahieren
  2. Vergleichen Sie Inhalte, Preise, Funktionen usw. von mehreren Websites
  3. Scannen und Zwischenspeichern von Website-Inhalten

Wenn einer oder mehrere der oben genannten Gründe auf Sie zutreffen, ist IronWebscraper eine hervorragende 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 Bibliothek IronWebScraper zu Ihrem Projekt hinzufügen, indem Sie die Bibliothek automatisch über NuGet einbinden oder die DLL manuell installieren.

Installation über NuGet

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

Verwendung des NuGet Package Managers

  1. Mit der Maus -> Rechtsklick auf den Projektnamen -> "NuGet-Paket verwalten" auswählen
  2. Über die Registerkarte "Durchsuchen" -> Suche nach IronWebScraper -> Installieren
  3. Klicken Sie auf "OK"
  4. Und fertig

Verwendung der NuGet-Paketkonsole

  1. Über "Tools" -> "NuGet Package Manager" -> "Package Manager Console"
  2. Wählen Sie "Class Library Project" als Standardprojekt
  3. Befehl ausführen -> Install-Package IronWebScraper

Manuell installieren

  1. Gehen Sie zu </https:>
  2. Klicken Sie auf IronWebScraper oder besuchen Sie die Seite direkt über die URL https://ironsoftware.com/csharp/webscraper/
  3. Klicken Sie auf "DLL herunterladen".
  4. Entpacken Sie die heruntergeladene komprimierte Datei
  5. Klicken Sie in Visual Studio mit der rechten Maustaste auf das Projekt -> Hinzufügen -> Referenz -> Durchsuchen

    IronWebScraper über DLL hinzufügen

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

    IronWebscraper über DLL 2 hinzufügen

  7. Und fertig!

HelloScraper – Unser erstes IronWebscraper-Beispiel

Wie üblich beginnen wir mit der Implementierung der Hello Scraper App, um unsere ersten Schritte using 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 anschließend eine neue Klasse hinzu und nennen Sie sie HelloScraper HelloScraper Add Class

  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 im Format WebScraper.WorkingDirectory/classname.Json gespeichert. HelloScraper-Ergebnis

Code-Übersicht

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

  1. Ruft die Methode Init() auf, um Variablen zu initialisieren, Eigenschaften zu extrahieren und Verhaltensattribute zu erfassen.
  2. Legt die Startseitenanforderung in Init() mit Request("https://blog.scrapinghub.com", Parse) fest.
  3. Verarbeitet mehrere HTTP-Anfragen und Threads parallel, wodurch der Code synchron bleibt und sich leichter debuggen lässt.
  4. Die Methode Parse() wird nach Init() ausgelöst, um die Antwort zu verarbeiten, Daten mithilfe von CSS-Selektoren zu extrahieren und im JSON-Format zu speichern.

Funktionen und Optionen der IronWebscraper-Bibliothek

https://ironsoftware.com/csharp/webscraper/object-reference/Die aktualisierte Dokumentation finden Sie in der ZIP-Datei, die Sie mit der manuellen Installationsmethode (IronWebScraper Documentation.chm File) heruntergeladen haben, oder Sie können die Online-Dokumentation für das neueste Update der Bibliothek unter Link einsehen.

Um IronWebScraper in Ihrem Projekt zu verwenden, müssen Sie von der Klasse IronWebScraper.WebScraper erben, die Ihre Klassenbibliothek erweitert und ihr Scraping-Funktionalität hinzufügt. Außerdem müssen Sie die Methoden Init() und Parse(Response response) 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 () Vorgehensweise Wird zum Einrichten des Scrapers verwendet
Parse (Response response) Vorgehensweise Wird verwendet, um die Logik zu implementieren, die der Scraper verwendet, und festzulegen, wie er diese verarbeitet. Es können mehrere Methoden für unterschiedliche Seitenverhalten oder -strukturen implementiert werden.
BannedUrls, AllowedUrls, BannedDomains Sammlungen Wird verwendet, um URLs und/oder Domains zu sperren oder zuzulassen. Beispiel: BannedUrls.Add("*.zip", "*.exe", "*.gz", "*.pdf"); Unterstützt Platzhalter und reguläre Ausdrücke.
ObeyRobotsDotTxt Boolesche Wird verwendet, um das Lesen und Befolgen der Anweisungen in robots.txt zu aktivieren oder zu deaktivieren.
ObeyRobotsDotTxtForHost (string Host) Vorgehensweise Wird verwendet, um das Lesen und Befolgen der Anweisungen in robots.txt für eine bestimmte Domain zu aktivieren oder zu deaktivieren.
Scrape, ScrapeUnique Vorgehensweise
ThrottleMode Aufzählung Enum-Optionen: ByIpAddress, ByDomainHostName. Ermöglicht eine intelligente Drosselung von Anfragen unter Berücksichtigung von Host-IP-Adressen oder Domain-Hostnamen.
EnableWebCache, EnableWebCache (TimeSpan cacheDuration) Vorgehensweise Aktiviert das Caching für Webanfragen.
MaxHttpConnectionLimit Int Legt die Gesamtzahl der zulässigen 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 zulässige Anzahl gleichzeitiger HTTP-Anfragen (Threads) pro Hostname oder IP-Adresse fest.
WorkingDirectory string Legt einen Arbeitsverzeichnispfad zum Speichern von Daten fest.

Beispiele aus der Praxis und Übungen

Scraping einer Online-Filmwebsite

Lassen Sie uns ein Beispiel erstellen, in 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 Ausschnitt aus dem HTML-Code der Startseite, den 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 Movie-Klasse

Um unsere formatierten Daten zu speichern, implementieren wir eine Movie-Klasse:

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 nun unseren Code, um die Klasse Movie 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

Detailliertes Scraping von Seiten

Erweitern wir unsere Movie-Klasse 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; }
}
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 anschließend zur Detailseite, um diese mithilfe der erweiterten Funktionen 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

Funktionen der IronWebscraper-Bibliothek

HttpIdentity-Funktion

Bei einigen Systemen muss der Benutzer angemeldet sein, um Inhalte anzuzeigen; 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

Web-Cache aktivieren

Zwischenspeichern angeforderter Seiten zur Wiederverwendung während der Entwicklung:

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

Verbindungsanzahl und Geschwindigkeit steuern:

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
    Gesamtzahl der zulässigen offenen HTTP-Anfragen (Threads)
  • RateLimitPerHost
    Mindestverzögerung (Pause) zwischen Anfragen an eine bestimmte Domain oder IP-Adresse
  • OpenConnectionLimitPerHost
    zulässige Anzahl gleichzeitiger HTTP-Anfragen (Threads) pro Hostname oder IP-Adresse
  • ThrottleMode
    Bewirkt, dass der WEBSCRAPER Anfragen nicht nur nach Hostnamen, sondern auch nach den IP-Adressen der Host-Server intelligent drosselt. Dies ist eine vorsorgliche Maßnahme für den Fall, dass mehrere gescrapte Domains auf demselben Rechner gehostet werden.

Anhang

Wie erstellt man eine Windows-Formular-Anwendung?

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-Anwendung. Windows-App erstellen

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

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
Speicherort: Wählen Sie einen Speicherort auf Ihrer Festplatte aus.

  1. Wählen Sie in Ihren ASP.NET-Vorlagen eine leere Vorlage aus und aktivieren Sie "Web Forms". ASP .NET-Vorlagen

  2. Ihr grundlegendes ASP.NET-Webformularprojekt wurde erstellt. ASP .NET-Webformular-Projekt

Laden Sie hier den vollständigen Code des Tutorial-Beispielprojekts 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.

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 137,906 | Version: 2026.6 just released
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.