file_get_contents() Fonksiyonu İle Bot Hazırlama

Merhaba arkadaşlar , phphocasi.com.tr için hazırladığımız Php Eğitimlerinde bu ders php de en popüler konu olan php ile (file_get_contents metodu ile) bot hazırlama kısmına gireceğiz. Öncelikle nedir bu bot biraz bahsedelim.

Bot bizim yerimize bir işi yapan yazılımdır. Örneğin mobilhanem’in yazılarını bir txt dosyasına başlık, resim url ve içerik olarak kaydedeceğimizi varsayalım. Eğer botumuz yok ise bu işi elimiz ile tek tek yapmamız gerekiyor ama bot hazırlarsak botumuzu çalıştırdığımızda eğer düzgün çalışan bir botumuz varsa bize tüm yazıları bir txt dosyası halinde verir. Bot yazmayı iyi kavrarsanız çok rahat bir şekilde harçlığınızı çıkarabilirsiniz ? Bot yapmayı daha iyi anlayabilmeniz için bir önceki dersimiz olan Php Dersleri – Regular Expression dersimizi incelemenizi öneririm.

Php file_get_contents() Fonkisyonu

file_get_contents() fonksiyonu parametre olarak bir web url alır ve bu adresteki veriyi geri döndürür. file_get_contents() fonksiyonunun opsiyonel olan parametreleri de var. Detaylı bilgi için Php.net – file_get_contents adresine bakabilirsiniz.

$veri = file_get_contents(“http://phphocasi.com.tr”) mobilhanem linkinden gelen html veriyi $veri değişkenine atar.

 

Bir Örnek Yapacak Olursak:

<?php    echo file_get_contents("http://phphocasi.com.tr")  ?>

Kodu çalıştırdığımızda ekranda mobilhanem’in tasarımını göreceksiniz.

Şimdi yavaş yavaş bot yazma kısmına giriş yapalım. mobilhanemdeki yazıları kendi sitemizde göstermek istediğimizi varsayalım. (İzinsiz böyle birşey yapmak kesinlikle etik değil). Yazılara ait başlık, resim ve içeriği alalım.

1-Php İle Bot Yazmaya Giriş

Öncelikle web sitesine bağlanalım.

<?php    $url = "https://www.phphocasi.com.tr/test/php-dersleri/" // web Site URL  $veri =  file_get_contents($url) // verimiz geldi  ?>

İlerlleyen zamanlarda site teması değişir ise dersimiz güncelliğini kaybetmesin diye url değerini biz sabit bir html yaptık. Botların kötü taraflarından biri botunu yazdığımız sitenin tasarımı değişince botun çalışmamasıdır.

2- Regex İle Yazılara Ulaşma

Artık karşıdaki sitenin html kısmı elimizde var şimdi ordan sadece işimize yarayacak kısmı yani  contentteki yazıları regex ile alalım. Bot hazırlamak için öncelikle karşıdaki sitenin html kısmını incelememiz gerekir. Biz mobilhaneme baktığımızda yazılar için aşağıdaki şekilde bir html mevcut.

<article class="post clearfix blog_2 post-7467 type-post status-publish format-standard has-post-thumbnail hentry category-java-dersleri tag-import tag-import-kavrami tag-java tag-java-import tag-java-import-kavrami tag-java-package tag-java-paket-yapisi tag-nesne-yonelimli-programlama tag-package tag-paket tag-static-metot tag-temel-java-dersleri" role="article" itemscope="" itemtype="http://schema.org/Article">                                                          <div class="post-inner">                                                              <h2 itemprop="name" class="post-title">  <span class="post-type"><i class="icon-picture"></i></span>  <a itemprop="url" href="java-paket.html" title="Temel Java Dersleri – Paket Yapısı ve Import Kavramı" rel="bookmark">Temel Java Dersleri – Paket Yapısı ve Import Kavramı</a></h2>                                                              <div class="post-img post-img-12">                                                                  <a href="java-paket.html" title="Temel Java Dersleri – Paket Yapısı ve Import Kavramı" rel="bookmark"><img alt="Temel Java Dersleri – Paket Yapısı ve Import Kavramı" width="250" height="160" src="./index_files/temeljavaderslerimh-250x160.png"> </a>                                                              </div>                                                              <div class="post-meta">                                                                  <span class="meta-author" itemprop="author" rel="author"><i class="icon-user"></i>  <a href="https://www.phphocasi.com.tr/author/eren/" title="Eren Başaran">Eren Başaran</a>  </span>                                                                  <span class="meta-date" datetime="2017-08-02T13:48:59+00:00" itemprop="datePublished"><i class="fa fa-calendar"></i>Ağustos 2 , 2017</span>                                                                  <span class="meta-categories"><i class="icon-suitcase"></i><a href="https://www.phphocasi.com.tr/java-dersleri/" rel="category tag">Java Dersleri</a></span>                                                                  <span class="meta-comment"><i class="fa fa-comments-o"></i><a href="java-paket.html#disqus_thread" data-disqus-identifier="7467 https://www.phphocasi.com.tr/?p=7467">0 Comments</a></span>                                                                  <span class="post-view"><i class="icon-eye-open"></i>290 görüntüleme</span></div>                                                              <div class="post-content">                                                                  <p>Merhaba arkadaşlar, phphocasi.com.tr üzerinden anlattığımız/yayınladığımız derslerimize Temel Java Dersleri konu başlığı altında Paket Yapısı ve Import Kavramı&nbspile devam ediyoruz. Nesne ve Sınıf yapısı&nbspnı öğrendikten sonra sonraki aşamalara geçmek için paket yapısından mutlaka haberdar olmak gerekmektedir. Özellikle bir sonraki dersimizde anlatacağım&nbsperişim belirleyicileri&nbspdaha ...</p>                                                                  <a href="java-paket.html" title="Temel Java Dersleri – Paket Yapısı ve Import Kavramı" rel="bookmark" class="post-read-more button color small">Devamını oku</a></div>                                                          </div>                                                      </article>

Burada yazının kapsayıcı elemanı article olduğu için patterni ona göre yazıyoruz.

$pattern = "@<article (.*?)>(.*?)</article>@si"    preg_match_all($pattern,$veri,$yazilar)    print_r($yazilar[0])

Regex kısmında ise konuşma dili ile tercüme edersek şöyle bir ifade yazdık.

<article (burada herşey olabilir)> (burada herşey olabilir) </article>

şeklinde bir regex  patterni yazdık. Şimdi bu postların resim ve başlığı alalım.

3- Regex İle Yazı İçerisindeki Verilere Ulaşma

Resim ve başlığı almak için yazılarda yaptığımız gibi yine htmli incelememiz gerkir.

$posts = array()  for($i=0$i<count($yazilar[0])$i++) {  	// başlığı ve url alıyoruz.  	$baslikPattern = "@<a itemprop="url" href="(.*?)" (.*?)>(.*?)</a>@si"  	preg_match($baslikPattern,$yazilar[0][$i],$baslik)  	  	// resimi alıyoruz.   	$resimPattern = "@<img alt="(.*?)" width="250" height="160" src="(.*?)">@si"  	preg_match($resimPattern,$yazilar[0][$i],$resim)  	  	  	  	// posts diye bir diziye verileri atalım daha sonra kendimiz ayarlayalım.   	  	$posts[$i]["baslik"] = $baslik[3]  	$posts[$i]["post_url"] = $baslik[1]  	$posts[$i]["resim"] = $resim[2]  }  

Burada biz ne kadar regex kuralı koyarsak dizi boyutu o kadar artar bu diziyi print_r ile ekrana yazdırarak hangi veri işinize yarıyor, ne gibi veriler geliyor görebilirsiniz. Ben kısa olması açısından test edip gerekli kısımları ekledim. Şimdi botumuzda  mobilhanemden çektiğimiz yazıları listeleyelim.

4- Alınan Verileri Ekranda Gösterme

Aldığımız verileri for veya foreach döngüsü kullanarak aşağıdaki şekilde ekranda gösterebiliriz.

/// alınan verileri ekranda gösteriyoruz.   echo "<ul style="list-style:none">"  foreach( $posts as $post) {  	echo " <li> <img src="".$post["resim"]."" alt="" /> <a href="".$post["post_url"]."">".$post["baslik"]."</a></li>"  }  echo "</ul>"

Kodu çalıştırdığımızda resimlerin görünmediğini ve linklerin bozuk olduğunu fark edeceksiniz. Bu hatanın sebebi ise bağlandığımız sitenin relative url kullanıyor olması. Şimdi küçük dokunuşlarla hatamızı düzeltmeye çalışalım. Kodu yazmadan önce şöyle geçmiş derslerimizi kafamızda canlandıralım. Hangi fonksiyon bizim işimizi görür ? Evet evet doğru bildiniz tabiki str_replace fonksiyonu ile düzenleme yapabiliriz ?  Kodumuzun düzenlenmiş hali:

/// alınan verileri ekranda gösteriyoruz.   echo "<ul style="list-style:none">"  foreach( $posts as $post) {  	echo " <li> <img src="".str_replace("./",$url,$post["resim"])."" alt="" /> <a href="post_detay.php?url=".$post["post_url"]."">".$post["baslik"]."</a></li>"  }  echo "</ul>"

Url kısmında yaptığımız değişikliğe bakarsanız burada post_detay.php=url= şeklinde bir yapı kullandık. Bu yapıyı  Php Dersleri – GET ve POST Örnekleri    dersimizde görmüştük.

Şimdi post_detay.php sayfamızı hazırlayıp sayfamızda gelen linkteki veriyi gösterelim.

5- Linke Tıklanınca Post Detayını Gösterme

Post detayını gösterirkende yine htmli inceleyerek gerekli regex patternlerini yazmamız gerekir.

$urlGelen = isset($_GET["url"]) ? addslashes($_GET["url"]) : "" // eğer bir gelen url varsa alalım yoksa boş kalsın.    $url = "https://www.phphocasi.com.tr/test/php-dersleri/$urlGelen" // web Site URL  $veri =  file_get_contents($url) // verimiz geldi      // şimdi içerikten başlık ve yazıyı alalım.     // başlığı aldık  $baslikPattern = "@<h2 itemprop="name" class="post-title">(.*?)</h2>@si"  preg_match($baslikPattern,$veri,$baslik)      $yaziPattern = "@<div class="post-content" itemprop="mainContentOfPage">(.*?)<div class="clearfix">@si"  preg_match($yaziPattern,$veri,$yazi)    ?>  <div style="width:700pxmargin:0 auto">  	<h1><?=strip_tags($baslik[0])?></h1>  	<?php echo $yazi[0]?>  </div>

Evet arkadaşlar eğlenceli bir dersin sonuna geldik. Dersi bitirdiğinize göre artık freelancer sitelerde ücretli bot yazılır gibi  ilanlar verebilirsiniz :))

Demo İçin : Bot Uygulaması Demo bakabilirsiniz.

İndirmek İçin: Github – Mobilhanem adresinden indirebilirsiniz.

Bir sonraki dersimizde görüşmek üzere ?

Php ile bot hazırlama  konusu ile  ilgili yorumlarınızı konu altından yapabilirsiniz, ayrıca sorularınızı yine konu altından ve Mobilhanem Soru&Cevap bölümünden sorabilirsiniz.

 

 

41
Üzerine gel