Yazılım Mimarileri ve Tasarım Desenleri Üzerine

C# İle Bot Yapımı – Web Sitelerinden İçerik Çekme

Her ne kadar etik olmasada programcıların hatta genellikle web site programcılarının en büyük hizmetkarı olacak olan içerik çekme botlarının yapımından bahsedeceğiz.Geçenlerde bir işimden dolayı yazmak zorunda olduğum bir bot için internette sürekli detaylı bir araştırmada bulundum.Yabancı sitelerde dahil olmak üzere genellikle <title> etiketi içindeki veriyi çeken programlarla örneklendirme yapılmış.Hatta çoğu sitede aynı kodlar alıntı edilmiş.Haliyle bende bu kodlar üzerinden yola çıkıp belirli değişiklikler neticesinde ihtiyacım olan botu geliştirebildim.Tabi bu yazımızda örneklendirme olarak <title> etiketinden başka bir alanın içeriğini çekmeyi göreceğiz.Bilmenizi isterim ki, algoritmik mantığınızı kurup kendi ihtiyacınız olan botları çok rahat bir şekilde oluşturabilirsiniz.Sadece biraz zahmet ve emek isteyen bir iştir.Şimdi gelin yazımızın içeriğini irdeleyelim.

İster Asp.NET ya da Asp.NET MVC mimarisi olsun, istersede C# masaüstü mimarisi farketmez.Sonuçta kodlarımız standart C# kodları olacağı için her .NET platformuna uygun çalışabilmektedir.Bu yüzden ben örnek olarak C# Console Application projesinde örneklendirme yapacağım.

Öncelikle içeriğin çekileceği web siteyi belirlememiz gerekmektedir.Ben kendi sitem olan http://www.gencayyildiz.com adresinden aşağıdaki görüntüde olan alanın bilgisini çekecek örnek bir program oluşturacağım.

Görüntüde de gördüğünüz gibi “Kod yazmak bir sanattır…” yazısını C# ile çekeceğiz.Programatik olarak mevzuya girmeden önce içeriğini çekeceğimiz sitenin kaynak kodlarını incelememiz gerekmektedir.
Kaynak kodlar için web sitesinde sağ tıklayarak “Sayfa kaynağını görüntüle” seçeneğine tıklamamız gerekmektedir.Karşımıza bu sitenin HTML/CSS/JavaScript vs. gibisinden kaynak kodları gelecektir.Bu kaynak kodların arasından ilgili alanı bulmamız gerekmektedir.

Yukarıdaki resimde gördüğünüz gibi çekeceğimiz içeriği kaynak kodlarında bulmuş olduk.

Şimdi buraya kadar tamam.Şimdi programatik olarak algoritmamızı kurup, bu kaynak kodlarındaki HTML/CSS kodlar arasından bu içeriğe nasıl ulaşacağımızı yapalım.

Öncelikle System.Net kütüphanesinde bulunan HttpWebRequest sınıfımız sayesinde http://www.gencayyildiz.com adresine bağlantı talebi yapalım.

            WebRequest SiteyeBaglantiTalebi = HttpWebRequest.Create("http://www.gencayyildiz.com");

Gördüğünüz gibi bağlantı talebini WebRequest tipinden bir referansa atamış olduk.Şimdi bu talep neticesinde gelen cevabı WebResponse referansına alalım.

            WebResponse GelenCevap = SiteyeBaglantiTalebi.GetResponse();

Şimdi gelen cevabı okuyalım.

            StreamReader CevapOku = new StreamReader(GelenCevap.GetResponseStream());

Okuduğumuz cevabı System.IO kütüphanesinde bulunan StreamReader tipinden referansa atadık.

Şimdi StreamReader tipinden olan CevapOku isimli referansımızın temsil ettiği nesnemizde içerik çekeceğimiz sitenin bütün kaynak kodları bulunmaktadır.Bu kaynak kodları bir string tipten değişkene atamak daha kullanışlı olacaktır.

            string KaynakKodlar = CevapOku.ReadToEnd();

Evet artık KaynakKodlar isimli string değişkenimizde içerik çekeceğimiz sitenin kaynak kodları mevcuttur.Bundan sonra string metodlarını kullanarak rahat rahat içeriğimizi çekebiliriz.

            int IcerikBaslangicIndex = KaynakKodlar.IndexOf("<h6>") + 4;

Burada yaptığımız iş KaynakKodlar değişkeninde bulunan <h6> etiketinin index numarasına ulaşıp bu index numarasına +4 ekliyoruz.Bu +4 ün sebebi ise <h6> etiketi içindeki yazıyı alacağımızdan dolayı <h6> etiketinin karakter sayısınıda ekliyoruz ki sadece içindeki yazan yazıyı çekebilelim.Yani index numarası tam <h6> etiketinin bitişine, içinden de alacağımız içeriğin başlangıcına denk gelmektedir.
Şimdi sıra başlangıç indexi ile bitiş indexi arasındaki içeriği aldırmak için bitiş indexsini bulmakta.

            int IcerikBitisIndex = KaynakKodlar.Substring(IcerikBaslangicIndex).IndexOf("</h6>");

Bizim çekmek istediğimiz değer <h6> ile </h6> arasında bulunduğundan dolayı bir önceki IcerikBaslangicIndex isimli değişken değerinden , </h6> etiketinin bitiş indexine kadar olan farkı alıyoruz.

Artık sıra bu indexler arasındaki değeri çekip ihtiyacımıza göre kullanmaya geliyor.

            Console.WriteLine(KaynakKodlar.Substring(IcerikBaslangicIndex, IcerikBitisIndex));

Artık programımızı derleyip çalıştırdığımızda istediğimiz veriyi kaynak siteden çekip elde etmiş oluyoruz.

Gördüğünüz gibi bot yapımı bu kadar basit bir işlem.Tabi HTML/CSS kodları kompleks olan sitelerden içerik çekmek daha zor ve algoritmik emek isteyen bir iştir.Ama temel olarak bu yapıyı benimserseniz ihtiyacınızı karşılayacak her türlü botu oluşturabilirsiniz.

Bunu geliştirmek sizin elinizde..

Son kez kodların tam derlenmiş halini paylaşıp yazımızı sonlandırıyorum.

            WebRequest SiteyeBaglantiTalebi = HttpWebRequest.Create("http://www.gencayyildiz.com");
            WebResponse GelenCevap = SiteyeBaglantiTalebi.GetResponse();
            StreamReader CevapOku = new StreamReader(GelenCevap.GetResponseStream());
            string KaynakKodlar = CevapOku.ReadToEnd();
            int IcerikBaslangicIndex = KaynakKodlar.IndexOf("<h6>") + 4;
            int IcerikBitisIndex = KaynakKodlar.Substring(IcerikBaslangicIndex).IndexOf("</h6>");

            Console.WriteLine(KaynakKodlar.Substring(IcerikBaslangicIndex, IcerikBitisIndex));
            Console.Read();

Faydalanmanız ve bir sonraki yazımda görüşmek dileğiyle…
İyi çalışmalar..

Exit mobile version