İlk önce NuGet üzerinden HTMLAgilityPack indirmeniz gerekiyor. Daha sonra kütüphaneleri en üste ekleyebilirisiniz.
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Net.Http;using System.Threading.Tasks;using HtmlAgilityPack;Kütüphaneleri ekledikten sonra asenkron verisi üzerinden hatayı en aza indirmek adına class Program verisi altına şu başlıkları ve fonksiyonları girelim.
C#:
private static HashSet<string> visitedUrls = new HashSet<string>(); // Ziyaret edilen URL'leri tutar
private static Queue<string> urlsToVisit = new Queue<string>(); // Ziyaret edilecek URL kuyruğu
private static readonly HttpClient client = new HttpClient();
private static string baseDomain;
URL 'leri listeleyecek ana kodum burada birazdan vereceğim fonksiyonlar ile burada gerçekleşen işlemleri bütünleyeceğiz.
C#:
// Başlangıç URL'si
string startUrl = "https://www.hedef.com/";
urlsToVisit.Enqueue(startUrl);
baseDomain = new Uri(startUrl).Host;
// HTTP başlığını ayarlayarak bot olduğumuzu gizleyebiliriz
client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.85 Safari/537.36"); //Buradaki User Agent örnektir siz kendi User Agent verinizi girebilirsiniz.
Console.WriteLine("Tarama başlıyor...");
await Crawl();
Console.WriteLine("Tarama tamamlandı!");
Console.ReadLine();
URL kontrolü yaptıralım kodumuza. Eğer daha önce ziyaret edilmiş ise listeye eklemesin bu sayede aynı veriyi sürekli döndürüp durmayalım.
C#:
static async Task Crawl()
{
while (urlsToVisit.Count > 0)
{
string currentUrl = urlsToVisit.Dequeue();
// Eğer URL zaten ziyaret edildiyse atla
if (visitedUrls.Contains(currentUrl))
continue;
try
{
Console.WriteLine($"Ziyaret ediliyor: {currentUrl}");
string html = await client.GetStringAsync(currentUrl);
// Ziyaret edildi olarak işaretle
visitedUrls.Add(currentUrl);
// Bağlantıları çıkar ve kuyruğa ekle
ExtractLinks(currentUrl, html);
}
catch (HttpRequestException ex)
{
Console.WriteLine($"Hata (URL: {currentUrl}): {ex.Message}");
}
catch (Exception ex)
{
Console.WriteLine($"Beklenmeyen hata (URL: {currentUrl}): {ex.Message}");
}
// Sunucuyu yormamak için kısa bir gecikme
await Task.Delay(1000); // 1 saniye bekle
}
}
Son olarak ise linkleri çıkarmaya yarayan kodumuza geldi sıra. Burada a href tag 'leri arasında yer alan URL 'leri ayırıp göndermeye yarıyor. Bu işlemleri yaparken HTMLAgility paketinden destek alıyor. Ayrıca sitelerin çoğunda reklam URL 'leri olabiliyor bu tarz reklam URL 'leri sitenin URL 'sinden farklı ise dahil etmiyor.
C#:
static void ExtractLinks(string baseUrl, string html)
{
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(html);
var linkNodes = doc.DocumentNode.SelectNodes("//a[@href]");
if (linkNodes == null) return;
Uri baseUri = new Uri(baseUrl);
foreach (var node in linkNodes)
{
string href = node.GetAttributeValue("href", string.Empty);
if (string.IsNullOrEmpty(href)) continue;
// Göreceli URL'leri tam URL'ye çevir
Uri fullUri;
try
{
fullUri = new Uri(baseUri, href);
}
catch (UriFormatException)
{
continue; // Geçersiz URL'leri atla
}
string fullUrl = fullUri.ToString();
// Sadece aynı domaine ait URL'leri ekle
if (fullUri.Host == baseDomain && !visitedUrls.Contains(fullUrl) && !urlsToVisit.Contains(fullUrl))
{
urlsToVisit.Enqueue(fullUrl);
Console.WriteLine($"Bulundu: {fullUrl}");
}
}
// Console.WriteLine($"Kuyrukta {urlsToVisit.Count} URL var, {visitedUrls.Count} URL ziyaret edildi.");
}
[ SONUÇ ]
Kodlarda yardımı dokunan @v for vandet 'e & @Grimner 'e yapmış olduğu geçmiş makale paylaşımından dolayı teşekkür ederim.
Son düzenleme:

