4 Mart 2014 Salı

PHP ile bot yapımı ve başka siteden veri çekme

17 comments
Bu yazımda PHP ile istediğimiz sitenin istediğimiz kısmını çekerek sayfamızda nasıl kullanabileceğimizi anlatacağım.

Öncelikle bu işlem için kullanmamız gerek fonksiyonları açıklayıp ardından da konunun pekişmesi için güzel bir örnek olduğunu düşündüğüm IMDB sitesinden film adını ve film puanını çeken bir uygulamayı yazacağım.

PHP ile bir sayfadan veri çekmek için file_get_contents hazır fonksiyonunu kullanıyoruz. Aşağıdaki kodu çalıştırırsak sayfayı olduğu gibi çekebiliriz.

<?php
$url = "http://www.imdb.com/title/tt1675434";
$cekilen_veri = file_get_contents($url);
echo $cekilen_veri;
?>

Ancak biz sayfadaki belli bir alanı almak istiyoruz. Bu durumda ne yapmalıyız?

Böyle bir istediğimiz olduğunda öncelikle bir fonksiyon yazmamız gerekiyor.

function getir($baslangic, $son, $cekilmek_istenen)
{
    @preg_match_all('/' . preg_quote($baslangic, '/') .
    '(.*?)'. preg_quote($son, '/').'/i', $cekilmek_istenen, $m);
    return @$m[1];
}

 Ardından veri çekmek istediğim URL adresini belirliyorum. Ben http://www.imdb.com/title/tt1675434/ adresindeki Can Dostum (Intouchables) filminin bilgilerini çekmek istiyorum.

$url = "http://www.imdb.com/title/tt1675434";

Daha sonra öncelikle sayfanın tamamını çekmem gerektiği için yukarıda da anlattığım file_get_contents metodunu kullanıyorum.

$icerik = file_get_contents($url);

Şimdi en önemli kısma geldik. Film adını ve film puanını çekmek istiyoruz. Peki bunların nerede olduğunu nasıl bulacağız. Belirttiğim URL'ye giderek sağ tıklıyorum ve sayfa kaynağını görüntüle diyorum.


Sayfa kaynağı karşıma geliyor ve burada film adını bulmak için CTRL + F yaparak Can Dostum yazıyorum.


Nihayet istediğim alanı buluyorum. CTRL + F yapıp Can Dostum diye arattığımda yukarıdaki satırlarda da sonuçlar buluyor ancak onlar Can Dostum (2011) şeklinde olduğu için ben sadece film adının yazılı olduğu bu kısmı seçtim.

Görüldüğü gibi Can Dostum yazan yer yani filmin adının olduğu yer <span class="itemprop" itemprop="name"> ve </span> kodlarının arasında. Bu durumda başlangıcım <span class="itemprop" itemprop="name"> ve sonum da </span> olacak.

$film_adi = getir('<span class="itemprop" itemprop="name">','</span>',$icerik);

Şimdi aynı işlemi IMDB film puanı için yapacağım. Sayfa kaynağında 8,6 aratıyorum.


Yukarıdaki gibi 8,6 yazan yerleri buluyorum. 701.satır tam olarak istediğim şey ve hemen onun için de aşağıdaki kodu yazıyorum.

$imdb_puani = getir('class="titlePageSprite star-box-giga-star">','</div>',$icerik);

İstediğimiz bilgileri çektik şimdi sadece bunları göstermek kaldı. Burada dikkat etmemiz gereken nokta array olarak çektiğimiz için değişkeni buna uygun yazmak.

$film_adi değil de $film_adi[0] şeklinde göstermemiz gerekiyor.

echo "<b>Film Adı :</b> " . $film_adi[0] . "<br />";
echo "<b>IMDB Puanı :</b> " . $imdb_puani[0];

Artık herşey tamam. Sayfamı çalıştırdığımda istediğim verilerin çekildiğini görüyorum.

NOT : Sayfaya girdiğimde film adında Can Dostum yazıyor ancak program Intouchables olarak çekiyor diyebilirsiniz. Bunun nedeni IMDB sitesinin tarayıcıdan girildiğinde filmlerin Türkçe adını göstermesi. Ancak program ile çektiğimizde İngilizce olarak geliyor. Zaten yazının başında yapmış olduğum sayfanın tamamını çekme örneğini incelerseniz orada da İngilizce olarak çektiğini görürsünüz.

Şimdi $url değişkenini değiştirerek başka bir film adresi giriyorum.

Görüldüğü gibi onu da sorunsuz şekilde çekiyorum ve sayfamda gösteriyorum.

Çok yakında bu konuyla ilgili video çekip onu da ekleyeceğim.

bot.php dosyasını indirmek için tıklayın.

İyi çalışmalar...
If You Enjoyed This, Take 5 Seconds To Share It

17 yorum:

Adsız dedi ki...

bravo

Adsız dedi ki...

teşekkürler..

Unknown dedi ki...

Peki ürün resmini nasıl çekeriz. Ben aynı yöntemle denedim ama olmadı

paradise dedi ki...

USA

yukarıdaki gibi 2 satıra taşan kodları nasıl alabiliriz peki?

Adsız dedi ki...

gerçekten çok yararlı olmuş ama bir sorum olacak bir çok sitede sordum ama cvp alamadım tjk sitesinden tablo bilgilerini çekmek için bu bot nasıl düzenlenebilir acaba

winner dedi ki...

admin özele gelirsen bir şey teklif edeceğim

Adsız dedi ki...

emeğinize sağlık, çok yararlı bir yazı olmuş, oldukça açıklayıcı ve öğretici bir yazı paylaşmışsınız, teşekkürler.

fatihto dedi ki...

bunu döngüye nasıl sokarız.. aynı sayfada birden fazla film bilgisi olsaydı, 7 tane film mesela, bu 7 sini alt alta nasıl çekebilirdik ?

Serdar dedi ki...

teşekkür ederim gayet başarılı anlatım.

Unknown dedi ki...

İyi Güzel ama ben karnaval.com dan Metro Fm de hangi şarkı var ve kim söylemiş bunu çekmek istiyorum fakat bunu yapsamda her sayfayı yenilediğimde başka bir şarkıcı ve şarkı ismi çıkıyor. karnaval.com dan kaynaklı bi sorun rica etsem bir yardım eder misiniz ?

Unknown dedi ki...

Başarılı :)

brathme dedi ki...

Millet kaç tan soru sormuş.admin uyuyo heralde

Dizi dedi ki...

bencede uyuyor bır sayfada bırden fazla kez verı cekmek ıcın nasıl döngüye sokarız?

Adsız dedi ki...

faydalı

Furkan Özden dedi ki...

[0] değerini 1 veya 2.3. şeklinde yaparsanız sayfada karşılaştığı ilk değeri değil de girdiğiniz sayı kadar sonraki değeri alır. Çok işime yaradı eklemek istedim. Teşekkürler çalışmanız için.

ucakbileti dedi ki...

Çok işime yaradı. Teşekkürler. https://ucuzucakbiletiara.com

Adsız dedi ki...

Teşekkürler https://flyscanner.com.tr