C# ve IronWebScraper kullanarak Çevrimiçi Film Web Sitesi Kazıma

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

IronWebScraper, film verilerini HTML ögelerini ayrıştırarak, yapılandırılmış veri depolama için türlendirilmiş nesneler yaratarak ve sayfalar arasında dolaşırken meta verileri kullanarak kapsamlı film bilgi veri setleri oluşturup sitelerden çeker. Bu C# Web Scraper kütüphanesi, yapısal olmayan web içeriğini organize, analiz edilebilir verilere dönüştürmeyi basitleştirir.

Hızlı Başlangıç: C#'ta Filmleri Kazıyın

  1. IronWebScraper'ı NuGet Paket Yöneticisi aracılığıyla yükleyin
  2. WebScraper sınıfından türetilen bir sınıf oluşturun
  3. Init() metodunu geçersiz kılarak lisansı ayarlayın ve hedef URL'yi talep edin
  4. Film verilerini CSS seçicileri kullanarak çıkarmak için Parse() metodunu geçersiz kılın
  5. Verileri JSON formatında kaydetmek için Scrape() metodunu kullanın
  1. NuGet Paket Yöneticisi ile https://www.nuget.org/packages/IronWebScraper yükleyin

    PM > Install-Package IronWebScraper
  2. Bu kod parçasını kopyalayıp ç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 etmek için dağıtın

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

    arrow pointer

Film Kazıyıcı Sınıfını Nasıl Kurarım?

Gerçek dünya web sitesi örneğiyle başlayın. Web Kazıma C# eğitimimizde açıklanan teknikleri kullanarak bir film web sitesini kazıyacağız.

Yeni bir sınıf ekleyin ve adını MovieScraper olarak koyun:

Visual C# şablon seçeneklerini gösteren, IronScraperSample proje Visual Studio Yeni Öğe ekleme iletişim kutusu

Özel bir kazıyıcı sınıfı oluşturmak, kodunuzu düzenli hale getirir ve tekrar kullanılabilir yapar. Bu yaklaşım, nesne yönelimli ilkeleri izler ve gelecekte işlevsellik eklemeyi kolaylaştırı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, etkili web kazıma için kritiktir. Çevrimiçi Film Web Sitesinden Kazıma rehberimize benzer şekilde, önce HTML yapısını analiz edin:

Hareketlilik sekmeleri ve kalite göstergeleri ile film posterlerinin ızgarasını gösteren film akışı web sitesi arayüzü

Hangi HTML Öğeleri Film Verilerini İçeriyor?

Bu, web sitesinde gördüğümüz ana sayfa HTML'inin bir parçasıdır. HTML yapısını incelemek, hangi CSS seçicilerini doğru kullanacağınızı belirlemenize 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

Bir film kimliği, başlık ve detaylı bir sayfaya bağlantımız var. Her film ml-item sınıfına sahip div elementi içinde bulunur ve tanımlama için benzersiz bir data-movie-id ö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, aşağıda gösterildiği gibi lisans anahtarınızı düzgün ş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 İçindir?

Bu koddaki yenilik ne?

Çalışma Dizini özelliği, kazınılan tüm veriler ve ilgili dosyalar için ana çalışma dizinini ayarlar. Bu, tüm çıktı dosyalarının tek bir yerde organize edilmesini sağlar, bu da büyük ölçekli kazıma projeleri yönetmeyi kolaylaştırır. Dizin mevcut değilse otomatik olarak oluşturulacaktır.

Ne Zaman CSS Seçicileri ve Öznitelikleri Kullanmalıyım?

Ek hususlar:

CSS seçicileri, yapısal konum veya sınıf adlarına göre eleman hedeflemek için idealdir; doğrudan öznitelik erişimi ise kimlikler 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 öznitelikleri (data-movie-id) kullanıyoruz.

Kazınılan Veriler İçin Türlendirilmiş Nesneleri Nasıl Oluşturabilirim?

Kazınılan verileri biçimli nesnelerde tutmak için türlendirilmiş nesneler oluşturun. Güçlü türde nesneler kullanmak, daha iyi kod organizasyonu, IntelliSense desteği ve derleme zamanında tür denetlemeyi 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
$vbLabelText   $csharpLabel

Türlendirilmiş Nesneler Kullanarak Veri Organizasyonu Nasıl Gelişir?

Kodu güncelleyerek genel ScrapedData sözlüğü yerine türlendirilmiş Movie sınıfını kullanı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://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

Kazıma Yöntemi Türlendirilmiş Nesneler İçin Hangi Formatı Kullanır?

Yenilik nedir?

  1. Kazınmış verileri tutmak için tür güvenliği ve daha iyi kod organizasyonu sağlayan bir Movie sınıfı uyguladık.
  2. Aşağıda gösterildiği gibi formatımızı anlayan Scrape metoduna film nesnelerini geçiriyoruz ve tanımlanan bir şekilde kaydediyoruz.

Yapılandırılmış film verileri, başlıklar, URL'ler ve meta veri alanlarını içeren JSON film veritabanını gösteren Notepad penceresi

Çıktı otomatik olarak JSON formatında serileştirilir, bu da veritabanlarına veya diğer uygulamalara kolayca aktarılmasını sağlar.

Detaylı Film Sayfalarını Nasıl Kazırım?

Daha detaylı sayfaları kazımaya başlayın. Çoklu sayfa kazıma yaygın bir gerekliliktir ve IronWebScraper, istek zincirleme mekanizması aracılığıyla bunu basit hale getirir.

Detay Sayfalarından Ekstra Hangi Verileri Çıkarabilirim?

Film Sayfası, her film hakkında zengin meta veriler içeren bu şekilde görünüyor:

Galaksinin Koruyucuları Vol. 2 film bilgi sayfası, afiş ve oyuncu kadrosu ve derecelendirmeler dahil film detayları ile

<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 Film Sınıfımı Nasıl Genişletmeliyim?

Yeni özellikler (Description, Genre, Actor, Director, Country, Duration, IMDb Score) ile Movie sınıfını genişletin ancak bu örnek için yalnızca Description, Genre ve Actor kullanın. Türler ve aktörler için List<string> kullanarak birden çok değeri zarif bir şekilde ele almak mümkün olur:

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

Sayfalar Arasında Kazıma Yaparken Nasıl Dolaşabilirim?

Kazımak için detay sayfasına gidin. IronWebScraper iş parçacığı güvenliğini otomatik olarak yönetir, bu sayede birden fazla sayfa eşzamanlı olarak işlenebilir.

Farklı Sayfa Türleri İçin Neden Birden Çok Ayrıştırma Fonksiyonu Kullanmalıyım?

IronWebScraper, farklı sayfa formatlarını işlemek için birden fazla kazıma fonksiyonu eklemenizi sağlar. Bu endişe ayırma, kodunuzu daha sürdürülebilir hale getirir ve farklı sayfa yapılarının uygun şekilde ele alınmasını sağlar. Her bir ayrıştırma fonksiyonu, belirli bir sayfa türünden veri çıkarmaya odaklanabilir.

MetaData, Ayrıştırma Fonksiyonları Arasında Nesneleri Aktarmaya Nasıl Yardımcı Olur?

MetaData özelliği, istekler arasında durumu korumak için kritiktir. Daha fazlası için gelişmiş web kazıma özellikleri, kapsamlı rehberimize 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?

Yenilik nedir?

  1. Detaylı sayfaları kazımak için kazıma fonksiyonları ekleyin (örn. ParseDetails), alışveriş sitesinden kazıma yaparken kullanılan tekniklere benzer.
  2. Dosya üreten Scrape fonksiyonunu yeni fonksiyona taşıyın, böylece veriler yalnızca tüm detaylar toplandıktan sonra kaydedilir.
  3. Nesne durumunu talepler arasında koruyarak film nesnelerini yeni kazıma fonksiyonlarına geçirmek için IronWebScraper özelliğini (MetaData) kullanın.
  4. Sayfaları kazıyın ve film nesne verilerini eksiksiz bilgiyle dosyalara kaydedin.

Film başlıkları, açıklamalar, URL'ler ve tür meta verileri ile JSON film veritabanını gösteren Not Defteri penceresi

Kullanılabilir yöntemler ve özellikler hakkında daha fazla bilgi için API Referansi'na danışın. IronWebScraper, web sitelerinden yapılandırılmış veri çıkarmak için sağlam bir çerçeve sağlar ve veri toplama ve analiz projeleri için vazgeçilmez bir araç haline getirir.

Sıkça Sorulan Sorular

HTML kullanarak C# ile film başlıklarını nasıl çıkarırım?

IronWebScraper, HTML'den film başlıklarını çıkarmak için CSS seçici yöntemleri sağlar. Başlık öğelerini 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 ile ele alır. Sayfalardan veri kazımak için CSS seçicilerini kullanarak sayfalandırma bağlantılarını çıkarabilir, ardından her URL ile birlikte Sayfalandırma() çağırabilirsiniz, böylece kapsamlı film veri kümeleri otomatik olarak oluşturulur.

Kazınmış film verilerini yapılandırılmış bir formatta nasıl kaydedebilirim?

IronWebScraper'ın Scrape() yöntemini kullanarak verileri JSON formatında kaydedin. Başlık, URL ve derecelendirme gibi film özelliklerini içeren anonim nesneler veya tiplendirilmiş sınıflar oluşturun, ardından Scrape()'e bir dosya adı ile birlikte geçirerek verileri otomatik olarak serileştirin ve kaydedin.

Film bilgilerini çıkarmak için hangi CSS seçicilerini kullanmam gerekiyor?

IronWebScraper, standart CSS seçicilerini destekler. Film web siteleri için, kapsayıcılara '.movie-item', başlıklara 'h2', bağlantılar için 'a[href]' ve dereceler veya türlere özgü sınıf adlarına seçiciler kullanın. Css() yöntemi, üzerinde döngü yapabileceğiniz koleksiyonlar döndürür.

Kazınmış verilerde 'CAM' gibi film kalitesi göstergelerini nasıl ele alırım?

IronWebScraper, belirli HTML öğelerini hedef alarak kalite göstergelerini çıkarmanıza ve işlemenize izin verir. Kalite rozetlerini veya metinlerini belirlemek için CSS seçicilerini kullanın, ardından bunları kapsamlı film bilgileri için kazınmış veri nesnelerinize özellikler olarak dahil edin.

Film kazıma işlemlerim için kayıt defteri ayarlayabilir miyim?

Evet, IronWebScraper yerleşik kayıt defteri işlevselliği içerir. Init() yönteminizde, kazıma etkinlikleri, hatalar ve ilerlemeyi izlemek için LoggingLevel özelliğini LogLevel.All olarak ayarlayın, bu da film veri çıkarımınızı hata ayıklamaya ve izlemenize yardımcı olur.

Kazınmış veriler için çalışma dizinlerini doğru bir şekilde nasıl yapılandırırım?

IronWebScraper, Init() yönteminde WorkingDirectory özelliğini ayarlamanıza olanak tanır. Kazınmış film verisi dosyalarının kaydedileceği 'C:\MovieData\Output\' gibi bir yol belirtin. Bu, çıkış yönetimini merkezileştirir ve verilerinizi düzenli tutar.

WebScraper sınıfından doğru bir şekilde nasıl türetilirim?

IronWebScraper'ın WebScraper temel sınıfından türeyen yeni bir sınıf oluşturun. Yapılandırma için Init() yöntemini ve veri çıkarım mantığı için Parse() yöntemini geçersiz kılın. Bu nesne yönelimli yaklaşım, film kazıyıcınızı yeniden kullanılabilir ve sürdürülebilir kılar.

Darrius Serrant
Tam Yığın Yazılım Mühendisi (WebOps)

Darrius Serrant, Miami Üniversitesi'nden Bilgisayar Bilimleri lisans derecesine sahiptir ve Iron Software'de Tam Yığın WebOps Pazarlama Mühendisi olarak çalışmaktadır. Küçük yaşlardan itibaren kodlamaya ilgi duyan Darrius, bilişimi hem gizemli hem de erişilebilir buldu ve onu yaratıcılık ve problem çö...

Daha Fazlasını Oku
Başlamaya Hazır mısınız?
Nuget İndirmeler 134,614 | Sürüm: 2026.4 just released
Still Scrolling Icon

Hala Kaydiriyor musunuz?

Hızlı bir kanit mi istiyorsunuz? PM > Install-Package IronWebScraper
bir örneği çalıştır hedef sitenizi yapılandırılmış veri haline getirin.