Gereksinimler ve Ön Hazırlık
Veri kazıma botunuzu geliştirmek için öncelikle geliştirme ortamınızı hazırlamanız gerekir. 2026 yılı standartlarına göre aşağıdaki araçların kurulu olduğundan emin olun:
- Visual Studio 2022 veya 2025: .NET 9 veya üzeri SDK yüklü olmalıdır.
- HtmlAgilityPack: HTML belgelerini DOM (Document Object Model) yapısı üzerinden sorgulamak için kullanılan en popüler kütüphanedir.
- HttpClient: Web sitelerine HTTP istekleri göndererek kaynak kodları almak için kullanılır.
- Polly: Ağ kesintileri veya sunucu yoğunluğu durumunda istekleri yeniden denemek (retry policy) için kullanılan bir kütüphanedir.
Adım 1: Proje Kurulumu ve Gerekli Paketlerin Yüklenmesi
Boş bir .NET Console uygulaması oluşturduktan sonra, projenize gerekli NuGet paketlerini ekleyerek işe başlayın. Terminal veya Paket Yöneticisi konsolu üzerinden şu komutları çalıştırın:
dotnet add package HtmlAgilityPack
dotnet add package Polly
Bu paketler, web sayfalarını indirmek ve ayrıştırmak için ihtiyacınız olan temel araçları sağlar. Paketlerin güncel sürümlerini kullanmak, güvenlik açıklarına karşı koruma sağlar.
Adım 2: HttpClient ile Web Sayfası Kaynak Kodunu Çekme
Veri kazıma işleminin ilk aşaması, hedef URL'den HTML içeriğini almaktır. Modern C# uygulamalarında HttpClient sınıfını IHttpClientFactory ile kullanmak, soket tükenmesi gibi sorunları engeller.
using System.Net.Http;
public async Task GetHtmlAsync(string url)
{
using HttpClient client = new HttpClient();
client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36");
HttpResponseMessage response = await client.GetAsync(url);
response.EnsureSuccessStatusCode();
return await response.Content.ReadAsStringAsync();
}
Burada User-Agent başlığını eklemek kritiktir; çünkü birçok web sitesi, standart bot tanımlayıcılarını engelleyebilir. Bu başlık, botunuzun gerçek bir tarayıcı gibi görünmesini sağlar.
Adım 3: HtmlAgilityPack ile Veri Ayıklama
HTML içeriği indirdikten sonra, XPath veya CSS seçicileri kullanarak istediğiniz verileri ayıklayabilirsiniz. HtmlAgilityPack, bozuk HTML kodlarını bile düzelterek işleyebilen güçlü bir parser'dır.
using HtmlAgilityPack;
public void ParseData(string html)
{
var doc = new HtmlDocument();
doc.LoadHtml(html);
// Belirli bir class ismine sahip tüm başlıkları bulma
var nodes = doc.DocumentNode.SelectNodes("//h2[@class='product-title']");
if (nodes != null)
{
foreach (var node in nodes)
{
Console.WriteLine("Ürün Adı: " + node.InnerText.Trim());
}
}
}
XPath kullanımı, sayfadaki hiyerarşik yapı içerisinde spesifik öğelere ulaşmak için en esnek yöntemdir. InnerText.Trim() kullanımı, gereksiz boşluklardan kurtulmanızı sağlar.
Adım 4: Hata Yönetimi ve Yeniden Deneme Politikaları
Web siteleri anlık olarak cevap vermeyebilir veya geçici olarak erişime kapanabilir. Polly kütüphanesini kullanarak, başarısız olan istekleri belirli bir süre sonra tekrar deneyecek bir yapı kurmalısınız.
using Polly;
var retryPolicy = Policy
.Handle()
.WaitAndRetry(3, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)));
// Kullanımı
await retryPolicy.ExecuteAsync(async () => await GetHtmlAsync("https://ornek-site.com"));
Bu yapı, ilk başarısızlıkta 2 saniye, ikincide 4 saniye bekleyerek sunucuyu yormadan tekrar deneme yapar. Bu, botunuzun kararlılığını artıran en önemli adımdır.
Veri Kazıma Yöntemleri Karşılaştırması
| Yöntem | Avantajları | Dezavantajları |
|---|---|---|
| Statik (HttpClient) | Çok hızlı, düşük kaynak tüketimi | JavaScript ile yüklenen verileri alamaz |
| Dinamik (Playwright/Selenium) | JS içeriği işler, kullanıcı etkileşimi sağlar | Ağır, yavaş ve yüksek RAM tüketimi |
Adım 5: Verileri Güvenli Bir Şekilde Kaydetme
Çektiğiniz verileri yerel bir veritabanına veya JSON dosyasına kaydederken güvenlik standartlarına uyun. Özellikle kullanıcı verisi veya şifreli içerik kazıyorsanız, bunları asla açık metin olarak saklamayın.
using System.Text.Json;
public void SaveData(List products)
{
string json = JsonSerializer.Serialize(products);
File.WriteAllText("veriler.json", json);
}
Kritik Güvenlik Uyarısı: Kazıdığınız verileri veritabanına aktarırken mutlaka parametreli sorgular (Entity Framework Core kullanarak) tercih edin. SQL Injection saldırılarına karşı verileri asla doğrudan SQL sorgularına birleştirmeyin. Ayrıca, hedef sitenin robots.txt dosyasını kontrol ederek kazıma izni olup olmadığını teyit edin.
Sıkça Sorulan Sorular
Web kazıma yasal mı?
Halka açık, kişisel veriler içermeyen ve telif haklarına tabi olmayan verilerin kazınması genellikle yasaldır. Ancak, sitenin kullanım şartlarını (Terms of Service) ihlal etmemek ve sunucuya aşırı yük bindirmemek etik bir zorunluluktur.
Botum neden engelleniyor?
Çok hızlı istek gönderiyor olabilirsiniz. İstekler arasına Task.Delay() ekleyerek bekleme süreleri (rate limiting) koymanız ve User-Agent değerlerini düzenli güncellemeniz sorunu çözecektir.
JavaScript ile yüklenen verileri nasıl çekerim?
HttpClient sadece kaynak kodu indirir. Eğer veri JavaScript ile yükleniyorsa, Playwright veya Selenium gibi tarayıcı otomasyon araçlarını kullanmanız gerekir.
Veritabanı bağlantısı nasıl güvenli tutulur?
Veritabanı bağlantı dizelerini (connection strings) asla kodun içine gömmeyin. appsettings.json veya Azure Key Vault gibi güvenli yapılandırma servislerini kullanın.
Aynı anda kaç istek atmalıyım?
Sunucu tarafında "Denial of Service" (DoS) etkisi yaratmamak için eşzamanlı istek sayısını sınırlı tutmalısınız. SemaphoreSlim kullanarak aynı anda çalışan görev sayısını kontrol altına alabilirsiniz.
İleri Seviye Optimizasyon: Performans ve Bellek Yönetimi
Veri kazıma projeleri büyüdükçe, uygulamanın bellek tüketimi ve işlemci kullanımı kritik bir hal alır. Özellikle binlerce sayfayı tararken HttpClient nesnelerini yanlış yönetmek, "Socket Exhaustion" (soket tükenmesi) sorununa yol açabilir. Bunun önüne geçmek için IHttpClientFactory kullanımını benimsemeli ve nesneleri manuel olarak sürekli oluşturmak yerine havuzdan yönetmelisiniz.
Ayrıca, büyük ölçekli verilerle çalışırken IEnumerable ve yield return yapılarını kullanarak verileri belleğe yüklemeden akış (streaming) şeklinde işlemek, uygulamanızın RAM kullanımını minimumda tutacaktır.
public async IAsyncEnumerable GetProductLinksAsync(string baseUrl)
{
// Verileri bellekte biriktirmek yerine akış olarak döndürür
foreach (var page in Enumerable.Range(1, 100))
{
var html = await _httpClient.GetStringAsync($"{baseUrl}?page={page}");
var links = ParseLinks(html);
foreach (var link in links)
{
yield return link;
}
}
}
Headless Tarayıcılar ile Dinamik İçerik Yönetimi
Bazı modern web siteleri, verileri tamamen JavaScript (React, Vue, Angular) aracılığıyla istemci tarafında oluşturur. Bu durumda standart HtmlAgilityPack yetersiz kalacaktır. Bu senaryolarda Playwright veya Selenium gibi araçlar kullanarak gerçek bir tarayıcı motorunu simüle etmeniz gerekir. Playwright, C# ile asenkron çalışma konusunda oldukça başarılıdır ve daha az kaynak tüketir.
Aşağıdaki örnekte, Playwright kullanarak bir sayfanın JavaScript ile yüklenmesini bekledikten sonra içerik çekme mantığı gösterilmiştir:
using Microsoft.Playwright;
public async Task GetDynamicContentAsync(string url)
{
using var playwright = await Playwright.CreateAsync();
await using var browser = await playwright.Chromium.LaunchAsync(new BrowserTypeLaunchOptions { Headless = true });
var page = await browser.NewPageAsync();
await page.GotoAsync(url);
// Dinamik içeriğin yüklenmesi için belirli bir elementin gelmesini bekle
await page.WaitForSelectorAsync(".product-price");
var content = await page.ContentAsync();
return content;
}
Veri Kazıma Botları İçin Hata Ayıklama (Debugging) Stratejileri
Botunuzun neden veri çekemediğini anlamak için sadece hata loglarına bakmak yeterli değildir. Web siteleri sürekli yapı değiştirebilir. Bu yüzden, başarısız olan isteklerin ham HTML çıktısını yerel bir dosyaya kaydederek "offline" inceleme yapmanız, geliştirme sürecini hızlandırır.
- Request Logging: Her isteğin başlıklarını (headers) ve döndürdüğü HTTP durum kodunu bir dosyaya yazın.
- Snapshot Alma: Hata anında dönen HTML içeriğini
debug_error.htmlolarak kaydedip tarayıcıda açarak, XPath sorgularınızın neden çalışmadığını görsel olarak test edin. - User-Agent Rotasyonu: Botunuzun bir tarayıcı gibi görünmesi için
User-Agentbilgisini düzenli olarak güncelleyin.
İpucu: Botunuzun tespit edilmemesi için Referer başlığını da hedef sitenin ana sayfası olarak ayarlamayı unutmayın.
Sonuç
C# ile web tabanlı veri kazıma botu yapmak, doğru kütüphaneler ve etik kurallar çerçevesinde oldukça verimli bir süreçtir. Bu rehberde öğrendiğiniz HttpClient kullanımı, XPath ile veri ayrıştırma ve Polly ile hata yönetimi, profesyonel seviyede bir bot geliştirmeniz için temel taşları oluşturur. Bir sonraki adım olarak, kazıdığınız verileri bir veritabanına (PostgreSQL veya SQL Server) aktaracak bir servis katmanı yazmayı deneyebilirsiniz.
Sorumluluk Reddi: Bu rehber yalnızca eğitim amaçlıdır. Web sitelerinden veri kazırken ilgili sitenin kullanım koşullarına ve yerel yasalara uymak tamamen kullanıcının sorumluluğundadır.

Yorumlar (0)
Yorum Yaz