17 Ekim 2012

Php'de basit Bot


   Merhaba;
Bugün basit bir bot yapacağız. Bot derken bir siteden veri çekmek ve onu kullanmaktan bahsediyorum. Bugün anlatmaya çalışacağım çok çok basit bir bot. Ne yapıyor peki? Günlük hava durumunu öğreniyor ve sitemizde bunu gösteriyor. Çok basit olsada bilmemiz gereken temel şeyler php düzenli ifade fonksiyonları ve düzenli ifadeler tabii ki. Önceki yazılarımda bunları anlatmaya çalıştım. Sözü çok uzatmadan başlayalım;
file_get_contents(string $link); fonksiyonu ile $link adresinden tüm sitenin kaynak kodunu string olarak çekiyoruz. ($sehir yerine hangi şehri yazarsanız oranın hava durumunu görebilirsiniz.)
//...
       $sehir="ANKARA"; 
$link="http://www.mgm.gov.tr/tahmin/il-ve-ilceler.aspx?m=".$sehir;
$data=file_get_contents($link);
     //...

Şu an elimizde kocaman bir string verisi ($data) var. Peki bunun hangi kısımlarını alacağız ? Bunu görmenin yolu sitenin hangi bölümünü almak istiyorsak üzerine gelip sağ tuş yapıp, öğeyi denetle ye basmak. Bunu Chrome için anlatıyorum. Tabii ki diğer tarayıcılarda da benzer seçenekler var. Chrome'da bunu yaptığımızda ; 
şeklinde bir görüntü çıkıyor. Gördüğünüz gibi, seçmek istedimiz yerin kaynak kodu ve site üzerindeki konumu arkasına mavi renk konulmuş. Yalnız kesinlikle buna bağlı kalmayın. CTRL-U yaparak kaynak kodda da “div” lerin isimleri aynı mı , boşluk sayıları aynı mı diye kontrol edin ki kodunuz hata vermesin. Bizim alacak olduğumuz bilgiler “divSonDurum” div'i içerisinde olduğu için önce bu div elemanını bir çekelim. Burada da dikkat etmemiz gereken regex kullanmadğımız yerlerde stringimizin sitenin kaynak kodu ile tıpatıp aynı olması gerektiği.

 //... 
   preg_match_all('@
(.*?)
@si',$data,$temp); //...

Bu fonksiyon ile $data ile gelmiş olan verimiz içerisinden <div id="divSonDurum"> ile </div> içerisindeki herşeyi kesip $temp içerisine koyuyoruz. Sonrasında sıcaklık değerini bulmaya çalışıyoruz. Sıcaklığın rengi farklı olduğu için işimiz biraz daha kolay. Bu gibi yerler için genellikle özel bir class veya id kullanılır. Bu sitedede bunu belirtmek için "renkMax" class'ı kullanılmış. Yine preg_match_all ile <td><em class="renkMax"> ile </em></td> arasındaki bölümü alıyoruz ki buda sıcaklık değeridir. 
// ...

preg_match_all('@(.*?)

@si',$temp[1][0],$temp2); //Sicakligi almak

//...

Bu veriyide alıp $temp2 içerisine koyuyoruz. Peki neden $temp değilde $temp[1][0] 'ı kullandık ? var_dump($temp) yapıp $temp'in içeriğine baktığımızda uygun olan değerin [1][0] olduğunu gördüğümüz için. Bot yaparken her işlemin sonunda var_dump() yaparak hangi veriyi çektiğinizi görmenizi tavsiye ediyorum.

Sıcaklık değerini bildiğimize göre bir sonraki veriyi (hava durumu resmi) almaya başlayabiliriz. Bunu için de ;

...
preg_match_all('@<td rowspan="2"><img src="\.\.\/(.*?)" alt="(.*?)" title="(.*?)" /> </td>
@si',$temp[1][0],$temp3);
...

fonksiyonunu kullanıyoruz.

Botumuzun ekran görüntüsü ise;


Kaynak Kodlar:




<?php  

/* Hava Durumu botu*/

$sehir="ISTANBUL"; 
$link="http://www.mgm.gov.tr/tahmin/il-ve-ilceler.aspx?m=".$sehir;

$data=file_get_contents($link);

//var_dump($data); 

preg_match_all('@
(.*?)
@si',$data,$temp); //var_dump($temp); preg_match_all('@(.*?)@si',$temp[1][0],$temp2); //Sicakligi almak //var_dump($temp2); $sicaklik=$temp2[1][0]; preg_match_all('@(.*?) @si',$temp[1][0],$temp3); //var_dump($temp3); //http://www.mgm.gov.tr/FILES/imgIcon/99/e_72x72t_png/-23.png $resim='http://www.mgm.gov.tr/'.$temp3[1][0]; $durum=$temp3[2][0]; //Sonuclari gosterme echo '
'; echo 'Sehir:'.$sehir."

"; echo 'Sıcaklık: '.$sicaklik."

"; echo 'Durum: '.$durum."

"; echo 'Resim: '.''; echo '
'; ?>

1 yorum:

  1. aga font cok kotu hıc bırsey anlasılmıor adam gıbı duz bı font kullanırmısın blogunda emegıne saglık!

    YanıtlaSil