C# ve IronWebScraper kullanarak bir çevrimiçi film web sitesinden veri kazıma

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

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

  1. NuGet Paket Yöneticisi aracılığıyla IronWebScraper'yi yükleyin
  2. ``'dan miras alan bir sınıf oluşturun
  3. `` işlevini geçersiz kılın, lisansı ayarlayın ve hedef URL'yi isteyin
  4. CSS seçicileri kullanarak film verilerini çıkarmak için ``'yi geçersiz kılın
  5. Verileri JSON formatında kaydetmek için `` yöntemini kullanın
  1. IronWebScraper aşağıdaki NuGet Paket Yöneticisi ile yükleyin

    PM > Install-Package IronWebScraper
  2. 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();
  3. Canlı ortamınızda test için dağıtım yapın

    Ücretsiz deneme ile bugün projenizde IronWebScraper kullanmaya başlayın

    arrow pointer

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:

IronScraperSample projesi için C# şablon seçeneklerini gösteren Visual Studio Yeni Öğe Ekle iletişim kutusu

Ö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:

Navigasyon sekmeleri ve kalite göstergeleri içeren film afişlerinden oluşan bir ızgara gösteren film izleme web sitesi arayüzü

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>
HTML

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
$vbLabelText   $csharpLabel

Ç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 &gt; 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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

Scrape Yöntemi, Tipli Nesneler İçin Hangi Biçimi Kullanır?

Yenilikler

  1. 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.
  2. Film nesnelerini, formatımızı anlayan ve aşağıda gösterildiği gibi tanımlanmış bir şekilde kaydeden `` yöntemine aktarıyoruz:

Başlıklar, URL'ler ve meta veri alanları dahil olmak üzere yapılandırılmış film verilerini içeren JSON film veritabanını gösteren Not Defteri penceresi

Çı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:

Guardians of the Galaxy Vol. 2 film bilgi sayfası; afiş ve oyuncu kadrosu ile derecelendirmeler dahil film detayları

<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

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. Türler ve oyuncular için @@--CODE-369--string>@@Liststring>@@--CODEstring>-370--@@ kullanımı, birden fazla değeri zarif bir şekilde işlemeyi sağlar:

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

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
$vbLabelText   $csharpLabel

Bu Çok Sayfalı Kazıma Yaklaşımının Temel Özellikleri Nelerdir?

Yenilikler

  1. 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.
  2. 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.
  3. IronWebScraper özelliğini (``) kullanarak film nesnelerini yeni kazıma işlevlerine aktarın ve istekler arasında nesne durumunu koruyun.
  4. Sayfaları kazıyın ve film nesnesi verilerini eksiksiz bilgilerle dosyalara kaydedin.

Film başlıkları, açıklamaları, URL'leri ve tür meta verilerini içeren JSON film veritabanını gösteren Not Defteri penceresi

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.

Curtis Chau
Teknik Yazar

Curtis Chau, Bilgisayar Bilimleri alanında Lisans Derecesine (Carleton Üniversitesi) sahip ve Node.js, TypeScript, JavaScript ve React konularında uzmanlaşmış ön uç geliştirmeyle ilgileniyor. Sezgisel ve estetik açıdan hoş kullanıcı arayüzleri oluşturma tutkunu, Curtis modern çerçevelerle çalışmayı ve iyi yapı...

Daha Fazla Oku
Başlamaya Hazır mısınız?
Nuget İndirmeler 137,906 | Sürüm: 2026.6 just released
Still Scrolling Icon

Hâlâ Kaydırıyor Musunuz?

Hızlıca kanıt ister misiniz? PM > Install-Package IronWebScraper
örnek çalıştır hedef sitenizi yapılandırılmış verilere dönüştürün.