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 verisi çıkarma ve web içeriği ayrıştırma için bir .NET kütüphanesi. Bu, geliştirme ve üretimde kullanılmak üzere Microsoft Visual Studio projelerine eklenebilen, kullanımı kolay bir kütüphanedir.

IronWebscraper, izin verilen ve yasaklanan sayfaları, nesneleri, medyayı vb. kontrol etme gibi birçok benzersiz özelliğe ve yeteneğe sahiptir. Ayrıca, bu eğitimde ele alacağımız çoklu kimlik yönetimi, web önbelleği ve diğer birçok özelliği de destekler.

IronWebscraper ile başlayın

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

İlk Adım:
green arrow pointer


Hedef Kitle

Bu eğitim, gelişmiş kazıma yetenekleri (web sitelerinden veri kazıma, web sitesi verilerinin toplanması ve çıkarılması, web sitesi içeriklerinin ayrıştırılması, web hasadı) için çözümler oluşturmak ve uygulamak isteyen, temel veya ileri düzeyde programlama becerilerine sahip yazılım geliştiricilere yöneliktir.

Web kazıma görüntüsü

Gerekli beceriler

  1. C# veya VB.NET gibi Microsoft programlama dillerinden birini kullanarak programlamanın temel ilkeleri
  2. Web Teknolojileri (HTML, JavaScript, jQuery, CSS vb.) ve bunların nasıl çalıştığına dair temel bilgi
  3. DOM, XPath, HTML ve CSS Seçicileri hakkında temel bilgi

Araçlar

  1. Microsoft Visual Studio 2010 veya üzeri
  2. Chrome için Web Inspector veya Firefox için Firebug gibi tarayıcılar için web geliştirici uzantıları

Neden Veri Toplama? (Reasons and Concepts)

Aşağıdaki özelliklere sahip bir ürün veya çözüm geliştirmek istiyorsanız:

  1. Web sitesi verilerini çıkarma
  2. Birden fazla web sitesindeki içerikleri, fiyatları, özellikleri vb. karşılaştırın
  3. Web sitesi içeriğini tarama ve önbelleğe alma

Yukarıdakilerden bir veya daha fazla nedeniniz varsa, IronWebscraper ihtiyaçlarınıza uygun harika bir kütüphanedir.

IronWebScraper nasıl kurulur?

Create a New Project (Ek A'ya bakın) yaptıktan sonra, NuGet'i kullanarak kütüphaneyi otomatik olarak ekleyerek veya DLL'yi manuel olarak yükleyerek IronWebScraper kütüphanesini projenize ekleyebilirsiniz.

NuGet kullanarak yükleyin

NuGet kullanarak projemize IronWebScraper kütüphanesini eklemek için, görsel arayüzü (NuGet Paket Yöneticisi) veya Paket Yöneticisi Konsolu'nu kullanarak komut verebiliriz.

NuGet Paket Yöneticisini Kullanma

  1. Fareyi kullanarak -> proje adına sağ tıklayın -> NuGet Paketini Yönet'i seçin
  2. Gözat sekmesinden -> IronWebScraper'yi arayın -> Yükleyin
  3. Tamam'ı tıklayın
  4. Ve bitti

NuGet Paket Konsolunu Kullanma

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

Manuel Olarak Yükle

  1. Şuraya gidin </https:>
  2. IronWebscraper'ı tıklayın veya URL'yi kullanarak sayfasına doğrudan gidin https://ironsoftware.com/csharp/webscraper/
  3. DLL'yi İndir'i tıklayın.
  4. İndirilen sıkıştırılmış dosyayı açın
  5. Visual Studio'da projeye sağ tıklayın -> ekle -> referans -> gözat

    DLL Kullanarak IronWebScraper Ekle

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

    DLL 2 Kullanarak IronWebscraper Ekle

  7. Ve bitti!

HelloScraper - İlk IronWebscraper Örneğimiz

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

  • "IronWebScraperSample" adında yeni bir konsol uygulaması oluşturduk

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

  1. Bir klasör oluşturun ve adına "HelloScraperSample" adını verin
  2. Ardından yeni bir sınıf ekleyin ve adına HelloScraper adını verin HelloScraper Sınıf Ekle

  3. Bu kod parçasını HelloScraper'ye 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 Scrape'i başlatmak için bu kod parçasını Main'ye 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 biçiminde bir dosyaya kaydedilecektir. HelloScraper Sonucu

Kod Genel Bakış

Scrape.Start(), kazıma mantığını aşağıdaki şekilde tetikler:

  1. Değişkenleri başlatmak, özellikleri ve davranış özniteliklerini kazımak için Init() yöntemini çağırır.
  2. Init() içindeki başlangıç sayfası isteğini Request("https://blog.scrapinghub.com", Parse) ile ayarlar.
  3. Birden fazla HTTP isteğini ve iş parçacığını paralel olarak işleyerek kodun senkronize kalmasını ve hata ayıklamanın daha kolay olmasını sağlar.
  4. Parse() yöntemi, yanıtı işlemek, CSS seçicileri kullanarak verileri çıkarmak ve bunları JSON biçiminde kaydetmek için Init()'den sonra tetiklenir.

IronWebscraper kütüphanesi İşlevleri ve Seçenekleri

https://ironsoftware.com/csharp/webscraper/object-reference/Güncellenmiş belgeler, manuel kurulum yöntemiyle indirilen ZIP dosyasının içinde bulunabilir (IronWebScraper Documentation.chm File) veya kütüphanenin en son güncellemesi için çevrimiçi belgelere şu adresten göz atabilirsiniz: .

Projenizde IronWebScraper'yi kullanmaya başlamak için, sınıf kitaplığınızı genişleten ve ona kazıma işlevselliği ekleyen IronWebScraper.WebScraper sınıfından miras almalısınız. Ayrıca, Init() ve Parse(Response response) yöntemlerini de uygulamalısınız.

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 \ işlevler Tür Açıklama
Init () Yöntem Sıyırıcıyı kurmak için kullanılır
Parse (Response response) Yöntem Kazıyıcının kullanacağı mantığı ve bunu nasıl işleyeceğini uygulamak için kullanılır. Farklı sayfa davranışları veya yapıları için birden fazla yöntem uygulanabilir.
BannedUrls, AllowedUrls, BannedDomains Koleksiyonlar URL'leri ve/veya etki alanlarını yasaklamak/izin vermek için kullanılır. Örnek: BannedUrls.Add("*.zip", "*.exe", "*.gz", "*.pdf"); Joker karakterleri ve düzenli ifadeleri destekler.
ObeyRobotsDotTxt Boolean robots.txt içindeki yönergeleri okumayı ve takip etmeyi etkinleştirmek veya devre dışı bırakmak için kullanılır.
ObeyRobotsDotTxtForHost (string Host) Yöntem Belirli bir etki alanı için robots.txt içindeki yönergeleri okumayı ve uygulamayı etkinleştirmek veya devre dışı bırakmak için kullanılır.
Scrape, ScrapeUnique Yöntem
ThrottleMode Numaralandırma Enum Seçenekleri: ByIpAddress, ByDomainHostName. Ana bilgisayar IP adreslerini veya etki alanı ana bilgisayar adlarını dikkate alan akıllı istek sınırlamasını etkinleştirir.
EnableWebCache, EnableWebCache (TimeSpan cacheDuration) Yöntem Web istekleri için önbelleklemeyi etkinleştirir.
MaxHttpConnectionLimit Int İzin verilen toplam açık HTTP isteği (iş parçacığı) sayısını ayarlar.
RateLimitPerHost TimeSpan Belirli bir etki alanına veya IP adresine yapılan istekler arasındaki minimum nezaket gecikmesini (duraklama) ayarlar.
OpenConnectionLimitPerHost Int Her bir ana bilgisayar adı veya IP adresi başına izin verilen eşzamanlı HTTP isteklerinin (iş parçacıkları) sayısını ayarlar.
WorkingDirectory string Verileri depolamak için bir çalışma dizini yolu belirler.

Gerçek Hayattan Örnekler ve Uygulama

Çevrimiçi Film Web Sitesinden Veri Toplama

Bir film web sitesini kazıdığımız bir örnek oluşturalım.

Yeni bir sınıf ekleyin ve adına 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 bağlantı bulunmaktadır. Şimdi 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ı

Biçimlendirilmiş verilerimizi saklamak için bir movie 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 Movie 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

Movie sınıfımızı, ayrıntılı bilgiler için yeni özellikler içerecek şekilde 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

Ardından, IronWebScraper'ın genişletilmiş özelliklerini kullanarak sayfayı kazımak için Ayrıntılı sayfaya gidin:

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ı sistemlerde içeriği görüntülemek için kullanıcının oturum açması gerekir; 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 yeniden kullanılmak üzere 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

Throttling

Bağlantı sayısını 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

Throttling özellikleri

  • MaxHttpConnectionLimit
    izin verilen toplam açık HTTP isteği sayısı (iş parçacığı)
  • RateLimitPerHost
    belirli bir etki alanına veya IP adresine yapılan istekler arasında minimum nezaket gecikmesi (duraklama)
  • OpenConnectionLimitPerHost
    her bir ana bilgisayar adı veya IP adresi başına izin verilen eşzamanlı HTTP istek (iş parçacığı) sayısı
  • ThrottleMode
    WEBSCRAPER'ın istekleri yalnızca ana bilgisayar adına göre değil, aynı zamanda ana bilgisayar sunucularının IP adreslerine göre de akıllıca sınırlamasını sağlar. Bu, aynı makinede birden fazla kazınmış etki alanı barındırılması durumunda nazik bir yaklaşımdır.

Ek

Windows Form Uygulaması Nasıl Oluşturulur?

Visual Studio 2013 veya üstü sürümlerini 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: Diskinizden 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 Yeni Proje Oluştur

  3. C# veya VB -> Web -> ASP.NET Web Uygulaması (.NET Framework) seçeneğini seçin. ASP .NET Web Uygulaması

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

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

  2. Temel ASP.NET Web Formu Projeniz oluşturuldu. ASP .NET Web Formu Projesi

Öğreticinin örnek proje kodunun tamamını buradan indirebilirsiniz.

Sıkça Sorulan Sorular

C# ile web sitelerinden nasıl veri kazıyabilirim?

IronWebScraper'ı kullanarak C# ile web sitelerinden veri kazıyabilirsiniz. Kütüphaneyi NuGet üzerinden yükleyerek temel bir konsol uygulaması hazırlayın ve web verilerini etkili bir şekilde çıkarmaya başlayın.

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

C# ile web kazıma gerçekleştirmek için, temel C# veya VB.NET programlama becerilerine sahip olmalısınız ve HTML, JavaScript, CSS gibi web teknolojilerini anlamalı, ayrıca DOM, XPath ve CSS seçicileri ile aşina olmalısınız.

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

IronWebScraper'ı bir .NET projesine yüklemek için, NuGet paket yöneticisi konsolunu kullanarak Install-Package IronWebScraper komutunu çalıştırabilir veya Visual Studio'da NuGet Paket Yöneticisi arayüzü aracılığıyla gezinebilirsiniz.

Web kazıyıcıma istek kısıtlamasını nasıl uygulayabilirim?

IronWebScraper, sunucuya yapılan istek sıklığını yönetmek için istek kısıtlamasını uygulamanıza olanak tanır. Bu, MaxHttpConnectionLimit, RateLimitPerHost ve OpenConnectionLimitPerHost gibi ayarlarla yapılandırılabilir.

Web kazımada web önbelleği etkinleştirmenin amacı nedir?

Web kazımada web önbelleği etkinleştirmek, daha önceki yanıtları saklayarak ve yeniden kullanarak bir sunucuya gönderilen istek sayısını azaltmaya yardımcı olur. Bu, IronWebScraper'da EnableWebCache metodu kullanılarak sağlanabilir.

Web kazımada kimlik doğrulama nasıl ele alınabilir?

IronWebScraper ile HttpIdentity kullanarak kimlik doğrulama yönetebilir, giriş formlarının arkasındaki veya sınırlı alanlardaki içeriklere erişim sağlayarak korumalı kaynakların kazınmasını mümkün kılabilirsiniz.

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

Tutorialda sağlanan 'HelloScraper', IronWebScraper kullanarak temel bir web kazıyıcının nasıl kurulacağını gösteren basit bir örnektir, taleplerin nasıl başlatılacağını ve yanıtların nasıl işleneceğini içerir.

Web kazıyıcıma karmaşık sayfa yapılarıyla başa çıkması için nasıl genişletebilirim?

IronWebScraper kullanarak, karmaşık sayfa yapılarıyla başa çıkması için kazıyıcınızı genişletebilir, farklı sayfa türlerini işlemek için esnek veri çıkarma stratejilerine olanak tanıyan Parse yöntemlerini özelleştirebilirsiniz.

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

IronWebScraper gibi bir web kazıma kütüphanesi kullanmak, veri çıkarmayı kolaylaştırma, alan adı yönetimi, istek kısıtlama, önbellekleme ve kimlik doğrulama desteği gibi avantajlar sağlar, böylece web kazıma görevlerini etkin bir şekilde yönetebilirsiniz.

Curtis Chau
Teknik Yazar

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

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

Hâlâ Kaydırıyor Musunuz?

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