Scraping einer Online-Filmwebsite mit C# und IronWebscraper

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

IronWebScraper extrahiert Filmdaten von Websites, indem es HTML-Elemente analysiert, typisierte Objekte für die Speicherung strukturierter Daten erstellt und mithilfe von Metadaten zwischen Seiten navigiert, um umfassende Datensätze mit Filminformationen aufzubauen. Diese C#-Web-Scraper-Bibliothek vereinfacht die Umwandlung unstrukturierter Webinhalte in organisierte, analysierbare Daten.

Schnellstart: Filme in C# scrapen

  1. Installieren Sie IronWebScraper über den NuGet Package Manager
  2. Erstellen Sie eine Klasse, die von `` erbt
  3. Überschreiben Sie ``, um die Lizenz festzulegen und die Ziel-URL abzufragen
  4. Überschreiben Sie ``, um Filmdaten mithilfe von CSS-Selektoren zu extrahieren
  5. Verwenden Sie die Methode ``, um Daten im JSON-Format zu speichern
  1. Installieren Sie IronWebScraper mit NuGet Package Manager

    PM > Install-Package IronWebScraper
  2. Kopieren Sie diesen Codeausschnitt und führen Sie ihn aus.

    using IronWebScraper;
    using System;
    
    public class QuickstartMovieScraper : WebScraper
    {
        public override void Init()
        {
            // Set your license key
            License.LicenseKey = "YOUR-LICENSE-KEY";
    
            // Configure scraper settings
            this.LoggingLevel = LogLevel.All;
            this.WorkingDirectory = @"C:\MovieData\Output\";
    
            // Start scraping from the homepage
            this.Request("https://example-movie-site.com", Parse);
        }
    
        public override void Parse(Response response)
        {
            // Extract movie titles using CSS selectors
            foreach (var movieDiv in response.Css(".movie-item"))
            {
                var title = movieDiv.Css("h2")[0].TextContentClean;
                var url = movieDiv.Css("a")[0].Attributes["href"];
    
                // Save the scraped data
                Scrape(new { Title = title, Url = url }, "movies.json");
            }
        }
    }
    
    // Run the scraper
    var scraper = new QuickstartMovieScraper();
    scraper.Start();
  3. Bereitstellen zum Testen in Ihrer Live-Umgebung

    Beginnen Sie noch heute, IronWebScraper in Ihrem Projekt zu verwenden, mit einer kostenlosen Testversion

    arrow pointer

Wie richte ich eine Movie-Scraper-Klasse ein?

Beginnen Sie mit einem Beispiel aus der Praxis. Wir werden eine Film-Website mithilfe der in unserem Tutorial "Webscraping in C#" beschriebenen Techniken scrapen.

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

Visual Studio-Dialogfeld

Das Erstellen einer speziellen Scraper-Klasse hilft dabei, Ihren Code zu organisieren und macht ihn wiederverwendbar. Dieser Ansatz folgt objektorientierten Prinzipien und ermöglicht es Ihnen, die Funktionalität später problemlos zu erweitern.

Wie sieht die Struktur der Zielwebsite aus?

Untersuchen Sie die Struktur der Website im Hinblick auf das Scraping. Das Verständnis der Struktur der Website ist entscheidend für effektives Web-Scraping. Ähnlich wie in unserem Leitfaden zum Scraping von einer Online-Filmwebsite sollten Sie zunächst die HTML-Struktur analysieren:

Benutzeroberfläche einer Film-Streaming-Website mit einer Rasteransicht von Filmplakaten, Navigationsregisterkarten und Qualitätsanzeigen

Welche HTML-Elemente enthalten Filmdaten?

Dies ist ein Ausschnitt aus dem HTML-Code der Startseite, den wir auf der Website sehen. Die Untersuchung der HTML-Struktur hilft dabei, die richtigen CSS-Selektoren zu identifizieren:

<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

Wir haben eine Film-ID, einen Titel und einen Link zu einer Detailseite. Jeder Film ist in einem -Element mit der Klasse und enthält ein eindeutiges ``-Attribut zur Identifizierung.

Wie implementiere ich grundlegendes Movie Scraping?

Beginnen Sie mit dem Scraping dieses Datensatzes. Bevor Sie einen Scraper ausführen, stellen Sie sicher, dass Sie Ihren Lizenzschlüssel wie unten gezeigt korrekt konfiguriert haben:

public class MovieScraper : WebScraper
{
    public override void Init()
    {
        // Initialize scraper settings
        License.LicenseKey = "LicenseKey";
        this.LoggingLevel = WebScraper.LogLevel.All;
        this.WorkingDirectory = AppSetting.GetAppRoot() + @"\MovieSample\Output\";

        // Request homepage content for scraping
        this.Request("www.website.com", Parse);
    }

    public override void Parse(Response response)
    {
        // Iterate over each movie div within the featured movie section
        foreach (var div in response.Css("#movie-featured > div"))
        {
            if (div.Attributes["class"] != "clearfix")
            {
                var movieId = Convert.ToInt32(div.GetAttribute("data-movie-id"));
                var link = div.Css("a")[0];
                var movieTitle = link.TextContentClean;

                // Scrape and store movie data as key-value pairs
                Scrape(new ScrapedData() 
                { 
                    { "MovieId", movieId },
                    { "MovieTitle", movieTitle }
                }, "Movie.Jsonl");
            }
        }           
    }
}
public class MovieScraper : WebScraper
{
    public override void Init()
    {
        // Initialize scraper settings
        License.LicenseKey = "LicenseKey";
        this.LoggingLevel = WebScraper.LogLevel.All;
        this.WorkingDirectory = AppSetting.GetAppRoot() + @"\MovieSample\Output\";

        // Request homepage content for scraping
        this.Request("www.website.com", Parse);
    }

    public override void Parse(Response response)
    {
        // Iterate over each movie div within the featured movie section
        foreach (var div in response.Css("#movie-featured > div"))
        {
            if (div.Attributes["class"] != "clearfix")
            {
                var movieId = Convert.ToInt32(div.GetAttribute("data-movie-id"));
                var link = div.Css("a")[0];
                var movieTitle = link.TextContentClean;

                // Scrape and store movie data as key-value pairs
                Scrape(new ScrapedData() 
                { 
                    { "MovieId", movieId },
                    { "MovieTitle", movieTitle }
                }, "Movie.Jsonl");
            }
        }           
    }
}
Public Class MovieScraper
	Inherits WebScraper

	Public Overrides Sub Init()
		' Initialize scraper settings
		License.LicenseKey = "LicenseKey"
		Me.LoggingLevel = WebScraper.LogLevel.All
		Me.WorkingDirectory = AppSetting.GetAppRoot() & "\MovieSample\Output\"

		' Request homepage content for scraping
		Me.Request("www.website.com", AddressOf Parse)
	End Sub

	Public Overrides Sub Parse(ByVal response As Response)
		' Iterate over each movie div within the featured movie section
		For Each div In response.Css("#movie-featured > div")
			If div.Attributes("class") <> "clearfix" Then
				Dim movieId = Convert.ToInt32(div.GetAttribute("data-movie-id"))
				Dim link = div.Css("a")(0)
				Dim movieTitle = link.TextContentClean

				' Scrape and store movie data as key-value pairs
				Scrape(New ScrapedData() From {
					{ "MovieId", movieId },
					{ "MovieTitle", movieTitle }
				},
				"Movie.Jsonl")
			End If
		Next div
	End Sub
End Class
$vbLabelText   $csharpLabel

Wozu dient die Eigenschaft "Working Directory"?

Was ist neu in diesem Code?

Die Eigenschaft Working Directory legt das Hauptarbeitsverzeichnis für alle gescrapten Daten und zugehörigen Dateien fest. Dadurch wird sichergestellt, dass alle Ausgabedateien an einem einzigen Ort organisiert sind, was die Verwaltung groß angelegter Scraping-Projekte erleichtert. Das Verzeichnis wird automatisch erstellt, falls es noch nicht existiert.

Wann sollte ich CSS-Selektoren und wann Attribute verwenden?

Weitere Überlegungen:

CSS-Selektoren eignen sich ideal, um Elemente anhand ihrer strukturellen Position oder Klassennamen anzusprechen, während der direkte Zugriff auf Attribute besser geeignet ist, um bestimmte Werte wie IDs oder benutzerdefinierte Datenattribute zu extrahieren. In unserem Beispiel verwenden wir CSS-Selektoren (#movie-featured &gt; div), um durch die DOM-Struktur zu navigieren, und Attribute (``), um bestimmte Werte zu extrahieren.

Wie erstelle ich typisierte Objekte für gescrapte Daten?

Erstellen Sie typisierte Objekte, um die gescrapten Daten in formatierten Objekten zu speichern. Die Verwendung stark typisierter Objekte sorgt für eine bessere Code-Organisation, IntelliSense-Unterstützung und Typüberprüfung zur Kompilierungszeit.

Implementieren Sie eine ``-Klasse, die formatierte Daten enthält:

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

Wie verbessert die Verwendung typisierter Objekte die Datenorganisation?

Aktualisieren Sie den Code, um die typisierte Klasse anstelle des generischen Wörterbuchs zu verwenden:

public class MovieScraper : WebScraper
{
    public override void Init()
    {
        // Initialize scraper settings
        License.LicenseKey = "LicenseKey";
        this.LoggingLevel = WebScraper.LogLevel.All;
        this.WorkingDirectory = AppSetting.GetAppRoot() + @"\MovieSample\Output\";

        // Request homepage content for scraping
        this.Request("https://website.com/", Parse);
    }

    public override void Parse(Response response)
    {
        // Iterate over each movie div within the featured movie section
        foreach (var div in response.Css("#movie-featured > div"))
        {
            if (div.Attributes["class"] != "clearfix")
            {
                var movie = new Movie
                {
                    Id = Convert.ToInt32(div.GetAttribute("data-movie-id"))
                };

                var link = div.Css("a")[0];
                movie.Title = link.TextContentClean;
                movie.URL = link.Attributes["href"];

                // Scrape and store movie object
                Scrape(movie, "Movie.Jsonl");
            }
        }
    }
}
public class MovieScraper : WebScraper
{
    public override void Init()
    {
        // Initialize scraper settings
        License.LicenseKey = "LicenseKey";
        this.LoggingLevel = WebScraper.LogLevel.All;
        this.WorkingDirectory = AppSetting.GetAppRoot() + @"\MovieSample\Output\";

        // Request homepage content for scraping
        this.Request("https://website.com/", Parse);
    }

    public override void Parse(Response response)
    {
        // Iterate over each movie div within the featured movie section
        foreach (var div in response.Css("#movie-featured > div"))
        {
            if (div.Attributes["class"] != "clearfix")
            {
                var movie = new Movie
                {
                    Id = Convert.ToInt32(div.GetAttribute("data-movie-id"))
                };

                var link = div.Css("a")[0];
                movie.Title = link.TextContentClean;
                movie.URL = link.Attributes["href"];

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

	Public Overrides Sub Init()
		' Initialize scraper settings
		License.LicenseKey = "LicenseKey"
		Me.LoggingLevel = WebScraper.LogLevel.All
		Me.WorkingDirectory = AppSetting.GetAppRoot() & "\MovieSample\Output\"

		' Request homepage content for scraping
		Me.Request("https://website.com/", AddressOf Parse)
	End Sub

	Public Overrides Sub Parse(ByVal response As Response)
		' Iterate over each movie div within the featured movie section
		For Each div In response.Css("#movie-featured > div")
			If div.Attributes("class") <> "clearfix" Then
				Dim movie As New Movie With {.Id = Convert.ToInt32(div.GetAttribute("data-movie-id"))}

				Dim link = div.Css("a")(0)
				movie.Title = link.TextContentClean
				movie.URL = link.Attributes("href")

				' Scrape and store movie object
				Scrape(movie, "Movie.Jsonl")
			End If
		Next div
	End Sub
End Class
$vbLabelText   $csharpLabel

Welches Format verwendet die Scrape-Methode für typisierte Objekte?

Was ist neu?

  1. Wir haben eine ``-Klasse implementiert, um gescrapte Daten zu speichern, was Typsicherheit und eine bessere Code-Organisation gewährleistet.
  2. Wir übergeben Movie-Objekte an die Methode ``, die unser Format versteht und es wie unten gezeigt auf definierte Weise speichert:

Notepad-Fenster mit einer JSON-Filmdatenbank, die strukturierte Filmdaten wie Titel, URLs und Metadatenfelder enthält

Die Ausgabe wird automatisch in das JSON-Format serialisiert, wodurch sie sich leicht in Datenbanken oder andere Anwendungen importieren lässt.

Wie kann ich detaillierte Filmseiten scrapen?

Beginnen Sie mit dem Scraping detaillierterer Seiten. Das Scraping mehrseitiger Inhalte ist eine häufige Anforderung, und IronWebscraper macht dies durch seinen Mechanismus zur Verkettung von Anfragen ganz einfach.

Welche zusätzlichen Daten kann ich aus Detailseiten extrahieren?

Die Filmseite sieht wie folgt aus und enthält umfangreiche Metadaten zu jedem Film:

Infoseite zum Film

<div class="mvi-content">
    <div class="thumb mvic-thumb" 
         style="background-image: url(https://img.gocdn.online/2017/04/28/poster/5a08e94ba02118f22dc30f298c603210-guardians-of-the-galaxy-vol-2.jpg);"></div>
    <div class="mvic-desc">
        <h3>Guardians of the Galaxy Vol. 2</h3>        
        <div class="desc">
            Set to the backdrop of Awesome Mixtape #2, Marvel's Guardians of the Galaxy Vol. 2 continues the team's adventures as they travel throughout the cosmos to help Peter Quill learn more about his true parentage.
        </div>
        <div class="mvic-info">
            <div class="mvici-left">
                <p>
                    <strong>Genre: </strong>
                    <a href="https://Domain/genre/action/" title="Action">Action</a>,
                    <a href="https://Domain/genre/adventure/" title="Adventure">Adventure</a>,
                    <a href="https://Domain/genre/sci-fi/" title="Sci-Fi">Sci-Fi</a>
                </p>
                <p>
                    <strong>Actor: </strong>
                    <a target="_blank" href="https://Domain/actor/chris-pratt" title="Chris Pratt">Chris Pratt</a>,
                    <a target="_blank" href="https://Domain/actor/-zoe-saldana" title="Zoe Saldana">Zoe Saldana</a>,
                    <a target="_blank" href="https://Domain/actor/-dave-bautista-" title="Dave Bautista">Dave Bautista</a>
                </p>
                <p>
                    <strong>Director: </strong>
                    <a href="#" title="James Gunn">James Gunn</a>
                </p>
                <p>
                    <strong>Country: </strong>
                    <a href="https://Domain/country/us" title="United States">United States</a>
                </p>
            </div>
            <div class="mvici-right">
                <p><strong>Duration:</strong> 136 min</p>
                <p><strong>Quality:</strong> <span class="quality">CAM</span></p>
                <p><strong>Release:</strong> 2017</p>
                <p><strong>IMDb:</strong> 8.3</p>
            </div>
            <div class="clearfix"></div>
        </div>
        <div class="clearfix"></div>
    </div>
    <div class="clearfix"></div>
</div>
<div class="mvi-content">
    <div class="thumb mvic-thumb" 
         style="background-image: url(https://img.gocdn.online/2017/04/28/poster/5a08e94ba02118f22dc30f298c603210-guardians-of-the-galaxy-vol-2.jpg);"></div>
    <div class="mvic-desc">
        <h3>Guardians of the Galaxy Vol. 2</h3>        
        <div class="desc">
            Set to the backdrop of Awesome Mixtape #2, Marvel's Guardians of the Galaxy Vol. 2 continues the team's adventures as they travel throughout the cosmos to help Peter Quill learn more about his true parentage.
        </div>
        <div class="mvic-info">
            <div class="mvici-left">
                <p>
                    <strong>Genre: </strong>
                    <a href="https://Domain/genre/action/" title="Action">Action</a>,
                    <a href="https://Domain/genre/adventure/" title="Adventure">Adventure</a>,
                    <a href="https://Domain/genre/sci-fi/" title="Sci-Fi">Sci-Fi</a>
                </p>
                <p>
                    <strong>Actor: </strong>
                    <a target="_blank" href="https://Domain/actor/chris-pratt" title="Chris Pratt">Chris Pratt</a>,
                    <a target="_blank" href="https://Domain/actor/-zoe-saldana" title="Zoe Saldana">Zoe Saldana</a>,
                    <a target="_blank" href="https://Domain/actor/-dave-bautista-" title="Dave Bautista">Dave Bautista</a>
                </p>
                <p>
                    <strong>Director: </strong>
                    <a href="#" title="James Gunn">James Gunn</a>
                </p>
                <p>
                    <strong>Country: </strong>
                    <a href="https://Domain/country/us" title="United States">United States</a>
                </p>
            </div>
            <div class="mvici-right">
                <p><strong>Duration:</strong> 136 min</p>
                <p><strong>Quality:</strong> <span class="quality">CAM</span></p>
                <p><strong>Release:</strong> 2017</p>
                <p><strong>IMDb:</strong> 8.3</p>
            </div>
            <div class="clearfix"></div>
        </div>
        <div class="clearfix"></div>
    </div>
    <div class="clearfix"></div>
</div>
HTML

Wie kann ich meine Movie-Klasse um zusätzliche Eigenschaften erweitern?

Erweitern Sie die Klasse um neue Eigenschaften (, ,, ,, ,), verwende jedoch nur , und `` für dieses Beispiel. Die Verwendung von @@--CODE-54--string>@@Liststring>@@--CODE-55--@@ für Genres und Schauspieler ermöglicht eine elegante Handhabung mehrerer Werte:

using System.Co/llections.Generic;

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; }
}
using System.Co/llections.Generic;

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; }
}
Imports System.Collections.Generic

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

Wie navigiere ich beim Scraping zwischen den Seiten?

Navigieren Sie zur Detailseite, um sie zu scrapen. IronWebscraper sorgt automatisch für Thread-Sicherheit, sodass mehrere Seiten gleichzeitig verarbeitet werden können.

Warum sollten für verschiedene Seitentypen mehrere Parsing-Funktionen verwendet werden?

IronWebscraper ermöglicht das Hinzufügen mehrerer Scraping-Funktionen zur Verarbeitung unterschiedlicher Seitenformate. Diese Trennung der Anliegen macht Ihren Code wartungsfreundlicher und ermöglicht den angemessenen Umgang mit unterschiedlichen Seitenstrukturen. Jede Parsing-Funktion kann sich auf das Extrahieren von Daten aus einem bestimmten Seitentyp konzentrieren.

Wie helfen Metadaten bei der Übergabe von Objekten zwischen Parsing-Funktionen?

Die Funktion MetaData ist entscheidend für die Aufrechterhaltung des Status zwischen Anfragen. Weitere Informationen zu fortgeschrittenen WEBSCRAPER-Funktionen finden Sie in unserem ausführlichen Leitfaden:

public class MovieScraper : WebScraper
{
    public override void Init()
    {
        // Initialize scraper settings
        License.LicenseKey = "LicenseKey";
        this.LoggingLevel = WebScraper.LogLevel.All;
        this.WorkingDirectory = AppSetting.GetAppRoot() + @"\MovieSample\Output\";

        // Request homepage content for scraping
        this.Request("https://domain/", Parse);
    }

    public override void Parse(Response response)
    {
        // Iterate over each movie div within the featured movie section
        foreach (var div in response.Css("#movie-featured > div"))
        {
            if (div.Attributes["class"] != "clearfix")
            {
                var movie = new Movie
                {
                    Id = Convert.ToInt32(div.GetAttribute("data-movie-id"))
                };

                var link = div.Css("a")[0];
                movie.Title = link.TextContentClean;
                movie.URL = link.Attributes["href"];

                // Request detailed page
                this.Request(movie.URL, ParseDetails, new MetaData() { { "movie", movie } });
            }
        }           
    }

    public void ParseDetails(Response response)
    {
        // Retrieve movie object from metadata
        var movie = response.MetaData.Get<Movie>("movie");
        var div = response.Css("div.mvic-desc")[0];

        // Extract description
        movie.Description = div.Css("div.desc")[0].TextContentClean;

        // Extract genres
        movie.Genre = new List<string>(); // Initialize genre list
        foreach(var genre in div.Css("div > p > a"))
        {
            movie.Genre.Add(genre.TextContentClean);
        }

        // Extract actors
        movie.Actor = new List<string>(); // Initialize actor list
        foreach (var actor in div.Css("div > p:nth-child(2) > a"))
        {
            movie.Actor.Add(actor.TextContentClean);
        }

        // Scrape and store detailed movie data
        Scrape(movie, "Movie.Jsonl");
    }
}
public class MovieScraper : WebScraper
{
    public override void Init()
    {
        // Initialize scraper settings
        License.LicenseKey = "LicenseKey";
        this.LoggingLevel = WebScraper.LogLevel.All;
        this.WorkingDirectory = AppSetting.GetAppRoot() + @"\MovieSample\Output\";

        // Request homepage content for scraping
        this.Request("https://domain/", Parse);
    }

    public override void Parse(Response response)
    {
        // Iterate over each movie div within the featured movie section
        foreach (var div in response.Css("#movie-featured > div"))
        {
            if (div.Attributes["class"] != "clearfix")
            {
                var movie = new Movie
                {
                    Id = Convert.ToInt32(div.GetAttribute("data-movie-id"))
                };

                var link = div.Css("a")[0];
                movie.Title = link.TextContentClean;
                movie.URL = link.Attributes["href"];

                // Request detailed page
                this.Request(movie.URL, ParseDetails, new MetaData() { { "movie", movie } });
            }
        }           
    }

    public void ParseDetails(Response response)
    {
        // Retrieve movie object from metadata
        var movie = response.MetaData.Get<Movie>("movie");
        var div = response.Css("div.mvic-desc")[0];

        // Extract description
        movie.Description = div.Css("div.desc")[0].TextContentClean;

        // Extract genres
        movie.Genre = new List<string>(); // Initialize genre list
        foreach(var genre in div.Css("div > p > a"))
        {
            movie.Genre.Add(genre.TextContentClean);
        }

        // Extract actors
        movie.Actor = new List<string>(); // Initialize actor list
        foreach (var actor in div.Css("div > p:nth-child(2) > a"))
        {
            movie.Actor.Add(actor.TextContentClean);
        }

        // Scrape and store detailed movie data
        Scrape(movie, "Movie.Jsonl");
    }
}
Public Class MovieScraper
	Inherits WebScraper

	Public Overrides Sub Init()
		' Initialize scraper settings
		License.LicenseKey = "LicenseKey"
		Me.LoggingLevel = WebScraper.LogLevel.All
		Me.WorkingDirectory = AppSetting.GetAppRoot() & "\MovieSample\Output\"

		' Request homepage content for scraping
		Me.Request("https://domain/", AddressOf Parse)
	End Sub

	Public Overrides Sub Parse(ByVal response As Response)
		' Iterate over each movie div within the featured movie section
		For Each div In response.Css("#movie-featured > div")
			If div.Attributes("class") <> "clearfix" Then
				Dim movie As New Movie With {.Id = Convert.ToInt32(div.GetAttribute("data-movie-id"))}

				Dim link = div.Css("a")(0)
				movie.Title = link.TextContentClean
				movie.URL = link.Attributes("href")

				' Request detailed page
				Me.Request(movie.URL, AddressOf ParseDetails, New MetaData() From {
					{ "movie", movie }
				})
			End If
		Next div
	End Sub

	Public Sub ParseDetails(ByVal response As Response)
		' Retrieve movie object from metadata
		Dim movie = response.MetaData.Get(Of Movie)("movie")
		Dim div = response.Css("div.mvic-desc")(0)

		' Extract description
		movie.Description = div.Css("div.desc")(0).TextContentClean

		' Extract genres
		movie.Genre = New List(Of String)() ' Initialize genre list
		For Each genre In div.Css("div > p > a")
			movie.Genre.Add(genre.TextContentClean)
		Next genre

		' Extract actors
		movie.Actor = New List(Of String)() ' Initialize actor list
		For Each actor In div.Css("div > p:nth-child(2) > a")
			movie.Actor.Add(actor.TextContentClean)
		Next actor

		' Scrape and store detailed movie data
		Scrape(movie, "Movie.Jsonl")
	End Sub
End Class
$vbLabelText   $csharpLabel

Was sind die Hauptmerkmale dieses Ansatzes zum Scraping mehrseitiger Inhalte?

Was ist neu?

  1. Fügen Sie Scraping-Funktionen hinzu (z. B. ``), um Detailseiten zu scrapen, ähnlich wie bei Techniken, die beim Scraping von einer Shopping-Website verwendet werden.
  2. Verschieben Sie die Funktion ``, die Dateien generiert, in die neue Funktion und stellen Sie sicher, dass die Daten erst gespeichert werden, nachdem alle Details erfasst wurden.
  3. Verwenden Sie die IronWebScraper-Funktion (``), um Movie-Objekte an neue Scrape-Funktionen zu übergeben und so den Objektstatus über mehrere Anfragen hinweg beizubehalten.
  4. Seiten scrapen und Daten von Movie-Objekten mit vollständigen Informationen in Dateien speichern.

Notepad-Fenster mit einer JSON-Filmdatenbank, die Filmtitel, Beschreibungen, URLs und Genre-Metadaten enthält

Weitere Informationen zu den verfügbaren Methoden und Eigenschaften finden Sie in der API Referenz. IronWebscraper bietet ein robustes Framework zum Extrahieren strukturierter Daten aus Websites und ist damit ein unverzichtbares Werkzeug für Projekte zur Datenerfassung und -analyse.

Häufig gestellte Fragen

Wie kann ich mit C# Filmtitel aus HTML extrahieren?

IronWebscraper bietet CSS-Selektor-Methoden, um Filmtitel aus HTML zu extrahieren. Verwenden Sie die response.Css()-Methode mit geeigneten Selektoren wie '.movie-item h2', um auf Titelelemente zu zielen, und greifen Sie dann auf die TextContentClean-Eigenschaft zu, um den sauberen Textwert zu erhalten.

Wie kann man am besten zwischen mehreren Filmseiten navigieren?

IronWebscraper verarbeitet die Seitennavigation über die Request()-Methode. Sie können Paginierungslinks mit CSS-Selektoren extrahieren und dann Request() mit jeder URL aufrufen, um Daten von mehreren Seiten zu scrapen und so automatisch umfassende Filmdatensätze zu erstellen.

Wie kann ich gescrapte Filmdaten in einem strukturierten Format speichern?

Verwenden Sie die Scrape()-Methode von IronWebscraper, um Daten im JSON-Format zu speichern. Erstellen Sie anonyme Objekte oder typisierte Klassen, die Filmeigenschaften wie Titel, URL und Bewertung enthalten, und übergeben Sie diese dann zusammen mit einem Dateinamen an Scrape(), um die Daten automatisch zu serialisieren und zu speichern.

Welche CSS-Selektoren sollte ich verwenden, um Filminformationen zu extrahieren?

IronWebScraper unterstützt Standard-CSS-Selektoren. Für Film-Websites sollten Selektoren wie '.movie-item' für Container, 'h2' für Titel, 'a[href]' für Links und spezifische Klassennamen für Bewertungen oder Genres verwendet werden. Die Methode Css() gibt Sammlungen zurück, durch die Sie iterieren können.

Wie gehe ich mit Filmqualitätsindikatoren wie "CAM" in gescrapten Daten um?

IronWebscraper ermöglicht es Ihnen, Qualitätsindikatoren zu extrahieren und zu verarbeiten, indem Sie deren spezifische HTML-Elemente anvisieren. Verwenden Sie CSS-Selektoren, um Qualitätsplaketten oder Text zu finden, und fügen Sie diese dann als Eigenschaften in Ihre gescrapten Datenobjekte ein, um umfassende Filminformationen zu erhalten.

Kann ich eine Protokollierung für meine Film-Scraping-Vorgänge einrichten?

Ja, IronWebscraper enthält eine integrierte Protokollierungsfunktion. Setzen Sie die Eigenschaft LoggingLevel in Ihrer Init()-Methode auf LogLevel.All, um alle Scraping-Aktivitäten, Fehler und den Fortschritt zu verfolgen, was bei der Fehlersuche und Überwachung Ihrer Filmdatenextraktion hilft.

Wie konfiguriert man Arbeitsverzeichnisse für gescrapte Daten richtig?

IronWebscraper lässt Sie eine WorkingDirectory-Eigenschaft in der Init()-Methode festlegen. Geben Sie einen Pfad wie 'C:\MovieData\Output\' an, in dem die gescrapten Filmdateien gespeichert werden sollen. Dies zentralisiert das Output-Management und hält Ihre Daten organisiert.

Wie erbe ich richtig von der WebScraper-Klasse?

Erstellen Sie eine neue Klasse, die von der WebScraper-Basisklasse von IronWebScraper erbt. Überschreiben Sie die Methode Init() für die Konfiguration und die Methode Parse() für die Datenextraktionslogik. Dieser objektorientierte Ansatz macht Ihren Movie Scraper wiederverwendbar und wartbar.

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.