C#

C# Web Sitesinden Veri Çekme

Herkese merhaba, C# yazılarımıza kaldığımız yerden devam ediyoruz. Bu yazımızda C# ile web sitesinin HTML kodlarını çekip veri almayı anlatacağım. Hadi başlayalım !

C#’ta bir web sitesinin HTML kodlarını alıp onun içinden veri almak için bir çok kütüphane bulunmakta fakat en çok kullanılan ve bilineni HtmlAgilityPack. Bu kütüphane C#’ın kurulumu ile birlikte gelmeyen yani 3. parti bir kütüphane. Yani indirip projeye eklememiz gerekiyor. Bunun en kolay yolu ise Nuget kullanmak. Nuget, Visual Studio içerisinde gömülü bir eklenti ve https://nuget.org sitesinde kayıtlı kütüphaneleri projenize eklemeye yarıyor. Bu web sitesi zaten Microsoft’un. Geliştiriciler kendi kütüphane ve paketlerini oluşturup Nuget’e kaydediyor ve diğer geliştiricilerin kullanımına açıyor. Geliştiriciler ise paketleri indirip projelerinde kullanabiliyorlar. HtmlAgilityPack paketi de Nuget’te kayıtlı ve Visual Studio üzerinden Nuget kullanılarak projeye eklenebiliyor. Nuget’i kullanabilmek için de Visual Studio içerisinde gömülü bir terminal açmamız gerekiyor. Bunun için Tools > Nuget Package Manager > Package Manager Console adımlarını izleyerek Nuget terminalini açabilirsiniz. Terminali açtıktan sonra şöyle bir komut girerek HtmlAgilityPack paketini projenize ekleyebilirsiniz.

install-package htmlagilitypack

Bu komutun ardından Nuget, HtmlAgilityPack paketini indirecek ve projenize ekleyecektir. Her ne kadar HtmlAgilityPack paketini projeye eklesekte kod yazacağımız dosya içerisinde çağırmamız, bu kütüphaneyi kullanacağız dememiz gerekiyor. Bunun için dosyayı açıp en üste gelerek

using System.Net;
using HtmlAgilityPack;

kod satırını eklememiz gerekiyor. Bu kod satırını da ekledikten sonra artık HtmlAgilityPack paketini kullanabiliriz.

HtmlAgilityPack paketi ile HTML işlemleri yapabilmek için öncelikle elimizde HTML kodlarının olması gerekiyor. HTML kodlarını elle oluşturabildiğimiz gibi bir web sitesinin HTML kodlarını da indirebiliriz. C# ile HTML kodlarını indirebilmek için System.Net kütüphanesi altındaki WebClient sınıfını kullanabiliriz. Bu sınıfı kullanabilmek için de yeni bir nesnesini türetmemiz gerekiyor. Yeni bir nesnesini constructor metodunu kullanarak oluşturabiliriz. Yani şöyle;

WebClient client = new WebClient();

Web sitesinin HTML kodlarını indirebilmek içinde client nesnesi altındaki DownloadString() fonksiyonunu kullanıyoruz. Bu fonksiyon string tipte web sitesinin linkini (URL) istiyor ve verdiğimiz linkteki web sitesinin HTML kodlarını getiriyor. Getirdiği HTML kodlarını ise string tipte geriye döndürüyor. Yani döndürdüğü veriyi string tipte bir değişkene atayabiliriz. Örneğin Google’ın HTML kodlarını indirelim.

string html = client.DownloadString("https://google.com");

HTML kodlarını indirdik fakat bu kodlardan şimdilik HtmlAgilityPack paketinin haberi yok. HtmlAgilityPack ile HTML kodları üzerinde HtmlDocument adında bir sınıfı kullanarak işlem yapacağız. Bu sınıfında yeni bir nesnesini türetmemiz gerekiyor ve constructor metodu parametre istemiyor.

HtmlDocument document = new HtmlDocument();

HtmlDocument sınıfından yeni bir nesne türettik, şimdi az önce indirdiğimiz HTML kodlarını bu sınıfın içerisine dolduralım. Bunun için document nesnesi altındaki LoadHtml() fonksiyonunu kullanacağız. Bu fonksiyon string tipte HTML kodlarını istiyor. Az önce client nesnesi kullanarak indirdiğimiz HTML kodlarını bu fonksiyona parametre olarak gönderirsek document nesnesini doldurmuş oluruz. Fonksiyon void tipte olduğu için geriye herhangi bir şey döndürmüyor.

document.LoadHtml(html);

Buraya kadar ön hazırlıkları tamamladık. Şimdi sıra geldi HTML kodları üzerinden veri almaya. Veri almak için document nesnesi altındaki DocumentNode sınıfı ve onunda altındaki SelectSingleNode() ve SelectNodes() fonksiyonları kullanılıyor. SelectSingleNode() fonksiyonu ile tek veri seçilebiliyorken; SelectNodes() fonksiyonu ile çoklu veri seçilebiliyor. Her iki fonksiyonda string tipte verinin alınacağı yerin XPath bilgisini parametre olarak istiyor. XPath’i tarayıcı (Chrome, Firefox, Opera vb.) üzerinden F12 tuşuna basarak açılan Geliştirici Araçları kısmından Elements kısmına geçip veri almak istediğiniz HTML kodunu seçerek sağ tıklayıp Copy > Copy XPath adımlarını izleyerek alabilirsiniz. Bunun yanında özel XPath yazımı ile CSS selector yöntemi ile de HTML etiketini HtmlAgilityPack paketi üzerinden seçebilirsiniz. SelectSingleNode() fonksiyonuna gönderdiğiniz XPath yada CSS için bir tane HTML etiketi varsa doğrudan onu alır, birden fazla varsa da birincisini alır. SelectNodes() fonksiyonu ise bir tane de olsa birden fazla da olsa onu size dizi olarak döndürür. Örneğin Google üzerinden sayfa başlığını (<title> etiketi) almak istiyorsanız şöyle bir kod yazabilirsiniz;

document.DocumentNode.SelectSingleNode("/html/head/title");

Bu doğrudan XPath ile seçimi idi. Ayrıca CSS seçicisi ile de şöyle alabiliriz;

document.DocumentNode.SelectSingleNode("//title");

Buradaki //title CSS seçicisinden gelmekte. Başında bulunan // ile CSS seçicisi olduğunu belirtiyoruz ve title ise <title> etiketi anlamına geliyor. Bunun yanında attribute ile de seçim yapılabilmekte. Bunlardan birkaç tanesine örnek verelim;

document.DocumentNode.SelectSingleNode("//div[@class='class_adı']");
document.DocumentNode.SelectSingleNode("//div[@id='id_adı']");
document.DocumentNode.SelectSingleNode("//div[@aria-label='deneme 123']");
document.DocumentNode.SelectSingleNode("//input[@value='Google']");
document.DocumentNode.SelectSingleNode("//input[@type='text']");

Burada ilk örnekte class’a, ikinci örnekte id’ye, üçüncü örnekte aria-label’a, dördüncü örnekte value’ya ve beşinci örnekte type’e göre seçim yaptık. SelectNodes() ile SelectSingleNode() fonksiyonlarının her ikisinde de bu şekilde seçim yapılabilmekte fakat dediğim gibi SelectSingleNode() ile tekli, SelectNodes() ile ise çoklu seçim yapılabilmekte.

HTML etiketini de seçtiğimize göre artık bunun üzerinden veri alabiliriz. Örneğin HTML etiketi üzerindeki metni almak için InnerText, HTML kodunu almak için InnerHtml, id değerini almak için Id propertylerini kullanacağız. Diğer tüm veriler için Attributes propertysini kullanacağız. Örneğin Google’ın site başlığını alalım ve bunu bir değişkene atayalım;

string baslik = document.DocumentNode.SelectSingleNode("//title").InnerText;

Attributes propertysi bir dizi. Yani altında seçtiğimiz etiketin attribute değerleri var. Dizi fakat normalde dizilerden sayısal index numaralarıyla seçim yapılabiliyorken Attributes dizisinde string index ile de seçim yapılabilmekte. Örneğin aria-label attributesini almak için Attributes[“aria-label”] şeklinde kullanabiliriz.

SelectNodes() fonksiyonu çoklu veri döndürüyor dedim ya, bu verinin tipi HtmlNodeCollection. Bir Collection olduğundan döngü kullanarak üzeride gezebilir ve her bir döngü adımında elimize gelen HtmlNode nesnesi ile tıpkı SelectSingleNode() fonksiyonundan dönen HtmlNode gibi işlem yapabiliriz. Ayrıca Linq kullanarakta istediğimiz işlemleri gerçekleştirebiliriz. Örneğin Google’da head etiketi içerisindeki etiketlerin InnerText değerini alalım ve console ekranına yazdıralım.

HtmlNodeCollection collection = document.DocumentNode.SelectNodes("/html/head");
foreach (HtmlNode node in collection)
{
    Console.WriteLine(node.InnerText);
}

Aynı işlemi Linq kullanarak şöyle yapabiliriz;

document.DocumentNode.SelectNodes("/html/head").ToList().ForEach(node => Console.WriteLine(x.InnerText));

Linq ile daha kolay ve hızlı yapabiliyoruz fakat nasıl yapacağınıza kendiniz karar verirsiniz artık 🙂

Evet HtmlAgilityPack ile web sitesinden veri çekme işlemi böyle yapılmakta. Tüm C# yazılarımıza buraya tıklayarak ulaşabilirsiniz. Herkese hayırlı günler.

Skorumuz:
Oy Vermek İçin Tıklayın
[Toplam: 0 Ortalama: 0]

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Başa dön tuşu