Web sayfaları HTML kodlarından meydana getirilmektedir. Sayfa içerisinde yeralan veriler nitelik olarak HTML kodları ile ifade edilmektedir. Tarayıcılarınız üzerinde mouse sağ tuşuna basıp “Kaynağı Görüntüle” sayfanın oluşumunda bulunan tüm kaynak HTML kodlarını görebilirsiniz.
Bilindiği üzere bu HTML belgesi sunucuda barınmaktadır. Siz herhangi bir tarayıcı ile sayfanın adresini yazarak bir istekte bulunursunuz. HTML dökümanı ve beraberindeki tüm CSS, Javascript gibi unsurları, metin (text) formatında bilgisayarınıza ulaştırılır. Tarayıcınız bu dökümanda bildirilen tüm direktifleri gerçekleştirir ve sayfayı ekranınıza görüntüler.
Bu yazımızla birlikte C# ile HTML kaynak kodunu programatik olarak elde edebilirsiniz. Uygulamamızda .NET Framework’ün System.NET kütüphanelerinden faydalanarak siteye bir istekte bulunacağız. Ardından System.IO kütühanesi yardımıyla istek sonucu gelen sayfa kodlarını dosya akımı şeklinde okuyacak ve sonucu metinsel (string) bir bilgi alarak alacağız.
Uygulamaya başlarken .Net Framework’ün System.NET ve System.IO kütüphanelerinin kullanılacağını “using” deyimi ile kodlarımızın başında bildirmeliyiz.
1 2 3 4 5 |
using System; using System.IO; using System.Net; |
Uygulama kodlarını “HtmlKaynakOku” isimli bir metod altında gerçekleştirelim. Söz konusu metodu dilediğiniz platformda (Console, WPF, WinForm) kullanabilirsiniz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
string HtmlKaynakOku(string url){ HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); HttpWebResponse response = (HttpWebResponse)request.GetResponse(); if (response.StatusCode == HttpStatusCode.OK) { Stream receiveStream = response.GetResponseStream(); StreamReader readStream = null; if (response.CharacterSet == null) { readStream = new StreamReader(receiveStream); } else { readStream = new StreamReader(receiveStream, Encoding.GetEncoding(response.CharacterSet)); } string data = readStream.ReadToEnd(); response.Close(); readStream.Close(); return data; } |
Uygulama için kullandığımız sınıf ve metodlarını öğrenelim ve neler yaptığımıza bir bakalım;
HttpWebRequest : Doğrudan HTTP kullanarak sunucularıyla etkileşim kurmak için kullanılan yöntemleri barındırır. GetResponse() Metodu, belirtilen adres için eşzamanlı istek yapar.
HttpWebResponse : HTTP isteği gönderip, sunucudan dönen HTTP yanıtlarını almak için kullanılır. Uygulamada kullandığımızı GetResponseStream() metodu, Sunucudan yanıtın gövdesini (<body>) okumak için kullanılan bir akış nesnesi yaratır.
Stream : Gerek bir dosyadan okuduğunuz byte dizileri, gerekse bir iletişim kanalından (örneğimizde TCP/IP kanalı ) üzerinden gelen verilere ait byte dizilerini akış olarak temsil eden sınıftır.
StreamReader : Bir kaynaktan gelen byte dizi akışını belirli bir karakter seti ile okumak için kullanılır.
Uygulamımızı Console ortamında test edelim. Örneğimiz için sitemizin ana sayfasının HTML kaynak kodunu okuyacağız.
HtmlOku.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
using System; using System.IO; using System.Net; using System.Text; namespace HtmlOku { class Program { static void Main(string[] args) { string urlAdres = "https://yazilimbilisim.net"; string htmlKaynak = HtmlKaynakOku(urlAdres); Console.WriteLine(htmlKaynak); Console.ReadKey(); } static string HtmlKaynakOku(string url) { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); HttpWebResponse response = (HttpWebResponse)request.GetResponse(); string data=""; if (response.StatusCode == HttpStatusCode.OK) { Stream receiveStream = response.GetResponseStream(); StreamReader readStream = null; if (response.CharacterSet == null) { readStream = new StreamReader(receiveStream); } else { readStream = new StreamReader(receiveStream, Encoding.GetEncoding(response.CharacterSet)); } data = readStream.ReadToEnd(); response.Close(); readStream.Close(); } return data; } } } |
Uygulamayı çalıştırdığımızda Console ekranında yazilimbilisim.net sitesinin ana sayfasına ait HTML kaynak kodlarını görebiliriz.