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.
<?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 '';
?>


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