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

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

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

  1. IronWebScraper'ü NuGet Paket Yöneticisi üzerinden yükleyin
  2. WebScraper'den türetilen bir sınıf oluşturun
  3. Lisansı ayarlamak ve hedef URL'yi talep etmek için Init()'ü geçersiz kılın
  4. Film verilerini CSS seçicilerini kullanarak çıkarmak için Parse()'i geçersiz kılın
  5. Verileri JSON formatında kaydetmek için Scrape() 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

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:

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

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

Film posterlerinden oluşan ızgara ve gezinme sekmeleri ile kalite göstergelerine sahip film akış sitesi arayüzü

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

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

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

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

Typed Objects için Scrape Yöntemi Hangi Formatı Kullanır?

Yenilikler neler?

  1. Kazılan verileri tutmak için bir Movie sınıfı uyguladık, bu tür güvenliği sağladı ve kod organizasyonunu iyileştirdi.
  2. Film nesnelerini aşağıda gösterildiği gibi tanımlanmış bir şekilde kaydeden ve formatımızı anlayan Scrape yöntemine iletmekteyiz:

Başlıklar, URL'ler, ve meta veri alanlarını içeren yapılandırılmış film veritabanı içeren Not Defteri penceresi

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

Galaksinin Koruyucuları Vol. 2 film bilgi sayfası, oyuncu kadrosu ve puanlama ayrıntılarını içeren afiş ve 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 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
$vbLabelText   $csharpLabel

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

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

Yenilikler neler?

  1. Bir alışveriş sitesinden kazıma yaparken kullanılan tekniklere benzer şekilde, ayrıntılı sayfaları kazıma fonksiyonları (ParseDetails) ekleyin.
  2. Verilerin yalnızca tüm detaylar toplandıktan sonra kaydedilmesini sağlayarak dosyalar üreten Scrape fonksiyonunu yeni fonksiyona taşıyın.
  3. Film nesnelerini yeni kazıma fonksiyonlarına iletmek ve talepler arasında nesne durumunu korumak için IronWebScraper özelliğini (MetaData) kullanın.
  4. Sayfaları kazıyın ve film nesne verilerini eksiksiz bilgi ile dosyalara kaydedin.

Başlıklar, tanımlar, URL'ler ve tür meta verileri içeren film veritabanı içeren Not Defteri penceresi

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.

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 141,288 | Sürüm: 2026.7 yeni yayınlandı
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.