Scraping einer Online-Filmwebsite mit C# und IronWebscraper
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
- Installieren Sie
IronWebScraperüber den NuGet Package Manager - Erstellen Sie eine Klasse, die von `` erbt
- Überschreiben Sie ``, um die Lizenz festzulegen und die Ziel-URL abzufragen
- Überschreiben Sie ``, um Filmdaten mithilfe von CSS-Selektoren zu extrahieren
- Verwenden Sie die Methode ``, um Daten im JSON-Format zu speichern
-
Installieren Sie IronWebScraper mit NuGet Package Manager
PM > Install-Package IronWebScraper -
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(); -
Bereitstellen zum Testen in Ihrer Live-Umgebung
Beginnen Sie noch heute, IronWebScraper in Ihrem Projekt zu verwenden, mit einer kostenlosen Testversion
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 ``:
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:
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>
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
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 > 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
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
Welches Format verwendet die Scrape-Methode für typisierte Objekte?
Was ist neu?
- Wir haben eine ``-Klasse implementiert, um gescrapte Daten zu speichern, was Typsicherheit und eine bessere Code-Organisation gewährleistet.
- Wir übergeben Movie-Objekte an die Methode ``, die unser Format versteht und es wie unten gezeigt auf definierte Weise speichert:
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:
<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>
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--
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
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
Was sind die Hauptmerkmale dieses Ansatzes zum Scraping mehrseitiger Inhalte?
Was ist neu?
- 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.
- 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.
- Verwenden Sie die IronWebScraper-Funktion (``), um Movie-Objekte an neue Scrape-Funktionen zu übergeben und so den Objektstatus über mehrere Anfragen hinweg beizubehalten.
- Seiten scrapen und Daten von Movie-Objekten mit vollständigen Informationen in Dateien speichern.
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.






