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.
www.gencayyildiz.com
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.
kaynakkodlari
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.
kod yazmak bir sanattır

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..

Bunlar da hoşunuza gidebilir...

60 Cevaplar

  1. Fırat dedi ki:

    Merhabalar bu olayı kendim için geliştiriyorumda ama verileri çekerken nedense

    Length cannot be less than zero.
    Parameter name: length

    startIndex cannot be larger than length of string.
    Parameter name: startindex

    hatalarını alıyorum bu hatalar neden kaynaklanıyor olabilir ?

    • Gençay dedi ki:

      Merhaba Fırat,
      Anlaşılan SubString metodunu kullanırken bu hatayı alıyorsunuz.Büyük ihtimal SubString ile almaya çalıştığınız verinin karakter sınırını aşıyorsunuz.
      Örneğin,
      15 karakterli bir veride, 3. indexten başla 15 adımlık indexi getir derseniz eğer hata alırsınız.

  2. film izle dedi ki:

    güzelmiş ama detaylı degil

    • Gençay dedi ki:

      Ne yazık ki bu konu hakkında detaylı bir yazılı materyal hazırlamak imkansız ve oldukça zor bir durumdur.Temel işlevselliği kazandıktan sonra var olanla hareket edilmek hiçte zor olmasa gerek.Burada önemli olan detay değil, bu işin nasıl yapıldığıdır.Facebook ya da abc.com olsun ikisinede aynı temelde bot hazırlanır.İşte detay burada dallara ayrılmaktadır.Birisinde yüksek güvenlik varken, diğerinde basit işlemler geçerli olabilir.

  3. enes dedi ki:

    Örneğin blog vb sitelerden içerik cekmenin yasal bir yaptırımı var diye biliyorum. Kisiye özel olmayan misal ingilizce kelime ve karsiliklarini vermis bir siteden bu bilgileri cekmenin bize ne gibi sakincalar dogurabilir bukonuda da ffikrini almak isterim

    • Gençay dedi ki:

      Bot hazırlamayı bilmek ya da hazırlamak illa yasaları ihlal etmek demek değildir.Tabi ki de ihlal konusu olan durumlar ya da içerikler olabilir.Ama bu tekniği yasal açıdan değil bir yazılımcı açısından görmekte, bir algoritma ve mantık süzgeci olduğu için bilmekte fayda var diye düşünüyorum.İkincisi her yazılan bot bir içerik çekmek zorunda değildir.Ya da çekilen her içerik bir başka platformda yayınlanmak zorunda değildir.Bilakis tarayıcı eşliğinde bir sitenin sayfalarını teker teker manuel bir şekilde gezerek botun yaptığını kendimizde yapabiliriz.İçeriğini kopyalayabilir, bilgisayarımızda özel bir konumda saklayabiliriz.Bot bizim manuel yaptığımızı daha dinamik(mekanik) bir şekilde ve seri yapabilmektedir(tabi basit bir işlevselliği baz alırsak).Söz konusu yayınlamaya gelince yasal durumlar devreye girebilir.Öncelikle bot hakkında bu açıdan bakabilmek lazım.

      Tabi ki de alınan içeriğin izin hakları önemlidir.Alınan içerikler bir yerde yayınlanma koşuluyla yasal bir korunumda olabilir.Aksi halde sadece kendi bilgisayarınızda bu içerikleri tutacaksanız bunların bir yasal çerçevesi olduğunu hiç sanmıyorum.Sakınca doğurabilecek yasal durumlar hakkında hukuksal hiç bir bilgim ne yazık ki bulunmamaktadır…

      Saygılarımla…

  4. erdinç dedi ki:

    javascript ile yüklenen dinamik html kaynak kodlarını nasıl çekeceğimizi anlattığınız bir yazınız mevcut mudur?

  5. Hüseyin dedi ki:

    Giris yapilarak erisilen bir sayfadan veri cekmek istersek nasil bir yol uygulamamiz gerekiyor

    • Gençay dedi ki:

      Programatik olarak giriş yapmak oldukça zahmetli iş olacaktır.Giriş yaptıktan sonra otorum açık olduğu sürece belirtilen işlemleri gerçekleştirebilirsiniz.

  6. halit dedi ki:

    Kuzenimle birlikte yapabilirmiyiz diye başladığımız deneme amaçlı bir android uygulama yaptık. Uygulama vidtomp3 sitesinden youtube videolarını sese dönüştürecek. Elbette zaten var diyeceksiniz. Evet var ama biz değişik özellikler katacağız. Hatta ilk olacak.Javascript ve c# ile yaptık. Ses cevirisi icin link kopyalayip yapistirdiktan sonra ceviri islemi icin 3 tik gerekiyor. Cevir-yonlendir-indir gibi. Ama arada site reklam cikardigi icin reklama tiklamayla tik sayisi 4 e cikiyor. Bunu asmaya calisiyoruz. Asmanin uzunca yolu var. Ama kestirme yapicaz… Ama sunu gordum javascript diger dillerden daha insancil 😉 resmen bizi anliyor ve anlatiyor

  7. asdf dedi ki:

    üstat ben sitedeki tüm sayfaların kaynak kodlarını çekmek istiyorum ama yapamadım. sadece sitenin domain.com bilgisi ile sitede bulunan tüm sayfaların kaynaklarını çeken bir kod arıyorum ama bulamadım stack overflow dan da baktım ama tam çözemedim olayı bir internet sitesinde (sayfa değil sayfayı yapabiliyorum. tüm site) bulunan mail adreslerini çekmek için yazılım yapmaya çalışıyorum. tabi bunu geliştirip site içerisindeki linklerin de bulunduğu domainlere açılıp 1.2.3. …. dereceden linki olan tüm domainlerdeki tüm mail adreslerini çekmek istiyorum ama işin içinden çıkamadım açıkçası saadece bir sayfadan çekebiliyorum içerisinde bulunan linkleri ve mailleri .. yardımcı olabilirmisin

  8. zafer dedi ki:

    peki bu yöntemle twitter yada facebook gibi bir siteden kişiye göre bilgi çekebilir miyim mesela bir kaç profilin neler yaptığını liste şeklinde cevap bekliyorum deniyorum ama yapamadım acaba yanlış yaptığım birşey mi var

    • Gençay dedi ki:

      Sorun o kadar açık ki ne yazsam bilemedim.Lütfen öncelikle sorunda neyi istediğini anlamlı bir şekilde yaz.Öyle soruyu baştan sağma yazıp benim tahmin etmemi beklemen olmaz.

  9. Hüseyin dedi ki:

    Merhabalar,

    Öncelikle değerli paylaşımlarınız için teşekkürler..
    Bir sorun var aşamadığım bu konuda, yazınızdan faydalanarak basitçe bir siteden içerik çekmek istiyorum.. Ancak denemediğim yöntem kalmadı neredeyse fakat bir bir türlü Türkçe karakter sorunun çözemiyorum.. ark. intel. com/tr sitesinden h3 içerisindeki veriyi okumaya çalışıyorum fakat küçük harfli Türkçe karakterler “Masaüstü Bilgisayar İşlemcileri” şekildeki gibi bozuk geliyor. Normalde sitede düzgün görünüyor fakat ctrl+u ile source koda manuel baktığımda da aynı yer bozuk görünüyor. Konu hakkında fikriniz bilginiz var mı acaba? Yardımcı olabilirseniz çok sevinirim.. Saygılarımla..

    • Gençay dedi ki:

      Merhaba Hüseyin Bey,
      Tarayıcılarda kaynak kodlardaki bozuk karakterler görüntü olarak ekranda gayet normal çıkabiliyorlar.Bu durumda siz bot yazarken işiniz kaynak kodlarla olduğu için, kaynaktaki bozuk karakterleri elde etmeniz gayet normal.

      Bu soruna çözüm olarak yapabileceğiniz yöntem ise bozuk karakterleri düzeltecek bir metod oluşturmayı düşünebilirsiniz.

      İyi çalışmalar dilerim…

  10. Hüseyin dedi ki:

    veriyi çektikten sonra “veri = System.Net.HttpUtility.HtmlDecode(veri);” yaptığımda düzeldi.. çok aradım arayan vardır belki..

  11. Hakan dedi ki:

    Her ne kadar bot yazma konusuna giriş gibi gözüksede sitenin tamamından istediğimiz veriyi nasıl çekeceğimize güzel bir örnek olmuş. Verdiğiniz bilgiler için teşekkürler.

  12. Özcan Özaltın dedi ki:

    internetten veri çekebiliyoruz ama acaba internete veri ekleyebilir mşyşz?

  13. Ca dedi ki:

    Öncelikle merhabalar veri çekme işini C dili ile yapabilirmiyim? yaparsamda algoritmam ve metodlarım çok farklı olurmu? şimdiden teşekkür ederim..

    • Gençay dedi ki:

      Merhaba Ca Bey

      Algoritma aynı mantıkta olabilir lakin C dilindeki eşdeğer metodları incelemeniz gerekecektir. Çok fark olmaz. Sadece burada değişken tipinin C deki karşığını bulmanız ve kullanış farkını gözetmeniz yeterli olacaktır.

      Saygılar…

  14. Ali Yaman dedi ki:

    Çok Teşekkürler

  15. myb dedi ki:

    Hocam bilginizi paylaştığınız için teşekkürler benim sorum siz etiketini çekmişsiniz ben örneğin 1564 tablosundaki 1564’ü nasıl çekebilirim.
    Cevabınızı bekliyorum iyi çalışmalar.

  16. ebru dedi ki:

    merhaba yazınız cok faydalı fakat bot olayını yeni yeni kavrayabiliyorum söyleki ben mesela cekicem ama birde class özelliğini belirtmek isitoyrum yani h2 nin sadece belirttiğim class ında bulunanları bunu nasıl yapabilirim

    • Gençay dedi ki:

      Merhaba Ebru Hanım,

      Sorunuzun cevabı tasarımın kaynak kodlarına özel olarak tasarlanmış bir algoritmadan ibarettir. Haliyle genel mantık olarak verilecek cevap bu makalenin içeriği olmakla beraber, sorunuza özel olarak örnek bir algoritma geliştirmek gerekecektir. Buda çalışmayı tasarıma göre şekillendireceği için biraz daha kompleksleştirecektir ve şuanda isteğiniz özel duruma göre örnek verebilmem mümkün gözükmemektedir.

      Saygılarımla…

  17. Emre dedi ki:

    S.a Size Bir Soru Sormak İstiyorum

    Forum Yorum Botu Yapıcamda Nasıl Yapıcağımı Bilmiyorum Sizde Kodları Var mı

    • Gençay dedi ki:

      Forum yorum botu kodları diye birşey yoktur. Programlamayı bilirsin. İhtiyaç ve hedef neyse ona göre yazılımı işlersin. Eğer yaklaşımın buysa, bilgin değil bot yazmaya daha değişken oluşturacak seviyede değilse ve herşeyden öte Türkçe imla bilgin zayıfsa sana tek tavsiyem yol yakınken gel bu sevdadan vazgeç!

  18. muhsin dedi ki:

    merhaba değerli paylaşımlarınız için öncelikle teşekürler benim sorum şu bot yazarken CAPTCHA (Şahıs Denetim) Kodu var sizin bloğunuzda da olduğu gibi ben bunu elde edip otomatik girilmesini ve işleme devam etmesini istiyorum bu konuda bana yardımcı olursanız çok sevinirim

  19. muhsin dedi ki:

    CAPTCHA (Şahıs Denetim) Kodunu ve text kutucuğunu webbrowserda göstermek istiyorum sadece o alanları bu mümkünmüdür

  20. muhsin dedi ki:

    selamun aleyküm çözümü buldum aşağıdaki gibi yapınca işime yaradı webBrowser1’in DocumentCompleted eventine webBrowser1.Document.Window.ScrollTo(400, 400); yazınca oldu

    private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
    webBrowser1.Document.Window.ScrollTo(400, 400);
    }

  21. muhsin dedi ki:

    hocam bi konuda daha acil yardımınıza ihtiyacım var bi arkadaş visual basicde bi kod yazmış bunu c# duyarladım çalışmıyor aynı kodu visual basicde yazıyım dedim ordada böyle bir tanım yok diyor bu kodu c# da çalışacak şekilde nasıl yaparım lütfen bunu haftalardır araştırıyorum unsafe kullandım proje özelliklerden falan gerekli yeri seçtim pointer kullanmak için bu kodu olduğu gibi kullanınca şu hataları veriyor sizden ricam bunu nasıl c# ta kullanabilirim bana yardımcı olursanız çok memnun kalırım iyi çalışmalar

    Hata CS0266 ‘int’ türü örtülü olarak ‘byte’ türüne dönüştürülemez. Açık bir dönüştürme var (eksik atamanız mı var?)

    Hata CS1547 ‘void’ anahtar sözcüğü bu bağlamda kullanılmaz

    void* ptr = stackalloc void[5];
    while (true)
    {
    ((byte*)ptr)[4] = ((this.WebBrowser1.ReadyState != WebBrowserReadyState.Complete) ? 1 : 0);
    if (*(sbyte*)((byte*)ptr + 4) == 0)
    {
    break;
    }
    Application.DoEvents();
    }

  22. muhsin dedi ki:

    onlara baktım şu hatayı alıyorum
    Hata CS1547 ‘void’ anahtar sözcüğü bu bağlamda kullanılmaz

    • Gençay dedi ki:

      Kardeş nerede ne çevirdin de bu böyle oldu daha güzel ve net izah edebilirsen bende olayı rahat takip edebilirim. Karman çorman tek tek yorum bırakacağına tek seferde rapor şeklinde izah et.

  23. muhsin dedi ki:

    CONVERSION ERROR: Code could not be converted. Details:

    — line 1 col 1: EOF expected

    Please check for any errors in the original code and try again.

    dediğiniz yerde de çevirme işlemi yapınca yukardaki hatayı veriyor

  24. muhsin dedi ki:

    selamun aleyküm bayağı bir araştırmadan sonra sorunumu hallettim çözümü buldum CAPTCHA (Şahıs Denetim) Kodunu webBrowser1’den olduğu gibi değişmeden çekmek için aşağıdaki kodu webBrowser1_DocumentCompleted’e Event’ine yazmamız yeterli hayırlı günler saygılar birisine mutlaka lazım olacaktır mutlaka

    private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
    object objectValue = RuntimeHelpers.GetObjectValue(NewLateBinding.LateGet(NewLateBinding.LateGet(this.webBrowser1.Document.DomDocument, null, “bOdy”, new object[0], null, null, null), null, “createControlRange”, new object[0], null, null, null));
    NewLateBinding.LateCall(objectValue, null, “Add”, new object[]
    {
    RuntimeHelpers.GetObjectValue(this.webBrowser1.Document.Images[2].DomElement)
    }, null, null, null, true);
    NewLateBinding.LateCall(objectValue, null, “execCommand”, new object[]
    {
    “Copy”
    }, null, null, null, true);
    this.pictureBox4.Image = Clipboard.GetImage();
    }

  25. ali dedi ki:

    Sitenizi ilgi ile takip ediyorum. Bilgiler icin tesekür ederim.

  26. Hakan dedi ki:

    Peki birden fazla etiketleri olsaydı ve ben hepsini tek tek çekmeye çalışsam nasıl bir yol izlemem gerekiyor. Yani:
    Merhaba dünyalılar
    Kod yazmak güzeldir
    Yeni bir güne merhaba…
    böyle bir şey olsaydı bunları nasıl çekebilirim

    • Gençay dedi ki:

      Artık o noktada algoritmanızı konuşturmanız gerekmektedir. Bizler en fazla başlangıç boyutunda bir anlatım sergileyebiliriz.

      Sevgiler…

  27. Enes dedi ki:

    Merhaba bu yolla internet sitesi üzerinde ki son yazıları mvc de direk dropdown içerisine ekleyteblirmiyiz. Fakat yazının başlığı na göre içeriğide arkada tutucaz seçince gelicek

  28. hüseyin dedi ki:

    dinamik siteden nasıl veri çekcez
    sorgu nasıl yapılınıyor

Bir Cevap Yazın

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

*

Copy Protected by Chetan's WP-Copyprotect.