How to Scrape Data from Websites in C
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.

Gerekli Beceriler
- C# veya VB.NET gibi Microsoft Programlama dillerinden biriyle programlama temel becerileri
- Web Teknolojilerinin (HTML, JavaScript, JQuery, CSS, vb.) temel bilgisi ve nasıl çalıştıkları
- DOM, XPath, HTML ve CSS Seçiciler hakkında temel bilgi
Araçlar
- Microsoft Visual Studio 2010 veya üstü
- 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:
- Web sitesi verilerini çıkartma
- Ancak içerikler, fiyatlar, özellikler, vb. birden fazla web sitesinden karşılaştırma
- 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
- Farenizi kullanarak -> proje adına sağ tıklayın -> NuGet Paketini yönet'i seçin
- Gezinti sekmesinden -> IronWebScraper arayın -> Yükle
- Tamam'a tıklayın
- Ve tamamız
NuGet Paket Konsolunu Kullanma
- Araçlardan -> NuGet Paket Yöneticisi -> Paket Yöneticisi Konsolu
- Varsayılan Proje Olarak Sınıf Kütüphanesi Projesini Seçin
- Komutu çalıştırın ->
Install-Package IronWebScraper
Manuel Kurulum
- https://ironsoftware.com adresine gidin
- IronWebScraper'a tıklayın veya URL https://ironsoftware.com/csharp/webscraper/ kullanarak sayfasını doğrudan ziyaret edin
- DLL'yi İndir'e tıklayın.
- İndirilen sıkıştırılmış dosyayı çıkarın
-
Visual Studio'da projeye sağ tıklayın -> ekle -> referans -> göz at

-
Çıkarılan klasöre gidin ->
netstandard2.0-> ve tüm.dlldosyalarını seçin
- 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ı
- Bir Klasör Oluşturun ve adını 'HelloScraperSample' olarak adlandırın
-
Ardından yeni bir sınıf ekleyin ve adını 'HelloScraper' olarak adlandırın

-
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 -
Ş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 - Sonuç,
WebScraper.WorkingDirectory/classname.Jsonformatında bir dosyaya kaydedilecek
Kod Genel Bakış
Scrape.Start() aşağıdaki gibi scraping mantığını tetikler:
- Değişkenleri başlatmak, scrape özelliklerini ve davranış niteliklerini ayarlamak için
Init()metodunu çağırır. Init()deRequest("https://blog.scrapinghub.com", Parse)ile başlangıç sayfası isteğini ayarlar.- Birden fazla HTTP isteğini ve iş parçacığını paralel olarak yönetir, kodu eşzamanlı ve hata ayıklamayı kolay hale getirir.
Parse()metodu, yanıtı işlemek, verileri CSS seçiciler kullanarak çıkarmak ve JSON formatında kaydetmek içinInit()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
| Ö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:

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>
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
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
Ş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
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
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
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)
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
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
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.
- Visual Studio'yu açın.
-
Dosya -> Yeni -> Proje

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

Proje Adı: IronScraperSample Konum: Diskinizde bir konum seçin.
ASP.NET Web Form Uygulaması Nasıl Oluşturulur?
-
Visual Studio'yu açın.

-
Dosya -> Yeni -> Proje

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

Proje Adı: IronScraperSample Konum: Diskinizde bir konum seçin.
-
ASP.NET şablonlarınızdan boş bir şablonu seçin ve Web Formlarını işaretleyin.

- Temel ASP.NET Web Form Projeniz oluşturuldu.

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.

