﻿
{"id":1857,"date":"2013-07-19T00:25:04","date_gmt":"2013-07-19T00:25:04","guid":{"rendered":"http:\/\/www.gencayyildiz.com\/blog\/?p=1857"},"modified":"2013-08-26T22:15:28","modified_gmt":"2013-08-26T22:15:28","slug":"c-ile-bot-yapimi-web-sitelerinden-icerik-cekme","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/c-ile-bot-yapimi-web-sitelerinden-icerik-cekme\/","title":{"rendered":"C# \u0130le Bot Yap\u0131m\u0131 &#8211; Web Sitelerinden \u0130\u00e7erik \u00c7ekme"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Her ne kadar etik olmasada programc\u0131lar\u0131n hatta genellikle web site programc\u0131lar\u0131n\u0131n en b\u00fcy\u00fck hizmetkar\u0131 olacak olan i\u00e7erik \u00e7ekme botlar\u0131n\u0131n yap\u0131m\u0131ndan bahsedece\u011fiz.Ge\u00e7enlerde bir i\u015fimden dolay\u0131 yazmak zorunda oldu\u011fum bir bot i\u00e7in internette s\u00fcrekli detayl\u0131 bir ara\u015ft\u0131rmada bulundum.Yabanc\u0131 sitelerde dahil olmak \u00fczere genellikle <em>&lt;title&gt;<\/em>\u00a0etiketi i\u00e7indeki veriyi \u00e7eken programlarla \u00f6rneklendirme yap\u0131lm\u0131\u015f.Hatta \u00e7o\u011fu sitede ayn\u0131 kodlar al\u0131nt\u0131 edilmi\u015f.Haliyle bende bu kodlar \u00fczerinden yola \u00e7\u0131k\u0131p belirli de\u011fi\u015fiklikler neticesinde ihtiyac\u0131m olan botu geli\u015ftirebildim.Tabi bu yaz\u0131m\u0131zda \u00f6rneklendirme olarak <em>&lt;title&gt;<\/em> etiketinden ba\u015fka bir alan\u0131n i\u00e7eri\u011fini \u00e7ekmeyi g\u00f6rece\u011fiz.Bilmenizi isterim ki, algoritmik mant\u0131\u011f\u0131n\u0131z\u0131 kurup kendi ihtiyac\u0131n\u0131z olan botlar\u0131 \u00e7ok rahat bir \u015fekilde olu\u015fturabilirsiniz.Sadece biraz zahmet ve emek isteyen bir i\u015ftir.\u015eimdi gelin yaz\u0131m\u0131z\u0131n i\u00e7eri\u011fini irdeleyelim.<br \/>\n<!--more--><br \/>\n\u0130ster Asp.NET ya da Asp.NET MVC mimarisi olsun, istersede C# masa\u00fcst\u00fc mimarisi farketmez.Sonu\u00e7ta kodlar\u0131m\u0131z standart C# kodlar\u0131 olaca\u011f\u0131 i\u00e7in her .NET platformuna uygun \u00e7al\u0131\u015fabilmektedir.Bu y\u00fczden ben \u00f6rnek olarak C# Console Application projesinde \u00f6rneklendirme yapaca\u011f\u0131m.<\/p>\n<p>\u00d6ncelikle i\u00e7eri\u011fin \u00e7ekilece\u011fi web siteyi belirlememiz gerekmektedir.Ben kendi sitem olan <a href=\"http:\/\/www.gencayyildiz.com\" target=\"_blank\">http:\/\/www.gencayyildiz.com<\/a> adresinden a\u015fa\u011f\u0131daki g\u00f6r\u00fcnt\u00fcde olan alan\u0131n bilgisini \u00e7ekecek \u00f6rnek bir program olu\u015fturaca\u011f\u0131m.<br \/>\n<a href=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2013\/07\/www.gencayyildiz.com_.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-1859\" alt=\"www.gencayyildiz.com\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2013\/07\/www.gencayyildiz.com_-300x195.png\" width=\"300\" height=\"195\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2013\/07\/www.gencayyildiz.com_-300x195.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2013\/07\/www.gencayyildiz.com_.png 463w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><br \/>\nG\u00f6r\u00fcnt\u00fcde de g\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi &#8220;Kod yazmak bir sanatt\u0131r&#8230;&#8221; yaz\u0131s\u0131n\u0131 C# ile \u00e7ekece\u011fiz.Programatik olarak mevzuya girmeden \u00f6nce i\u00e7eri\u011fini \u00e7ekece\u011fimiz sitenin kaynak kodlar\u0131n\u0131 incelememiz gerekmektedir.<br \/>\nKaynak kodlar i\u00e7in web sitesinde sa\u011f t\u0131klayarak &#8220;Sayfa kayna\u011f\u0131n\u0131 g\u00f6r\u00fcnt\u00fcle&#8221; se\u00e7ene\u011fine t\u0131klamam\u0131z gerekmektedir.Kar\u015f\u0131m\u0131za bu sitenin HTML\/CSS\/JavaScript vs. gibisinden kaynak kodlar\u0131 gelecektir.Bu kaynak kodlar\u0131n aras\u0131ndan ilgili alan\u0131 bulmam\u0131z gerekmektedir.<br \/>\n<a href=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2013\/07\/kaynakkodlari.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-1861\" alt=\"kaynakkodlari\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2013\/07\/kaynakkodlari-300x100.png\" width=\"300\" height=\"100\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2013\/07\/kaynakkodlari-300x100.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2013\/07\/kaynakkodlari.png 492w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><br \/>\nYukar\u0131daki resimde g\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi \u00e7ekece\u011fimiz i\u00e7eri\u011fi kaynak kodlar\u0131nda bulmu\u015f olduk.<\/p>\n<p>\u015eimdi buraya kadar tamam.\u015eimdi programatik olarak algoritmam\u0131z\u0131 kurup, bu kaynak kodlar\u0131ndaki HTML\/CSS kodlar aras\u0131ndan bu i\u00e7eri\u011fe nas\u0131l ula\u015faca\u011f\u0131m\u0131z\u0131 yapal\u0131m.<\/p>\n<p>\u00d6ncelikle <span style=\"color: #ff0000;\"><em>System.Net<\/em><\/span> k\u00fct\u00fcphanesinde bulunan HttpWebRequest s\u0131n\u0131f\u0131m\u0131z sayesinde\u00a0<a href=\"http:\/\/www.gencayyildiz.com\" target=\"_blank\">http:\/\/www.gencayyildiz.com<\/a> adresine ba\u011flant\u0131 talebi yapal\u0131m.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n            WebRequest SiteyeBaglantiTalebi = HttpWebRequest.Create(&quot;http:\/\/www.gencayyildiz.com&quot;);\r\n<\/pre>\n<p>G\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi ba\u011flant\u0131 talebini WebRequest tipinden bir referansa atam\u0131\u015f olduk.\u015eimdi bu talep neticesinde gelen cevab\u0131 WebResponse referans\u0131na alal\u0131m.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n            WebResponse GelenCevap = SiteyeBaglantiTalebi.GetResponse();\r\n<\/pre>\n<p>\u015eimdi gelen cevab\u0131 okuyal\u0131m.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n            StreamReader CevapOku = new StreamReader(GelenCevap.GetResponseStream());\r\n<\/pre>\n<p>Okudu\u011fumuz cevab\u0131 <span style=\"color: #ff0000;\"><em>System.IO<\/em><\/span> k\u00fct\u00fcphanesinde bulunan StreamReader tipinden referansa atad\u0131k.<\/p>\n<p>\u015eimdi StreamReader tipinden olan CevapOku isimli referans\u0131m\u0131z\u0131n temsil etti\u011fi nesnemizde i\u00e7erik \u00e7ekece\u011fimiz sitenin b\u00fct\u00fcn kaynak kodlar\u0131 bulunmaktad\u0131r.Bu kaynak kodlar\u0131 bir string tipten de\u011fi\u015fkene atamak daha kullan\u0131\u015fl\u0131 olacakt\u0131r.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n            string KaynakKodlar = CevapOku.ReadToEnd();\r\n<\/pre>\n<p>Evet art\u0131k KaynakKodlar isimli string de\u011fi\u015fkenimizde i\u00e7erik \u00e7ekece\u011fimiz sitenin kaynak kodlar\u0131 mevcuttur.Bundan sonra string metodlar\u0131n\u0131 kullanarak rahat rahat i\u00e7eri\u011fimizi \u00e7ekebiliriz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n            int IcerikBaslangicIndex = KaynakKodlar.IndexOf(&quot;&lt;h6&gt;&quot;) + 4;\r\n<\/pre>\n<p>Burada yapt\u0131\u011f\u0131m\u0131z i\u015f KaynakKodlar de\u011fi\u015fkeninde bulunan\u00a0&lt;h6&gt;\u00a0etiketinin index numaras\u0131na ula\u015f\u0131p bu index numaras\u0131na +4 ekliyoruz.Bu +4 \u00fcn sebebi ise\u00a0&lt;h6&gt; etiketi i\u00e7indeki yaz\u0131y\u0131 alaca\u011f\u0131m\u0131zdan dolay\u0131\u00a0&lt;h6&gt; etiketinin karakter say\u0131s\u0131n\u0131da ekliyoruz ki sadece i\u00e7indeki yazan yaz\u0131y\u0131 \u00e7ekebilelim.Yani index numaras\u0131 tam\u00a0&lt;h6&gt; etiketinin biti\u015fine, i\u00e7inden de alaca\u011f\u0131m\u0131z i\u00e7eri\u011fin ba\u015flang\u0131c\u0131na denk gelmektedir.<br \/>\n\u015eimdi s\u0131ra ba\u015flang\u0131\u00e7 indexi ile biti\u015f indexi aras\u0131ndaki i\u00e7eri\u011fi ald\u0131rmak i\u00e7in biti\u015f indexsini bulmakta.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n            int IcerikBitisIndex = KaynakKodlar.Substring(IcerikBaslangicIndex).IndexOf(&quot;&lt;\/h6&gt;&quot;);\r\n<\/pre>\n<p>Bizim \u00e7ekmek istedi\u011fimiz de\u011fer &lt;h6&gt; ile &lt;\/h6&gt; aras\u0131nda bulundu\u011fundan dolay\u0131 bir \u00f6nceki IcerikBaslangicIndex isimli de\u011fi\u015fken de\u011ferinden , &lt;\/h6&gt; etiketinin biti\u015f indexine kadar olan fark\u0131 al\u0131yoruz.<\/p>\n<p>Art\u0131k s\u0131ra bu indexler aras\u0131ndaki de\u011feri \u00e7ekip ihtiyac\u0131m\u0131za g\u00f6re kullanmaya geliyor.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n            Console.WriteLine(KaynakKodlar.Substring(IcerikBaslangicIndex, IcerikBitisIndex));\r\n<\/pre>\n<p>Art\u0131k program\u0131m\u0131z\u0131 derleyip \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131m\u0131zda istedi\u011fimiz veriyi kaynak siteden \u00e7ekip elde etmi\u015f oluyoruz.<br \/>\n<a href=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2013\/07\/kod-yazmak-bir-sanatt\u0131r.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2013\/07\/kod-yazmak-bir-sanatt\u0131r.png\" alt=\"kod yazmak bir sanatt\u0131r\" width=\"219\" height=\"23\" class=\"aligncenter size-full wp-image-1863\" \/><\/a><\/p>\n<p>G\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi bot yap\u0131m\u0131 bu kadar basit bir i\u015flem.Tabi HTML\/CSS kodlar\u0131 kompleks olan sitelerden i\u00e7erik \u00e7ekmek daha zor ve algoritmik emek isteyen bir i\u015ftir.Ama temel olarak bu yap\u0131y\u0131 benimserseniz ihtiyac\u0131n\u0131z\u0131 kar\u015f\u0131layacak her t\u00fcrl\u00fc botu olu\u015fturabilirsiniz.<\/p>\n<p>Bunu geli\u015ftirmek sizin elinizde..<\/p>\n<p>Son kez kodlar\u0131n tam derlenmi\u015f halini payla\u015f\u0131p yaz\u0131m\u0131z\u0131 sonland\u0131r\u0131yorum.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n            WebRequest SiteyeBaglantiTalebi = HttpWebRequest.Create(&quot;http:\/\/www.gencayyildiz.com&quot;);\r\n            WebResponse GelenCevap = SiteyeBaglantiTalebi.GetResponse();\r\n            StreamReader CevapOku = new StreamReader(GelenCevap.GetResponseStream());\r\n            string KaynakKodlar = CevapOku.ReadToEnd();\r\n            int IcerikBaslangicIndex = KaynakKodlar.IndexOf(&quot;&lt;h6&gt;&quot;) + 4;\r\n            int IcerikBitisIndex = KaynakKodlar.Substring(IcerikBaslangicIndex).IndexOf(&quot;&lt;\/h6&gt;&quot;);\r\n\r\n            Console.WriteLine(KaynakKodlar.Substring(IcerikBaslangicIndex, IcerikBitisIndex));\r\n            Console.Read();\r\n<\/pre>\n<p>Faydalanman\u0131z ve bir sonraki yaz\u0131mda g\u00f6r\u00fc\u015fmek dile\u011fiyle&#8230;<br \/>\n\u0130yi \u00e7al\u0131\u015fmalar..<\/p>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content -->","protected":false},"excerpt":{"rendered":"<p>Her ne kadar etik olmasada programc\u0131lar\u0131n hatta genellikle web site programc\u0131lar\u0131n\u0131n en b\u00fcy\u00fck hizmetkar\u0131 olacak olan i\u00e7erik \u00e7ekme botlar\u0131n\u0131n yap\u0131m\u0131ndan bahsedece\u011fiz.Ge\u00e7enlerde bir i\u015fimden dolay\u0131 yazmak zorunda oldu\u011fum bir bot i\u00e7in internette s\u00fcrekli detayl\u0131 bir&#46;&#46;&#46;<!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12],"tags":[464,27],"class_list":["post-1857","post","type-post","status-publish","format-standard","hentry","category-c-sharp-c","tag-bot","tag-c"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/1857","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/comments?post=1857"}],"version-history":[{"count":0,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/1857\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=1857"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=1857"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=1857"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}