C# ile Web Kazıma Uygulaması: Dijital Veri Toplama Sanatı

Bu makalede, bir haber sitesinden başlıkları ve özetleri otomatik olarak çeken, kategorize eden ve yerel bir veritabanında saklayan bir web kazıma uygulaması geliştireceğiz.

Dijital Veri Toplama Sanatı

Modern yazılım geliştirme dünyasında web kazıma (web scraping), veri odaklı uygulamalar için hayati önem taşıyan bir tekniktir. Bu makalede, C# programlama dili kullanarak basit ancak etkili bir web kazıma uygulaması geliştirme sürecini adım adım inceleyeceğiz.

Giriş

İnternet, günümüzde bilgi hazinesi haline gelmiştir. Bu hazineden değerli verileri programatik olarak çıkarma ihtiyacı, web kazıma tekniklerinin gelişmesine yol açmıştır. C# gibi güçlü ve esnek bir programlama dili, web kazıma projeleri için mükemmel bir seçenektir. Microsoft'un .NET ekosistemi içinde yer alan C#, zengin kütüphaneleri ve kullanım kolaylığı ile veri toplama projelerinde tercih edilen dillerden biridir.

Bu makalede, bir haber sitesinden başlıkları ve özetleri otomatik olarak çeken, kategorize eden ve yerel bir veritabanında saklayan bir web kazıma uygulaması geliştireceğiz. Uygulamamız, sadece verileri toplamakla kalmayıp aynı zamanda onları anlamlı bir şekilde işleyecek ve sunacaktır.

Web Kazıma Nedir ve Neden Önemlidir?

Web kazıma, web sitelerinden otomatik olarak veri çıkarma işlemidir. Bu teknik, manuel olarak yapılması imkansız olacak kadar büyük ölçekli veri toplama görevlerini otomatikleştirir. Web kazıma kullanım alanları:

  • Pazar araştırması ve rekabet analizi
  • Fiyat karşılaştırma servisleri
  • İçerik toplama ve birleştirme
  • Makine öğrenmesi için veri setleri oluşturma
  • Sosyal medya analizi

Ancak unutulmamalıdır ki, web kazıma yasal ve etik sınırlar içinde yapılmalıdır. Her web sitesinin kullanım şartları ve robots.txt dosyası kontrol edilmelidir.

Gerekli Araçlar ve Kütüphaneler

Projemiz için aşağıdaki araçlara ve kütüphanelere ihtiyacımız olacak:

  • Visual Studio 2022 (veya daha yeni bir sürüm)
  • .NET 6.0 (veya daha yeni)
  • HtmlAgilityPack - HTML parselemek için
  • Newtonsoft.Json - JSON işlemleri için
  • Entity Framework Core - Veritabanı işlemleri için
  • SQLite - Yerel veritabanı olarak

Uygulamamızın Genel Mimarisi

Web kazıma uygulamamız aşağıdaki bileşenlerden oluşacaktır:

  1. WebScraper - Web sayfalarını indirme ve ayrıştırma işlemlerini gerçekleştiren sınıf
  2. DataProcessor - Toplanan verileri işleyen ve kategorize eden sınıf
  3. DatabaseManager - Verileri veritabanına kaydeden ve yöneten sınıf
  4. Program - Ana uygulama akışını kontrol eden sınıf

Adım 1: Proje Oluşturma ve Kütüphaneleri Yükleme

İlk adım olarak, Visual Studio'da yeni bir konsol uygulaması oluşturalım ve gerekli NuGet paketlerini yükleyelim:

// Öncelikle Visual Studio'da yeni bir konsol uygulaması oluşturun
// Ardından aşağıdaki NuGet paketlerini yükleyin:// Install-Package HtmlAgilityPack
// Install-Package Newtonsoft.Json
// Install-Package Microsoft.EntityFrameworkCore.Sqlite

Adım 2: Model Sınıflarını Oluşturma

Toplanan verileri temsil etmek için model sınıflarını oluşturalım:

public class NewsArticle
{
public int Id { get; set; }
public string Title { get; set; }
public string Summary { get; set; }
public string Url { get; set; }
public string Category { get; set; }
public DateTime PublishDate { get; set; }
public DateTime ScrapedDate { get; set; }
}

public class ScraperDbContext : DbContext
{
public DbSet<NewsArticle> NewsArticles { get; set; }

protected override void OnConfiguring(DbContextOptionsBuilder options)
{
options.UseSqlite("Data Source=news_articles.db");
}
}

Adım 3: Web Scraper Sınıfının Geliştirilmesi

Web sayfalarını indirme ve ayrıştırma işlemlerini gerçekleştirecek sınıfı geliştirelim:

public class WebScraper
{
private readonly HttpClient _httpClient;

public WebScraper()
{
_httpClient = new HttpClient();
_httpClient.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 WebScraper");
}

public async Task<string> DownloadPageAsync(string url)
{
try
{
return await _httpClient.GetStringAsync(url);
}
catch (Exception ex)
{
Console.WriteLine($"Hata: {url} sayfası indirilirken bir sorun oluştu - {ex.Message}");
return string.Empty;
}
}

public List<NewsArticle> ParseNewsPage(string html, string category)
{
var articles = new List<NewsArticle>();
var doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(html);

// Örnek bir haber sitesi için, başlık ve özet içeren elementleri seçiyoruz
var articleNodes = doc.DocumentNode.SelectNodes("//div[@class='news-item']");

if (articleNodes != null)
{
foreach (var articleNode in articleNodes)
{
var titleNode = articleNode.SelectSingleNode(".//h2[@class='title']");
var summaryNode = articleNode.SelectSingleNode(".//p[@class='summary']");
var urlNode = articleNode.SelectSingleNode(".//a[@class='read-more']");
var dateNode = articleNode.SelectSingleNode(".//span[@class='date']");

if (titleNode != null && summaryNode != null && urlNode != null)
{
var article = new NewsArticle
{
Title = titleNode.InnerText.Trim(),
Summary = summaryNode.InnerText.Trim(),
Url = urlNode.GetAttributeValue("href", ""),
Category = category,
PublishDate = ParseDate(dateNode?.InnerText.Trim() ?? DateTime.Now.ToString()),
ScrapedDate = DateTime.Now
};

articles.Add(article);
}
}
}

return articles;
}

private DateTime ParseDate(string dateText)
{
// Basit bir tarih ayrıştırma örneği
try
{
return DateTime.Parse(dateText);
}
catch
{
return DateTime.Now;
}
}
}

Adım 4: Veri İşleme ve Kategorizasyon

Toplanan verileri işleyecek ve kategorize edecek sınıfı geliştirelim:

public class DataProcessor
{
private readonly Dictionary<string, List<string>> _categoryKeywords;

public DataProcessor()
{
_categoryKeywords = new Dictionary<string, List<string>>
{
{ "Teknoloji", new List<string> { "yazılım", "uygulama", "bilgisayar", "yapay zeka", "blockchain" } },
{ "Ekonomi", new List<string> { "enflasyon", "borsa", "döviz", "ekonomi", "faiz" } },
{ "Spor", new List<string> { "futbol", "basketbol", "şampiyon", "maç", "turnuva" } }
};
}

public void CategorizeArticles(List<NewsArticle> articles)
{
foreach (var article in articles)
{
if (string.IsNullOrEmpty(article.Category))
{
article.Category = DetermineCategory(article.Title + " " + article.Summary);
}
}
}

private string DetermineCategory(string content)
{
content = content.ToLower();

// Her kategori için anahtar kelimeleri kontrol et
foreach (var category in _categoryKeywords)
{
foreach (var keyword in category.Value)
{
if (content.Contains(keyword))
{
return category.Key;
}
}
}

return "Genel";
}

public void RemoveDuplicates(List<NewsArticle> articles)
{
var uniqueArticles = new Dictionary<string, NewsArticle>();

foreach (var article in articles)
{
if (!uniqueArticles.ContainsKey(article.Title))
{
uniqueArticles[article.Title] = article;
}
}

articles.Clear();
articles.AddRange(uniqueArticles.Values);
}
}

Adım 5: Veritabanı İşlemleri

Verileri veritabanında saklayacak ve yönetecek sınıfı geliştirelim:

public class DatabaseManager
{
private readonly ScraperDbContext _dbContext;

public DatabaseManager()
{
_dbContext = new ScraperDbContext();
_dbContext.Database.EnsureCreated();
}

public void SaveArticles(List<NewsArticle> articles)
{
foreach (var article in articles)
{
// URL'e göre var olan makaleleri kontrol et
var existingArticle = _dbContext.NewsArticles
.FirstOrDefault(a => a.Url == article.Url);

if (existingArticle == null)
{
_dbContext.NewsArticles.Add(article);
}
}

_dbContext.SaveChanges();
}

public List<NewsArticle> GetArticlesByCategory(string category)
{
return _dbContext.NewsArticles
.Where(a => a.Category == category)
.OrderByDescending(a => a.PublishDate)
.ToList();
}

public void GenerateReport(string filePath)
{
var categories = _dbContext.NewsArticles
.GroupBy(a => a.Category)
.Select(g => new
{
Category = g.Key,
Count = g.Count(),
Articles = g.OrderByDescending(a => a.PublishDate).Take(5).ToList()
})
.ToList();

var report = new
{
GeneratedDate = DateTime.Now,
TotalArticles = _dbContext.NewsArticles.Count(),
CategoryBreakdown = categories
};

var json = JsonConvert.SerializeObject(report, Formatting.Indented);
File.WriteAllText(filePath, json);
}
}

Adım 6: Ana Program Akışı

Son olarak, ana program akışını kontrol eden sınıfı geliştirelim:

class Program
{
static async Task Main(string[] args)
{
Console.WriteLine("C# Web Kazıma Uygulaması Başlatılıyor...");

var scraper = new WebScraper();
var processor = new DataProcessor();
var dbManager = new DatabaseManager();

// Haber sitelerinin URL'leri
var newsSources = new Dictionary<string, string>
{
{ "Teknoloji", "https://example.com/technology" },
{ "Ekonomi", "https://example.com/economy" },
{ "Spor", "https://example.com/sports" }
};

foreach (var source in newsSources)
{
Console.WriteLine($"{source.Key} kategorisi için veriler toplanıyor...");

// Sayfayı indir
var html = await scraper.DownloadPageAsync(source.Value);

if (!string.IsNullOrEmpty(html))
{
// HTML'i ayrıştır ve makaleleri al
var articles = scraper.ParseNewsPage(html, source.Key);

// Kategorize et
processor.CategorizeArticles(articles);

// Yinelenen içerikleri kaldır
processor.RemoveDuplicates(articles);

// Veritabanına kaydet
dbManager.SaveArticles(articles);

Console.WriteLine($"{articles.Count} makale başarıyla işlendi.");
}
}

// Rapor oluştur
dbManager.GenerateReport("news_report.json");

Console.WriteLine("İşlem tamamlandı. Rapor 'news_report.json' dosyasına kaydedildi.");
Console.ReadKey();
}
}

Projenin Faydaları ve Kullanım Alanları

Geliştirdiğimiz bu web kazıma uygulaması, birçok farklı senaryo için özelleştirilebilir:

  1. İçerik Agregasyonu: Farklı haber kaynaklarından içerik toplayarak kişiselleştirilmiş bir haber akışı oluşturabilirsiniz.
  2. Pazar Araştırması: Rakiplerin ürünlerini ve fiyatlarını izleyerek pazar analizleri yapabilirsiniz.
  3. Veri Analizi: Toplanan veriler üzerinde analiz yaparak trendleri ve kalıpları tespit edebilirsiniz.
  4. Makine Öğrenmesi: Otomatik olarak kategorize edilmiş haber makaleleri, metin sınıflandırma algoritmaları için eğitim verisi olarak kullanılabilir.

Sonuç

Bu makalede, C# programlama dili kullanarak adım adım bir web kazıma uygulaması geliştirdik. Bu uygulama, web sayfalarından veri çekme, verileri işleme, kategorize etme ve veritabanında saklama işlemlerini gerçekleştirmektedir. Geliştirdiğimiz bu uygulama, ihtiyaçlarınıza göre genişletilebilir ve özelleştirilebilir.

C#'ın sunduğu zengin kütüphane ekosistemi ve güçlü nesne yönelimli programlama özellikleri, web kazıma gibi karmaşık görevleri bile kolaylaştırmaktadır. Bu projede kullandığımız HtmlAgilityPack, Entity Framework Core gibi kütüphaneler, C# geliştiricileri için büyük kolaylık sağlamaktadır.

Unutulmamalıdır ki, web kazıma yaparken her zaman ilgili web sitesinin kullanım şartlarına saygı göstermeli ve aşırı isteklerden kaçınarak sunuculara gereksiz yük bindirmemeye özen göstermeliyiz.

Bu proje, C# programlama dili ile veri toplama ve işleme konusunda temel bir başlangıç noktası olarak görülebilir. Siz de kendi ihtiyaçlarınıza göre bu uygulamayı geliştirerek, veri odaklı projelerinizde kullanabilirsiniz.

Spraya
Abdullah

Yazılım - Siber Güvenlik - Sosyal Medya


Toplam 0 Yorum

Henüz yorum yapılmamış.

Cevap Bırakın

E-posta adresiniz paylaşılmayacaktır ! Zorunlu alanlar * ile işaretlenmiştir.