C# ve IronWebScraper kullanarak bir çevrimiçi film web sitesinden veri kazıma
IronWebScraper, HTML öğelerini ayrıştırarak, yapılandırılmış veri depolaması için türlendirilmiş nesneler oluşturarak ve meta verileri kullanarak sayfalar arasında gezinerek web sitelerinden film verilerini çıkarır ve kapsamlı film bilgisi veri kümeleri oluşturur. Bu C# Web Scraper kütüphanesi, yapılandırılmamış web içeriğini organize ve analiz edilebilir verilere dönüştürmeyi basitleştirir.
Hızlı Başlangıç: C# ile Film Verilerini Çıkarma
- NuGet Paket Yöneticisi aracılığıyla
IronWebScraper'yi yükleyin - ``'dan miras alan bir sınıf oluşturun
- `` işlevini geçersiz kılın, lisansı ayarlayın ve hedef URL'yi isteyin
- CSS seçicileri kullanarak film verilerini çıkarmak için ``'yi geçersiz kılın
- Verileri JSON formatında kaydetmek için `` yöntemini kullanın
-
IronWebScraper aşağıdaki NuGet Paket Yöneticisi ile yükleyin
PM > Install-Package IronWebScraper -
Bu kod parçacığını kopyalayın ve çalıştırın.
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(); -
Canlı ortamınızda test için dağıtım yapın
Ücretsiz deneme ile bugün projenizde IronWebScraper kullanmaya başlayın
Movie Scraper Sınıfını Nasıl Kurarım?
Gerçek bir web sitesi örneğiyle başlayın. C#'da Web Kazıma öğreticimizde açıklanan teknikleri kullanarak bir film web sitesinden veri toplayacağız.
Yeni bir sınıf ekleyin ve adına `` adını verin:
Özel bir kazıyıcı sınıfı oluşturmak, kodunuzu düzenlemenize yardımcı olur ve kodun yeniden kullanılabilir olmasını sağlar. Bu yaklaşım, nesne yönelimli ilkeleri takip eder ve daha sonra işlevselliği kolayca genişletmenize olanak tanır.
Hedef web sitesinin yapısı nasıldır?
Veri kazıma için site yapısını inceleyin. Etkili bir web kazıma işlemi için web sitesinin yapısını anlamak çok önemlidir. Çevrimiçi Film Web Sitesinden Veri Toplama kılavuzumuzda olduğu gibi, önce HTML yapısını analiz edin:
Hangi HTML öğeleri film verilerini içerir?
Bu, web sitesinde gördüğümüz ana sayfa HTML'sinin bir parçasıdır. HTML yapısını incelemek, kullanılacak doğru CSS seçicilerini belirlemeye yardımcı olur:
<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>
Elimizde bir film kimliği, başlığı ve ayrıntılı sayfaya yönlendiren bir bağlantı bulunmaktadır. Her film, öğesi içinde yer alır ve sınıfına sahiptir; ayrıca tanımlama amacıyla benzersiz bir `` özniteliği içerir.
Temel Film Kazıma İşlemini Nasıl Uygularım?
Bu veri kümesini kazımaya başlayın. Herhangi bir kazıyıcıyı çalıştırmadan önce, lisans anahtarınızı aşağıda gösterildiği gibi doğru şekilde yapılandırdığınızdan emin olun:
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
Çalışma Dizini Özelliği Ne İçin Kullanılır?
Bu kodda neler var?
Working Directory özelliği, kazınan tüm veriler ve ilgili dosyalar için ana çalışma dizinini belirler. Bu, tüm çıktı dosyalarının tek bir konumda düzenlenmesini sağlar ve böylece büyük ölçekli kazıma projelerinin yönetilmesini kolaylaştırır. Dizin yoksa otomatik olarak oluşturulacaktır.
CSS Seçicileri ile Öznitelikleri Ne Zaman Kullanmalıyım?
Ek hususlar:
CSS seçicileri, öğeleri yapısal konumlarına veya sınıf adlarına göre hedeflerken idealdir; buna karşılık, doğrudan öznitelik erişimi, kimlikler veya özel veri öznitelikleri gibi belirli değerleri çıkarmak için daha uygundur. Örneğimizde, DOM yapısında gezinmek için CSS seçicileri (#movie-featured > div) ve belirli değerleri çıkarmak için öznitelikleri (``) kullanıyoruz.
Çıkarılan Veriler İçin Tipli Nesneler Nasıl Oluşturulur?
Çıkarılan verileri biçimlendirilmiş nesnelerde tutmak için türlü nesneler oluşturun. Güçlü tipte nesneler kullanmak, daha iyi kod organizasyonu, IntelliSense desteği ve derleme zamanı tip denetimi sağlar.
Biçimlendirilmiş verileri tutacak bir `` sınıfı uygulayın:
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
Tipli Nesneleri Kullanmak Veri Düzenlemesini Nasıl İyileştirir?
Kodu, genel sözlüğü yerine sınıfını kullanacak şekilde güncelleyin:
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
Scrape Yöntemi, Tipli Nesneler İçin Hangi Biçimi Kullanır?
Yenilikler
- Kazınan verileri tutmak için `` sınıfını uyguladık; bu, tür güvenliği ve daha iyi kod organizasyonu sağlar.
- Film nesnelerini, formatımızı anlayan ve aşağıda gösterildiği gibi tanımlanmış bir şekilde kaydeden `` yöntemine aktarıyoruz:
Çıktı otomatik olarak JSON formatına dönüştürülür, böylece veritabanlarına veya diğer uygulamalara kolayca aktarılabilir.
Ayrıntılı Film Sayfalarını Nasıl Kazıyabilirim?
Daha ayrıntılı sayfaları kazımaya başlayın. Çok sayfalı veri kazıma yaygın bir gereksinimdir ve IronWebscraper, istek zincirleme mekanizması sayesinde bunu basitleştirir.
Ayrıntı Sayfalarından Hangi Ek Verileri Çıkarabilirim?
Film Sayfası, her film hakkında zengin meta veriler içeren şu şekilde görünür:
<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>
Ek Özellikler İçin Movie Sınıfımı Nasıl Genişletmeliyim?
sınıfını yeni özelliklerle (, ,, ,, ,IMDb Puanı) ancak sadece, ve kullanın.
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
Veri Toplarken Sayfalar Arasında Nasıl Gezinirim?
Sayfayı kazımak için ayrıntılı sayfaya gidin. IronWebscraper, iş parçacığı güvenliğini otomatik olarak yönetir ve birden fazla sayfanın aynı anda işlenmesine olanak tanır.
Neden Farklı Sayfa Türleri İçin Birden Fazla Ayrıştırma İşlevi Kullanılmalı?
IronWebScraper, farklı sayfa formatlarını işlemek için birden fazla kazıma işlevi eklemeye olanak tanır. Bu görev ayrımı, kodunuzun bakımını kolaylaştırır ve farklı sayfa yapılarının uygun şekilde işlenmesini sağlar. Her bir ayrıştırma işlevi, belirli bir sayfa türünden veri çıkarmaya odaklanabilir.
MetaData, Parse İşlevleri Arasında Nesnelerin Aktarılmasına Nasıl Yardımcı Olur?
MetaData özelliği, istekler arasındaki durumu korumak için çok önemlidir. Daha gelişmiş WEBSCRAPER özellikleri için ayrıntılı kılavuzumuza göz atın:
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
Bu Çok Sayfalı Kazıma Yaklaşımının Temel Özellikleri Nelerdir?
Yenilikler
- Alışveriş web sitelerinden veri kazıma sırasında kullanılan tekniklere benzer şekilde, ayrıntılı sayfaları kazımak için kazıma işlevleri (ör. ``) ekleyin.
- Dosyaları oluşturan `` işlevini yeni işlevin içine taşıyın ve tüm ayrıntılar toplandıktan sonra verilerin kaydedilmesini sağlayın.
- IronWebScraper özelliğini (``) kullanarak film nesnelerini yeni kazıma işlevlerine aktarın ve istekler arasında nesne durumunu koruyun.
- Sayfaları kazıyın ve film nesnesi verilerini eksiksiz bilgilerle dosyalara kaydedin.
Kullanılabilir yöntemler ve özellikler hakkında daha fazla bilgi için API Referansına bakın. IronWebscraper, web sitelerinden yapılandırılmış verileri çıkarmak için sağlam bir çerçeve sunar ve bu da onu veri toplama ve analiz projeleri için vazgeçilmez bir araç haline getirir.
Sıkça Sorulan Sorular
C# kullanarak HTML’den film başlıklarını nasıl çıkarabilirim?
IronWebScraper, film başlıklarını HTML’den çıkarmak için CSS seçici yöntemleri sunar. Başlık elemanlarını hedeflemek için '.movie-item h2' gibi uygun seçicilerle response.Css() yöntemini kullanın, ardından temiz metin değerini almak için TextContentClean özelliğine erişin.
Birden fazla film sayfası arasında gezinmenin en iyi yolu nedir?
IronWebScraper, sayfa gezinmeyi Request() yöntemi aracılığıyla halleder. Sayfalamalı bağlantıları CSS seçicileri kullanarak çıkarabilir ve ardından çok sayfalı veri kazımak için her URL ile Request() çağırarak kapsamlı film veri setleri otomatik olarak oluşturabilirsiniz.
Kazınmış film verilerini yapılandırılmış bir formatta nasıl kaydedebilirim?
IronWebScraper'ın Scrape() yöntemini kullanarak veriyi JSON formatında kaydedin. Başlık, URL ve puan gibi film özelliklerini içeren anonim nesneler veya tipli sınıflar oluşturun, ardından bunları bir dosya adıyla birlikte Scrape()'e geçirerek veriyi otomatik olarak işleyip kaydedin.
Film bilgilerini çıkarmak için hangi CSS seçicileri kullanmalıyım?
IronWebScraper, standart CSS seçicilerini destekler. Film web siteleri için konteynerler için '.movie-item', başlıklar için 'h2', bağlantılar için 'a[href]' ve puanlar veya türler için belirli sınıf isimlerini kullanın. Css() yöntemi, üzerinde gezinebildiğiniz koleksiyonlar döndürür.
Kazınmış verilerde 'CAM' gibi film kalite göstergelerini nasıl işlerim?
IronWebScraper, kalite göstergelerini belirli HTML elemanlarını hedefleyerek çıkarmanıza ve işlemenize olanak tanır. Kalite rozetlerini veya metni bulmak için CSS seçiciler kullanın, ardından kapsamlı film bilgisi için bunları kazınmış veri nesnelerinize özellik olarak dahil edin.
Film kazıma işlemleri için günlük tutma ayarlayabilir miyim?
Evet, IronWebScraper, yerleşik günlük tutma işlevselliği içerir. Tüm kazıma faaliyetlerini, hataları ve ilerlemeyi izlemek için Init() yönteminizde LoggingLevel özelliğini LogLevel.All olarak ayarlayın, bu da film veri çıkarmanızı hata ayıklamak ve izlemek için yardımcı olur.
Kazınmış veriler için çalışma dizinleri nasıl uygun bir şekilde yapılandırılır?
IronWebScraper, Init() yönteminde bir WorkingDirectory özelliği ayarlamanıza olanak tanır. Kazınmış film veri dosyalarının kaydedileceği 'C:\MovieData\Output\' gibi bir yol belirtin. Bu, çıktı yönetimini merkezileştirir ve verilerinizi düzenli tutar.
WebScraper sınıfından doğru şekilde nasıl miras alabilirim?
IronWebScraper'ın WebScraper temel sınıfından miras alan yeni bir sınıf oluşturun. Yapılandırma için Init() yöntemini ve veri çıkarma mantığı için Parse() yöntemini geçersiz kılın. Bu nesne yönelimli yaklaşım, film kazıyıcınızı tekrar kullanılabilir ve sürdürülebilir yapar.






