How to Scrape Data from Websites in C

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

IronWebscraper, web kazıma, web veri çıkarma ve web içerik çözümleme için bir .NET Kütüphanesidir. Microsoft Visual Studio projelerine gelişim ve üretim aşamasında kullanmak üzere eklenebilecek kullanımı kolay bir kütüphanedir.

IronWebscraper, izin verilen ve yasaklanan sayfalar, nesneler, medya vb. gibi çok sayıda benzersiz özellik ve kabiliyete sahiptir. Bu eğitimde kapsayacağımız birçok özelliğin yanı sıra çoklu kimliklerin, web önbelleğinin ve birçok başka özelliğin yönetilmesine de olanak tanır.

IronWebscraper ile başlayın

!{--0100110001001001010000100101001001000001010100100101100101011111--}


Hedef Kitle

Bu eğitim, ileri düzey kazıma yetenekleri (web sitesi kazıma, web sitesi veri toplama ve çıkarma, web sitesi içerik çözümleme, web hasadı) için çözümler oluşturmak ve uygulamak isteyen temel veya ileri programlama becerilerine sahip yazılım geliştirici hedefler.

Webscraping Görüntüsü

Gerekli Beceriler

  1. C# veya VB.NET gibi Microsoft Programlama dillerinden biriyle programlama temel becerileri
  2. Web Teknolojilerinin (HTML, JavaScript, JQuery, CSS, vb.) temel bilgisi ve nasıl çalıştıkları
  3. DOM, XPath, HTML ve CSS Seçiciler hakkında temel bilgi

Araçlar

  1. Microsoft Visual Studio 2010 veya üstü
  2. Chrome için web denetleyici veya Firefox için Firebug gibi tarayıcılar için web geliştirici eklentileri

Neden Kazıma Yapılır? (Reasons and Concepts)

Eğer şu yeteneklere sahip bir ürün veya çözüm oluşturmak istiyorsanız:

  1. Web sitesi verilerini çıkartma
  2. Ancak içerikler, fiyatlar, özellikler, vb. birden fazla web sitesinden karşılaştırma
  3. Web sitesi içeriğini tarama ve önbellekleme

Yukarıdaki nedenlerden bir veya daha fazlasına sahipseniz, IronWebscraper ihtiyaçlarınız için harika bir kütüphanedir

IronWebScraper Nasıl Kurulur?

Yeni Bir Proje Oluşturduktan Sonra (Bkz. Ek A) IronWebScraper kütüphanesini, kütüphaneyi NuGet kullanarak otomatik olarak veya DLL'yi manuel olarak kurarak projenize ekleyebilirsiniz.

NuGet Kullanarak Kurulum

IronWebScraper kütüphanesini projemize NuGet kullanarak eklemek için görsel arayüzü (NuGet Paket Yöneticisi) veya Paket Yöneticisi Konsolunu kullanarak komutla yapabiliriz.

NuGet Paket Yöneticisini Kullanma

  1. Farenizi kullanarak -> proje adına sağ tıklayın -> NuGet Paketini yönet'i seçin
  2. Gezinti sekmesinden -> IronWebScraper arayın -> Yükle
  3. Tamam'a tıklayın
  4. Ve tamamız

NuGet Paket Konsolunu Kullanma

  1. Araçlardan -> NuGet Paket Yöneticisi -> Paket Yöneticisi Konsolu
  2. Varsayılan Proje Olarak Sınıf Kütüphanesi Projesini Seçin
  3. Komutu çalıştırın -> Install-Package IronWebScraper

Manuel Kurulum

  1. https://ironsoftware.com adresine gidin
  2. IronWebScraper'a tıklayın veya URL https://ironsoftware.com/csharp/webscraper/ kullanarak sayfasını doğrudan ziyaret edin
  3. DLL'yi İndir'e tıklayın.
  4. İndirilen sıkıştırılmış dosyayı çıkarın
  5. Visual Studio'da projeye sağ tıklayın -> ekle -> referans -> göz at

    IronWebscraper'i DLL Kullanarak Ekleyin

  6. Çıkarılan klasöre gidin -> netstandard2.0 -> ve tüm .dll dosyalarını seçin

    IronWebscraper'i DLL Kullanarak Ekleyin 2

  7. Ve tamamlandı!

HelloScraper - İlk IronWebScraper Örneğimiz

Her zamanki gibi, IronWebScraper kullanarak ilk adımımızı atmak için Hello Scraper Uygulamasını uygulayarak başlayacağız.

  • "IronWebScraperSample" adlı Yeni Bir Konsol Uygulaması Oluşturduk

IronWebScraper Örneği Oluşturma Adımları

  1. Bir Klasör Oluşturun ve adını 'HelloScraperSample' olarak adlandırın
  2. Ardından yeni bir sınıf ekleyin ve adını 'HelloScraper' olarak adlandırın HelloScraper Sınıf Ekle

  3. Bu Kod parçasını HelloScraper'a ekleyin

    public class HelloScraper : WebScraper
    {
        /// <summary>
        /// Override this method to initialize your web scraper.
        /// Important tasks will be to request at least one start URL and set allowed/banned domain or URL patterns.
        /// </summary>
        public override void Init()
        {
            License.LicenseKey = "LicenseKey"; // Write License Key
            this.LoggingLevel = WebScraper.LogLevel.All; // Log all events
            this.Request("https://blog.scrapinghub.com", Parse); // Initialize a web request to the given URL
        }
    
        /// <summary>
        /// Override this method to create the default Response handler for your web scraper.
        /// If you have multiple page types, you can add additional similar methods.
        /// </summary>
        /// <param name="response">The HTTP Response object to parse</param>
        public override void Parse(Response response)
        {
            // Set working directory for the project
            this.WorkingDirectory = AppSetting.GetAppRoot() + @"\HelloScraperSample\Output\";
            // Loop on all links
            foreach (var titleLink in response.Css("h2.entry-title a"))
            {
                // Read link text
                string title = titleLink.TextContentClean;
                // Save result to file
                Scrape(new ScrapedData() { { "Title", title } }, "HelloScraper.json");
            }
    
            // Loop on all links for pagination
            if (response.CssExists("div.prev-post > a[href]"))
            {
                // Get next page URL
                var nextPage = response.Css("div.prev-post > a[href]")[0].Attributes["href"];
                // Scrape next URL
                this.Request(nextPage, Parse);
            }
        }
    }
    public class HelloScraper : WebScraper
    {
        /// <summary>
        /// Override this method to initialize your web scraper.
        /// Important tasks will be to request at least one start URL and set allowed/banned domain or URL patterns.
        /// </summary>
        public override void Init()
        {
            License.LicenseKey = "LicenseKey"; // Write License Key
            this.LoggingLevel = WebScraper.LogLevel.All; // Log all events
            this.Request("https://blog.scrapinghub.com", Parse); // Initialize a web request to the given URL
        }
    
        /// <summary>
        /// Override this method to create the default Response handler for your web scraper.
        /// If you have multiple page types, you can add additional similar methods.
        /// </summary>
        /// <param name="response">The HTTP Response object to parse</param>
        public override void Parse(Response response)
        {
            // Set working directory for the project
            this.WorkingDirectory = AppSetting.GetAppRoot() + @"\HelloScraperSample\Output\";
            // Loop on all links
            foreach (var titleLink in response.Css("h2.entry-title a"))
            {
                // Read link text
                string title = titleLink.TextContentClean;
                // Save result to file
                Scrape(new ScrapedData() { { "Title", title } }, "HelloScraper.json");
            }
    
            // Loop on all links for pagination
            if (response.CssExists("div.prev-post > a[href]"))
            {
                // Get next page URL
                var nextPage = response.Css("div.prev-post > a[href]")[0].Attributes["href"];
                // Scrape next URL
                this.Request(nextPage, Parse);
            }
        }
    }
    Public Class HelloScraper
    	Inherits WebScraper
    
    	''' <summary>
    	''' Override this method to initialize your web scraper.
    	''' Important tasks will be to request at least one start URL and set allowed/banned domain or URL patterns.
    	''' </summary>
    	Public Overrides Sub Init()
    		License.LicenseKey = "LicenseKey" ' Write License Key
    		Me.LoggingLevel = WebScraper.LogLevel.All ' Log all events
    		Me.Request("https://blog.scrapinghub.com", AddressOf Parse) ' Initialize a web request to the given URL
    	End Sub
    
    	''' <summary>
    	''' Override this method to create the default Response handler for your web scraper.
    	''' If you have multiple page types, you can add additional similar methods.
    	''' </summary>
    	''' <param name="response">The HTTP Response object to parse</param>
    	Public Overrides Sub Parse(ByVal response As Response)
    		' Set working directory for the project
    		Me.WorkingDirectory = AppSetting.GetAppRoot() & "\HelloScraperSample\Output\"
    		' Loop on all links
    		For Each titleLink In response.Css("h2.entry-title a")
    			' Read link text
    			Dim title As String = titleLink.TextContentClean
    			' Save result to file
    			Scrape(New ScrapedData() From {
    				{ "Title", title }
    			},
    			"HelloScraper.json")
    		Next titleLink
    
    		' Loop on all links for pagination
    		If response.CssExists("div.prev-post > a[href]") Then
    			' Get next page URL
    			Dim nextPage = response.Css("div.prev-post > a[href]")(0).Attributes("href")
    			' Scrape next URL
    			Me.Request(nextPage, AddressOf Parse)
    		End If
    	End Sub
    End Class
    $vbLabelText   $csharpLabel
  4. Şimdi Kazıma işlemini başlatmak için bu kod parçasını Main'e ekleyin

    static void Main(string[] args)
    {
        // Create Object From Hello Scrape class
        HelloScraperSample.HelloScraper scrape = new HelloScraperSample.HelloScraper();
        // Start Scraping
        scrape.Start();
    }
    static void Main(string[] args)
    {
        // Create Object From Hello Scrape class
        HelloScraperSample.HelloScraper scrape = new HelloScraperSample.HelloScraper();
        // Start Scraping
        scrape.Start();
    }
    Shared Sub Main(ByVal args() As String)
    	' Create Object From Hello Scrape class
    	Dim scrape As New HelloScraperSample.HelloScraper()
    	' Start Scraping
    	scrape.Start()
    End Sub
    $vbLabelText   $csharpLabel
  5. Sonuç, WebScraper.WorkingDirectory/classname.Json formatında bir dosyaya kaydedilecek HelloScraper Sonuc

Kod Genel Bakış

Scrape.Start() aşağıdaki gibi scraping mantığını tetikler:

  1. Değişkenleri başlatmak, scrape özelliklerini ve davranış niteliklerini ayarlamak için Init() metodunu çağırır.
  2. Init() de Request("https://blog.scrapinghub.com", Parse) ile başlangıç sayfası isteğini ayarlar.
  3. Birden fazla HTTP isteğini ve iş parçacığını paralel olarak yönetir, kodu eşzamanlı ve hata ayıklamayı kolay hale getirir.
  4. Parse() metodu, yanıtı işlemek, verileri CSS seçiciler kullanarak çıkarmak ve JSON formatında kaydetmek için Init() sonrası tetiklenir.

IronWebScraper Kütüphane Fonksiyonları ve Seçenekleri

Güncellenmiş dokümantasyon, manuel kurulum yöntemiyle indirilen zip dosyasının içinde bulunabilir (IronWebScraper Documentation.chm File), ya da kütüphanenin son güncellemesi için çevrimiçi dokümantasyona https://ironsoftware.com/csharp/webscraper/object-reference/ adresinden bakabilirsiniz.

Projenizde IronWebScraper'i kullanmaya başlamak için IronWebScraper.WebScraper sınıfından miras alınmalıdır, bu sınıf kütüphanenizi genişletir ve scraping işlevselliği ekler. Ayrıca, Init() ve Parse(Response response) metodlarını uygulamanız gerekir.

namespace IronWebScraperEngine
{
    public class NewsScraper : IronWebScraper.WebScraper
    {
        public override void Init()
        {
            throw new NotImplementedException();
        }

        public override void Parse(Response response)
        {
            throw new NotImplementedException();
        }
    }
}
namespace IronWebScraperEngine
{
    public class NewsScraper : IronWebScraper.WebScraper
    {
        public override void Init()
        {
            throw new NotImplementedException();
        }

        public override void Parse(Response response)
        {
            throw new NotImplementedException();
        }
    }
}
Namespace IronWebScraperEngine
	Public Class NewsScraper
		Inherits IronWebScraper.WebScraper

		Public Overrides Sub Init()
			Throw New NotImplementedException()
		End Sub

		Public Overrides Sub Parse(ByVal response As Response)
			Throw New NotImplementedException()
		End Sub
	End Class
End Namespace
$vbLabelText   $csharpLabel
Özellikler \ fonksiyonlar Tür Açıklama
Init () Yöntem Kazıyıcıyı kurmak için kullanılır
Parse (Response response) Yöntem Kazıyıcının kullanacağı mantığı ve nasıl işleyeceğini uygulamak için kullanılır. Farklı sayfa davranışları veya yapıları için birden fazla yöntem uygulayabilir.
BannedUrls, AllowedUrls, BannedDomains Koleksiyonlar URL'leri ve/veya etki alanlarını yasaklamak/izin vermek için kullanılır. Or: BannedUrls.Add("*.zip", "*.exe", "*.gz", "*.pdf"); Yıldız işaretlerini ve regular ifadeleri destekler.
ObeyRobotsDotTxt Boolean Okumayı etkinleştirmek veya devre dışı bırakmak için robots.txt direktiflerini takip eder.
ObeyRobotsDotTxtForHost (string Host) Yöntem Belirli bir alan adı için robots.txt direktiflerini okumayı etkinleştirmek veya devre dışı bırakmak için kullanılır.
Scrape, ScrapeUnique Yöntem
ThrottleMode Sıralama Enum Seçenekleri: ByIpAddress, ByDomainHostName. Host IP adreslerine veya domain hostname'lerine saygılı akıllı istek kısıtlama sağlanır.
EnableWebCache, EnableWebCache (TimeSpan cacheDuration) Yöntem Web istekleri için önbellek sağlanır.
MaxHttpConnectionLimit Int Açık HTTP isteklerine (iş parçacıkları) izin verilen toplam sayıyı ayarlar.
RateLimitPerHost TimeSpan Verilen bir etki alanına veya IP adresine olan istekler arasında minimum kibar gecikmeyi (duraklatma) ayarlar.
OpenConnectionLimitPerHost Int Bir hostname veya IP adresi başına izin verilen eşzamanlı HTTP isteklerinin (iş parçacıkları) sayısını ayarlar.
WorkingDirectory string Veri depolama için bir çalışma dizini yolunu ayarlar.

Gerçek Dünya Örnekleri ve Uygulamalar

Çevrimiçi Bir Film Web Sitesi Kazıma

Bir film web sitesi kazıyacağımız bir örnek oluşturalım.

Yeni bir sınıf ekleyin ve ona MovieScraper adını verin:

MovieScraper Sınıf Ekle

HTML Yapısı

Bu, web sitesinde gördüğümüz ana sayfa HTML'sinin bir parçasıdır:

<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

Gördüğümüz gibi, bir film kimliği, Başlık ve Ayrıntılı Sayfaya Bir Bağlantıya sahibiz. Bu verileri kazımaya başlayalım:

public class MovieScraper : WebScraper
{
    public override void Init()
    {
        License.LicenseKey = "LicenseKey";
        this.LoggingLevel = WebScraper.LogLevel.All;
        this.WorkingDirectory = AppSetting.GetAppRoot() + @"\MovieSample\Output\";
        this.Request("www.website.com", Parse);
    }

    public override void Parse(Response response)
    {
        foreach (var div in response.Css("#movie-featured > div"))
        {
            if (div.GetAttribute("class") != "clearfix")
            {
                var movieId = div.GetAttribute("data-movie-id");
                var link = div.Css("a")[0];
                var movieTitle = link.TextContentClean;
                Scrape(new ScrapedData() { { "MovieId", movieId }, { "MovieTitle", movieTitle } }, "Movie.Jsonl");
            }
        }           
    }
}
public class MovieScraper : WebScraper
{
    public override void Init()
    {
        License.LicenseKey = "LicenseKey";
        this.LoggingLevel = WebScraper.LogLevel.All;
        this.WorkingDirectory = AppSetting.GetAppRoot() + @"\MovieSample\Output\";
        this.Request("www.website.com", Parse);
    }

    public override void Parse(Response response)
    {
        foreach (var div in response.Css("#movie-featured > div"))
        {
            if (div.GetAttribute("class") != "clearfix")
            {
                var movieId = div.GetAttribute("data-movie-id");
                var link = div.Css("a")[0];
                var movieTitle = link.TextContentClean;
                Scrape(new ScrapedData() { { "MovieId", movieId }, { "MovieTitle", movieTitle } }, "Movie.Jsonl");
            }
        }           
    }
}
Public Class MovieScraper
	Inherits WebScraper

	Public Overrides Sub Init()
		License.LicenseKey = "LicenseKey"
		Me.LoggingLevel = WebScraper.LogLevel.All
		Me.WorkingDirectory = AppSetting.GetAppRoot() & "\MovieSample\Output\"
		Me.Request("www.website.com", AddressOf Parse)
	End Sub

	Public Overrides Sub Parse(ByVal response As Response)
		For Each div In response.Css("#movie-featured > div")
			If div.GetAttribute("class") <> "clearfix" Then
				Dim movieId = div.GetAttribute("data-movie-id")
				Dim link = div.Css("a")(0)
				Dim movieTitle = link.TextContentClean
				Scrape(New ScrapedData() From {
					{ "MovieId", movieId },
					{ "MovieTitle", movieTitle }
				},
				"Movie.Jsonl")
			End If
		Next div
	End Sub
End Class
$vbLabelText   $csharpLabel

Yapılandırılmış Film Sınıfı

Formatlı verilerimizi barındırmak için bir film sınıfı uygulayalım:

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

Şimdi kodumuzu Film sınıfını kullanacak şekilde güncelleyelim:

public class MovieScraper : WebScraper
{
    public override void Init()
    {
        License.LicenseKey = "LicenseKey";
        this.LoggingLevel = WebScraper.LogLevel.All;
        this.WorkingDirectory = AppSetting.GetAppRoot() + @"\MovieSample\Output\";
        this.Request("https://website.com/", Parse);
    }

    public override void Parse(Response response)
    {
        foreach (var div in response.Css("#movie-featured > div"))
        {
            if (div.GetAttribute("class") != "clearfix")
            {
                var movie = new Movie
                {
                    Id = Convert.ToInt32(div.GetAttribute("data-movie-id")),
                    Title = div.Css("a")[0].TextContentClean,
                    URL = div.Css("a")[0].Attributes["href"]
                };
                Scrape(movie, "Movie.Jsonl");
            }
        }
    }
}
public class MovieScraper : WebScraper
{
    public override void Init()
    {
        License.LicenseKey = "LicenseKey";
        this.LoggingLevel = WebScraper.LogLevel.All;
        this.WorkingDirectory = AppSetting.GetAppRoot() + @"\MovieSample\Output\";
        this.Request("https://website.com/", Parse);
    }

    public override void Parse(Response response)
    {
        foreach (var div in response.Css("#movie-featured > div"))
        {
            if (div.GetAttribute("class") != "clearfix")
            {
                var movie = new Movie
                {
                    Id = Convert.ToInt32(div.GetAttribute("data-movie-id")),
                    Title = div.Css("a")[0].TextContentClean,
                    URL = div.Css("a")[0].Attributes["href"]
                };
                Scrape(movie, "Movie.Jsonl");
            }
        }
    }
}
Public Class MovieScraper
	Inherits WebScraper

	Public Overrides Sub Init()
		License.LicenseKey = "LicenseKey"
		Me.LoggingLevel = WebScraper.LogLevel.All
		Me.WorkingDirectory = AppSetting.GetAppRoot() & "\MovieSample\Output\"
		Me.Request("https://website.com/", AddressOf Parse)
	End Sub

	Public Overrides Sub Parse(ByVal response As Response)
		For Each div In response.Css("#movie-featured > div")
			If div.GetAttribute("class") <> "clearfix" Then
				Dim movie As New Movie With {
					.Id = Convert.ToInt32(div.GetAttribute("data-movie-id")),
					.Title = div.Css("a")(0).TextContentClean,
					.URL = div.Css("a")(0).Attributes("href")
				}
				Scrape(movie, "Movie.Jsonl")
			End If
		Next div
	End Sub
End Class
$vbLabelText   $csharpLabel

Ayrıntılı Sayfa Kazıma

Film sınıfımıza yeni ayrıntılı bilgi özellikleri eklemek için genişletelim:

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; }
}
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; }
}
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

Gelişmiş IronWebScraper yeteneklerini kullanarak, Ayrıntılı sayfaya gidip onu kazımak için gezinin:

public class MovieScraper : WebScraper
{
    public override void Init()
    {
        License.LicenseKey = "LicenseKey";
        this.LoggingLevel = WebScraper.LogLevel.All;
        this.WorkingDirectory = AppSetting.GetAppRoot() + @"\MovieSample\Output\";
        this.Request("https://domain/", Parse);
    }

    public override void Parse(Response response)
    {
        foreach (var div in response.Css("#movie-featured > div"))
        {
            if (div.GetAttribute("class") != "clearfix")
            {
                var movie = new Movie
                {
                    Id = Convert.ToInt32(div.GetAttribute("data-movie-id")),
                    Title = div.Css("a")[0].TextContentClean,
                    URL = div.Css("a")[0].Attributes["href"]
                };
                this.Request(movie.URL, ParseDetails, new MetaData() { { "movie", movie } });
            }
        }           
    }

    public void ParseDetails(Response response)
    {
        var movie = response.MetaData.Get<Movie>("movie");
        var div = response.Css("div.mvic-desc")[0];
        movie.Description = div.Css("div.desc")[0].TextContentClean;
        movie.Genre = div.Css("div > p > a").Select(element => element.TextContentClean).ToList();
        movie.Actor = div.Css("div > p:nth-child(2) > a").Select(element => element.TextContentClean).ToList();

        Scrape(movie, "Movie.Jsonl");
    }
}
public class MovieScraper : WebScraper
{
    public override void Init()
    {
        License.LicenseKey = "LicenseKey";
        this.LoggingLevel = WebScraper.LogLevel.All;
        this.WorkingDirectory = AppSetting.GetAppRoot() + @"\MovieSample\Output\";
        this.Request("https://domain/", Parse);
    }

    public override void Parse(Response response)
    {
        foreach (var div in response.Css("#movie-featured > div"))
        {
            if (div.GetAttribute("class") != "clearfix")
            {
                var movie = new Movie
                {
                    Id = Convert.ToInt32(div.GetAttribute("data-movie-id")),
                    Title = div.Css("a")[0].TextContentClean,
                    URL = div.Css("a")[0].Attributes["href"]
                };
                this.Request(movie.URL, ParseDetails, new MetaData() { { "movie", movie } });
            }
        }           
    }

    public void ParseDetails(Response response)
    {
        var movie = response.MetaData.Get<Movie>("movie");
        var div = response.Css("div.mvic-desc")[0];
        movie.Description = div.Css("div.desc")[0].TextContentClean;
        movie.Genre = div.Css("div > p > a").Select(element => element.TextContentClean).ToList();
        movie.Actor = div.Css("div > p:nth-child(2) > a").Select(element => element.TextContentClean).ToList();

        Scrape(movie, "Movie.Jsonl");
    }
}
Public Class MovieScraper
	Inherits WebScraper

	Public Overrides Sub Init()
		License.LicenseKey = "LicenseKey"
		Me.LoggingLevel = WebScraper.LogLevel.All
		Me.WorkingDirectory = AppSetting.GetAppRoot() & "\MovieSample\Output\"
		Me.Request("https://domain/", AddressOf Parse)
	End Sub

	Public Overrides Sub Parse(ByVal response As Response)
		For Each div In response.Css("#movie-featured > div")
			If div.GetAttribute("class") <> "clearfix" Then
				Dim movie As New Movie With {
					.Id = Convert.ToInt32(div.GetAttribute("data-movie-id")),
					.Title = div.Css("a")(0).TextContentClean,
					.URL = div.Css("a")(0).Attributes("href")
				}
				Me.Request(movie.URL, AddressOf ParseDetails, New MetaData() From {
					{ "movie", movie }
				})
			End If
		Next div
	End Sub

	Public Sub ParseDetails(ByVal response As Response)
		Dim movie = response.MetaData.Get(Of Movie)("movie")
		Dim div = response.Css("div.mvic-desc")(0)
		movie.Description = div.Css("div.desc")(0).TextContentClean
		movie.Genre = div.Css("div > p > a").Select(Function(element) element.TextContentClean).ToList()
		movie.Actor = div.Css("div > p:nth-child(2) > a").Select(Function(element) element.TextContentClean).ToList()

		Scrape(movie, "Movie.Jsonl")
	End Sub
End Class
$vbLabelText   $csharpLabel

IronWebScraper Kütüphanesi Özellikleri

HttpIdentity Özelliği

Bazı sistemler içeriği görmek için kullanıcının oturum açmış olmasını gerektirir; kimlik bilgileri için HttpIdentity kullanın:

HttpIdentity id = new HttpIdentity
{
    NetworkUsername = "username",
    NetworkPassword = "pwd"
};
Identities.Add(id);
HttpIdentity id = new HttpIdentity
{
    NetworkUsername = "username",
    NetworkPassword = "pwd"
};
Identities.Add(id);
Dim id As New HttpIdentity With {
	.NetworkUsername = "username",
	.NetworkPassword = "pwd"
}
Identities.Add(id)
$vbLabelText   $csharpLabel

Web Önbelleğini Etkinleştir

Geliştirme sırasında tekrar kullanım için istenen sayfaları önbelleğe alın:

public override void Init()
{
    License.LicenseKey = "LicenseKey";
    this.LoggingLevel = WebScraper.LogLevel.All;
    this.WorkingDirectory = AppSetting.GetAppRoot() + @"\ShoppingSiteSample\Output\";
    EnableWebCache();
    this.Request("http://www.WebSite.com", Parse);
}
public override void Init()
{
    License.LicenseKey = "LicenseKey";
    this.LoggingLevel = WebScraper.LogLevel.All;
    this.WorkingDirectory = AppSetting.GetAppRoot() + @"\ShoppingSiteSample\Output\";
    EnableWebCache();
    this.Request("http://www.WebSite.com", Parse);
}
Public Overrides Sub Init()
	License.LicenseKey = "LicenseKey"
	Me.LoggingLevel = WebScraper.LogLevel.All
	Me.WorkingDirectory = AppSetting.GetAppRoot() & "\ShoppingSiteSample\Output\"
	EnableWebCache()
	Me.Request("http://www.WebSite.com", Parse)
End Sub
$vbLabelText   $csharpLabel

Kısıtlama

Bağlantı sayıları ve hızını kontrol edin:

public override void Init()
{
    License.LicenseKey = "LicenseKey";
    this.LoggingLevel = WebScraper.LogLevel.All;
    this.WorkingDirectory = AppSetting.GetAppRoot() + @"\ShoppingSiteSample\Output\";
    this.MaxHttpConnectionLimit = 80;
    this.RateLimitPerHost = TimeSpan.FromMilliseconds(50);
    this.OpenConnectionLimitPerHost = 25;
    this.ObeyRobotsDotTxt = false;
    this.ThrottleMode = Throttle.ByDomainHostName;
    this.Request("https://www.Website.com", Parse);
}
public override void Init()
{
    License.LicenseKey = "LicenseKey";
    this.LoggingLevel = WebScraper.LogLevel.All;
    this.WorkingDirectory = AppSetting.GetAppRoot() + @"\ShoppingSiteSample\Output\";
    this.MaxHttpConnectionLimit = 80;
    this.RateLimitPerHost = TimeSpan.FromMilliseconds(50);
    this.OpenConnectionLimitPerHost = 25;
    this.ObeyRobotsDotTxt = false;
    this.ThrottleMode = Throttle.ByDomainHostName;
    this.Request("https://www.Website.com", Parse);
}
Public Overrides Sub Init()
	License.LicenseKey = "LicenseKey"
	Me.LoggingLevel = WebScraper.LogLevel.All
	Me.WorkingDirectory = AppSetting.GetAppRoot() & "\ShoppingSiteSample\Output\"
	Me.MaxHttpConnectionLimit = 80
	Me.RateLimitPerHost = TimeSpan.FromMilliseconds(50)
	Me.OpenConnectionLimitPerHost = 25
	Me.ObeyRobotsDotTxt = False
	Me.ThrottleMode = Throttle.ByDomainHostName
	Me.Request("https://www.Website.com", Parse)
End Sub
$vbLabelText   $csharpLabel

Kısıtlama özellikleri

  • MaxHttpConnectionLimit
    izin verilen toplam açık HTTP isteği (thread) sayısı
  • RateLimitPerHost
    belirli bir alan veya IP adresine gönderilen istekler arasında en az nazik gecikme (duraklama)
  • OpenConnectionLimitPerHost
    her hostname veya IP adresi için izin verilen eşzamanlı HTTP istek (thread) sayısı
  • ThrottleMode
    WebScraper, istekleri sadece hostname ile değil, aynı zamanda host sunucularının IP adresleri ile de zekice yönlendirmesi için yapılır. Bu durumda kibar olur, çünkü birden fazla kazınmış domain aynı makinada barındırılıyor olabilir.

Ek

Windows Form Uygulaması Nasıl Oluşturulur?

Visual Studio 2013 veya daha üstünü kullanın.

  1. Visual Studio'yu açın.
  2. Dosya -> Yeni -> Proje Enterprise 2015

  3. Visual C# veya VB -> Windows -> Windows Forms Uygulamasını seçin.
    Windows Uygulaması Oluştur

Proje Adı: IronScraperSample Konum: Diskinizde bir konum seçin.

ASP.NET Web Form Uygulaması Nasıl Oluşturulur?

  1. Visual Studio'yu açın.
    Enterprise 2015

  2. Dosya -> Yeni -> Proje Dosya Yeni Proje

  3. Visual C# veya VB -> Web -> ASP.NET Web Uygulaması (.NET Framework) seçin.
    ASP .Net Web Uygulamasi

Proje Adı: IronScraperSample Konum: Diskinizde bir konum seçin.

  1. ASP.NET şablonlarınızdan boş bir şablonu seçin ve Web Formlarını işaretleyin.
    ASP .Net Şablonlar

  2. Temel ASP.NET Web Form Projeniz oluşturuldu.
    ASP .Net Web Form Projesi

Tam öğretici örnek proje kodunu burada indirin.

Sıkça Sorulan Sorular

C#'ta web sitelerinden veri nasıl kazınır?

C#'ta web sitelerinden veri kazıma için IronWebScraper'ı kullanabilirsiniz. Önce kütüphaneyi NuGet üzerinden yükleyin ve web verilerini verimli bir şekilde çıkarmaya başlamak için temel bir konsol uygulaması ayarlayın.

C#'ta web kazıma için ön koşullar nelerdir?

C#'ta web kazıma yapmak için, C# veya VB.NET'te temel programlama becerilerine sahip olmalı ve HTML, JavaScript, CSS gibi web teknolojilerini anlamalı ve DOM, XPath ve CSS seçicilere aşina olmalısınız.

.NET projesinde bir web kazıma kütüphanesini nasıl yükleyebilirim?

Bir .NET projesinde IronWebScraper'ı yüklemek için, NuGet paket yöneticisi konsolunda Install-Package IronWebScraper komutunu kullanın veya Visual Studio'daki NuGet Paket Yöneticisi arayüzü aracılığıyla gidin.

Web kazıyıcıma istekte sınırlama uygulamasını nasıl ekleyebilirim?

IronWebScraper, bir sunucuya yapılacak isteklerin sıklığını yönetmek için istek sınırlaması uygulamanıza olanak tanır. Bu, MaxHttpConnectionLimit, RateLimitPerHost ve OpenConnectionLimitPerHost gibi ayarları kullanarak yapılandırılabilir.

Web kazımada web önbelleğinin etkinleştirilmesinin amacı nedir?

Web kazımada web önbellek etkinleştirilmesi, daha önceki yanıtları depolayıp yeniden kullanarak bir sunucuya gönderilen istek sayısını azaltmaya yardımcı olur. IronWebScraper'da EnableWebCache yöntemiyle ayarlayabilirsiniz.

Web kazımada kimlik doğrulama nasıl yönetilir?

IronWebScraper ile, giriş formlarının veya sınırlı alanların arkasındaki içeriğe erişim sağlayarak korumalı kaynakları kazıma imkanı tanıyan kimlik doğrulama için HttpIdentity kullanabilirsiniz.

C#'ta basit bir web kazıyıcı örneği nedir?

'HelloScraper' öğreticide verilen basit bir örnektir. IronWebScraper kullanarak temel bir web kazıyıcısı kurmanın yanı sıra istek başlatma ve yanıtları ayrıştırma yöntemlerini gösterir.

Web kazıyıcımı karmaşık sayfa yapılarıyla başa çıkacak şekilde nasıl genişletebilirim?

IronWebScraper kullanarak, farklı sayfa türlerini işlemek için Parse yöntemlerini özelleştirerek karmaşık sayfa yapılarıyla başa çıkacak şekilde kazıyıcınızı genişletebilir, esnek veri çıkarma stratejileri sağlayabilirsiniz.

Bir web kazıma kütüphanesi kullanmanın faydaları nelerdir?

IronWebScraper gibi bir web kazıma kütüphanesi kullanmanın faydaları arasında, veri çıkarma sürecini kolaylaştırmak, alan yönetimi, istek sınırlaması, önbellekleme ve kimlik doğrulama desteği sağlayarak web kazıma görevlerini verimli bir şekilde yönetme imkanı vardır.

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.