C# ve IronWebScraper kullanarak Çevrimiçi Film Web Sitesini Kazıma
IronWebScraper, HTML öğelerini ayrıştırarak web sitelerinden film verileri çıkarır, yapılandırılmış veri depolama için tipik nesneler oluşturur ve kapsamlı film bilgi veri setleri oluşturmak için sayfalar arasında gezinmek için meta verileri kullanır. Bu C# Web Kazıyıcı kütüphanesi, yapılandırılmamış web içeriğini organize, analiz edilebilir verilere dönüştürmeyi kolaylaştırır.
Hızlı Başlat: C# ile Filmleri Kazıyın
IronWebScraper'ü NuGet Paket Yöneticisi üzerinden yükleyinWebScraper'den türetilen bir sınıf oluşturun- Lisansı ayarlamak ve hedef URL'yi talep etmek için
Init()'ü geçersiz kılın - Film verilerini CSS seçicilerini kullanarak çıkarmak için
Parse()'i geçersiz kılın - Verileri JSON formatında kaydetmek için
Scrape()yöntemini kullanın
-
IronWebScraper aşağıdaki NuGet Paket Yöneticisi ile yükleyin
-
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
Bir Film Kazıyıcı Sınıfı Nasıl Ayarlanır?
Gerçek bir web sitesi örneği ile başlayın. C#'de Web Kazıma eğitimimizdeki teknikleri kullanarak bir film web sitesini kazıyacağız.
Yeni bir sınıf ekleyin ve adını MovieScraper olarak belirleyin:
Özel bir kazıma sınıfı oluşturmak, kodunuzu düzenlemenize yardımcı olur ve tekrar kullanılabilir hale getirir. Bu yaklaşım, nesne yönelimli prensipleri takip eder ve daha sonra fonksiyonellik oluşturmanıza olanak tanır.
Hedef Web Sitesi Yapısı Nasıl Görünüyor?
Kazıma için site yapısını inceleyin. Web sitesinin yapısını anlamak web kazıma için etkilidir. Çevrimiçi Film Web Sitesinden Kazıma kılavuzumuza benzer şekilde ilk olarak HTML yapısını analiz edin:
Hangi HTML Öğeleri Film Verilerini İçerir?
Bu, sitede gördüğümüz anasayfanın bir parçasıdır. HTML yapısını incelemek, hangi doğru CSS seçicilerini kullanacağını 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>
Bir film kimliği, başlık ve detaylı sayfaya bir bağlantımız var. Her film, içinde benzersiz bir kimlik için data-movie-id niteliği bulunan ml-item sınıfına sahip olan bir div öğesinde saklanır.
Temel Film Kazıma Nasıl Uygulanır?
Bu veri setini kazılamaya başlayın. Herhangi bir kazıyıcıyı çalıştırmadan önce, lisans anahtarınızı doğru bir ş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?
Bu kodda yenilik nelerdir?
Working Directory özelliği, tüm kazılan veriler ve ilgili dosyalar için ana çalışma dizinini ayarlar. Bu, geniş kapsamlı kazıma projelerini yönetmeyi kolaylaştırarak tüm çıktı dosyalarının tek bir yerde organize edilmesini sağlar. Dizin, eğer mevcut değilse otomatik olarak oluşturulacaktır.
CSS Seçiciler ve Öznitelikler Ne Zaman Kullanılır?
Ek düşünceler:
CSS seçicileri, yapısal pozisyonları veya sınıf adları hedeflenirken idealdir, direkt öznitelik erişimi ise ID'ler veya özel veri öznitelikleri gibi belirli değerleri çıkarmak için daha iyidir. Örneğimizde, DOM yapısında gezinmek için CSS seçicilerini (#movie-featured > div) ve belirli değerleri çıkarmak için nitelikleri (data-movie-id) kullanıyoruz.
Scraped Data İçin Yazılı Nesneler Nasıl Oluşturulur?
Kazınmış verileri biçimlendirilmiş nesneler halinde tutmak için yazılı nesneler oluşturun. Güçlü yazılmış nesneler kullanmak, daha iyi kod organizasyonu, IntelliSense desteği ve derleme zamanında tip kontrolü sağlar.
Biçimlendirilmiş verileri tutacak bir Movie 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
Yazılı Nesneler Kullanımı Veri Organizasyonu Nasıl İyileştirir?
Genel ScrapedData sözlüğü yerine yazılı Movie sınıfını kullanacak şekilde kodu 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
Typed Objects için Scrape Yöntemi Hangi Formatı Kullanır?
Yenilikler neler?
- Kazılan verileri tutmak için bir
Moviesınıfı uyguladık, bu tür güvenliği sağladı ve kod organizasyonunu iyileştirdi. - Film nesnelerini aşağıda gösterildiği gibi tanımlanmış bir şekilde kaydeden ve formatımızı anlayan
Scrapeyöntemine iletmekteyiz:
Çıktı otomatik olarak JSON formatına serileştirilir, bu da onu veritabanlarına veya diğer uygulamalara aktarmayı kolaylaştırır.
Ayrıntılı Film Sayfalarını Nasıl Kazıyabilirim?
Daha ayrıntılı sayfaları kazımaya başlayın. Çok sayfalı kazıma yaygın bir gerekliliktir ve IronWebScraper, istek zincirleme mekanizması ile bunu kolaylaştırır.
Detay Sayfalarından Ekstra Veri Ne Alabiliriz?
Film Sayfası şöyle görünür, her film hakkında zengin meta veriler içerir:
<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 için Film Sınıfımı Nasıl Genişletmeliyim?
Yeni özelliklerle detaylı bilgi için Movie sınıfını genişletin (Description, Genre, Actor, Director, Country, Duration, IMDb Score) ama bu örnek için yalnızca Description, Genre ve Actor kullanın. Türler ve aktörler için birden fazla değeri zarif bir şekilde ele almak, List<string> kullanarak mümkündür:
using System.Collections.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.Collections.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
Kazıma Sırasında Sayfa Gezinme Nasıl Yapılır?
Ayrıntılı sayfaya geçin ve kazıyın. IronWebScraper otomatik olarak iş parçacığı güvenliğini yönetir ve böylece birden fazla sayfanın eşzamanlı olarak işlenmesine izin verir.
Farklı Sayfa Türleri İçin Neden Birden Fazla Çözümleme Fonksiyonu Kullanılmalı?
IronWebScraper, farklı sayfa formatlarını işlemek için birden fazla kazıma fonksiyonu eklemeyi etkin kılar. Bu sorumluluk ayrımı, kodunuzu daha sürdürülebilir hale getirir ve farklı sayfa yapılarının uygun şekilde ele alınmasına imkân tanır. Her çözümleme fonksiyonu, belirli bir sayfa türünden veri çıkarmaya odaklanabilir.
MetaData, Çözümleme Fonksiyonları Arasında Nesne Geçişine Nasıl Yardımcı Olur?
MetaData özelliği, talepler arasında durumu korumak için çok önemlidir. ileri düzey web kazıma özellikleri hakkında daha fazla bilgi için detaylı rehberimize bakı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 neler?
- Bir alışveriş sitesinden kazıma yaparken kullanılan tekniklere benzer şekilde, ayrıntılı sayfaları kazıma fonksiyonları (
ParseDetails) ekleyin. - Verilerin yalnızca tüm detaylar toplandıktan sonra kaydedilmesini sağlayarak dosyalar üreten
Scrapefonksiyonunu yeni fonksiyona taşıyın. - Film nesnelerini yeni kazıma fonksiyonlarına iletmek ve talepler arasında nesne durumunu korumak için IronWebScraper özelliğini (
MetaData) kullanın. - Sayfaları kazıyın ve film nesne verilerini eksiksiz bilgi ile dosyalara kaydedin.
Mevcut yöntemler ve özellikler hakkında daha fazla bilgi için API Referansına başvurun. IronWebScraper, web sitelerinden yapılandırılmış veri çıkarmak için güçlü bir çerçeve sunar, 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.






