Php Haber Botu Yapımı

Php ile belirli bir siteden istediğimiz veriyi, görseli, içeriği çekerek küçük bir bot yapacağız. Çoğu kişi hava durumu örneği ile anlatım yapmakta, bu dersimiz de ise haber botu yaparak sitede bulunan makaleyi link belirterek çekeceğiz. Öncelikle şunu belirteyim eğer böyle bir girişimde bulunacaksanız unutmamanız gereken
bir konu var “TELİF” haber siteleri genellikle ajanslara abonedir.
O yüzden çekeceğiniz haberler’in gerçek yayıncı izni olmadan herhangi bir yerde yayın yapamazsınız. Örnek amaçlı haber botu yapıyoruz. Dilerseniz hava durumu, lig durumu, video botu gibi hedefler belirleyerek de uygulayabilirsiniz.

1. Bot Standart Şablon Oluşturma

<?php
//* HABER BOTU *//
$formdangelen = 'http://habersitesimakalelinkli....com';
$site		= file_get_contents(''.$formdangelen.'');

// BAŞLIK
preg_match_all('@BurayaKaynakKodlar@si',$site,$baslik_al);

//$baslik		= $baslik_al[1][0];

echo "<pre>";
print_r($baslik_al);
echo "</pre>";
?>

Burada yaptığımız adımlar ilk önce <?php?> taglarını açarak başladık daha sonra $formdangelen adında bir değişken oluşturduk bunu yapmamız da ki neden’i ileri ki adımlar da daha iyi anlayacağız. Daha sonra $site adında bir değişken oluşturarak file_get_contents() fonksiyonu ile sitenin kaynağına erişeceğiz.

Çekeceğimiz veriyi belirliyoruz, ben ilk önce başlığı almak istedim. preg_match_all yada preg_match veri çekmek için kullanacağımız string değişkenlerdir. İkisi arasında ki fark ise “preg_match_all” eşleşen bütün verileri bulur. “preg_match” ise sadece ilk eşleşen veriyi bulur. İkisini de kullanabilirsiniz.

Satırımız şu şekilde oldu preg_match_all(‘@@si’,$site,$baslik_al); Burada @@si diyerek bir belirteç koyduk sonrasında $site değişkenini belirterek adresi, $baslik_al diyerek de bu satırı adlandırdık. Kaynak kodlarımız @BurayaGelecek@si.

Diğer bir satır da ise yeni bir değişken oluşturuyoruz. $baslik bir önceki adlandırdığımız değişkeni $baslik_al[][] diyerek köşeli parantezlerin içerisine array dizinlerini belirticez.

Yapılan değişiklikleri görmek içinse <pre></pre> taglarını kullanacağız.

2.Kaynaktan Başlık Çekme

<?php
//* HABER BOTU *//
$formdangelen = 'http://www.haberler.com/jennifer-lawrence-arkadasini-sirtinda-tasidi-7770795-haberi/';
$site		= file_get_contents(''.$formdangelen.'');
// BAŞLIK
preg_match_all('@<h1 itemprop="headline" id="haber_baslik" class=" ">(.*?)</h1>@si',$site,$baslik_al);

//$baslik		= $baslik_al[1][0];

echo "<pre>";
print_r($baslik_al);
echo "</pre>";

?>

Tarayıcımız da başlığa sağ tıklayarak ögeyi denetle veya sağ tıklayarak kaynağı görüntüle diyoruz. Bazen ögeyi denetle ile kaynak kodları farklı olabiliyor eğer hata alırsanız, o zaman kaynağı görüntüle diyerek inceleyebilirsiniz.

Haber Botu Kaynak İnceleme
Haber Botu Kaynak İnceleme

<h1 itemprop=”headline” id=”haber_baslik” class=” “>Jennifer Lawrence, Arkadaşını Sırtında Taşıdı</h1>” Burada “Jennifer Lawrence, Arkadaşını Sırtında Taşıdı” yazan yeri silerek içerisine (.*?) yazıyoruz yani burada ne yazıyor ? Diye sorguluyoruz. Daha sonra print_r komutu ile ekrana yazdırıyoruz.

haber-botu-array-dizini

Ekrana bastırdığımız da karşımıza böyle bir sonuç çıkıyor burada işimize yarayacak olan dizini seçiyoruz. Array 0 = 0 içerisinde sitenin içerisinde bulunan kaynağın tamamını yani class etiketli olanı görüyoruz. Ben genelde temiz class etiketi olmayanı seçiyorum ki daha sonra kendim istediğim gibi şekillendireyim. O zaman [1] => Array içerisinde bulunan [0] satırını seçiyorum.

$baslik = $baslik_al[1][0];

2. Özet’i Çekme

<?php
//* HABER BOTU *//
$formdangelen = 'http://www.haberler.com/jennifer-lawrence-arkadasini-sirtinda-tasidi-7770795-haberi/';
$site		= file_get_contents(''.$formdangelen.'');
// BAŞLIK
preg_match_all('@<h1 itemprop="headline" id="haber_baslik" class=" ">(.*?)</h1>@si',$site,$baslik_al);

// ÖZET
preg_match_all('@<h2 itemprop="description" class="ustblkgenislet2 spot ">(.*?)</h2>@si',$site,$ozet_al);

//$baslik  = $baslik_al[1][0];
//$ozet	   = $ozet_al[1][0];

echo "<pre>";
print_r($ozet_al);
echo "</pre>";

?>

Yukarıda bulunan adımları tekrar ederek kaynaktan özetin bulunduğu kodları seçiyoruz.

3. Resim ve Metni Çekmek

<?php
//* HABER BOTU *//
$formdangelen = 'http://www.haberler.com/jennifer-lawrence-arkadasini-sirtinda-tasidi-7770795-haberi/';
$site		= file_get_contents(''.$formdangelen.'');
// BAŞLIK
preg_match_all('@<h1 itemprop="headline" id="haber_baslik" class=" ">(.*?)</h1>@si',$site,$baslik_al);

// ÖZET
preg_match_all('@<h2 itemprop="description" class="ustblkgenislet2 spot ">(.*?)</h2>@si',$site,$ozet_al);

// RESİM
preg_match_all('@<meta itemprop="image" content="(.*?)" />@si',$site,$resim_al);

// İÇERİK
preg_match_all('@<div itemprop="articleBody" class="haber_metni mb20">(.*?)</div>@si',$site,$icerik_al);

//$baslik		= $baslik_al[1][0];
//$ozet			= $ozet_al[1][0];
//$resim		= $resim_al[1][0];
//$icerik		= $icerik_al[1][0];

echo "<pre>";
print_r($icerik_al);
echo "</pre>";

?>

Bu şekilde haber makalemizi çekmiş bulunuyoruz. Gelelim şimdi makaleyi url belirterek tablo içerisinde gösterelim.

3. index.php ve Form Oluşturma

Botumuz link’i girerek çalışsın istiyorum. O yüzden bir tane index.php adında dosya oluşturuyoruz.

index.php İçeriği

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
<title>Fatih TAŞKIN - Haber Botu</title>
</head>
<body>
<?php
echo ('<div align="center">
<table border="1" width="800" cellspacing="0" cellpadding="0" bordercolor="#000000">
<tr>
<td width="76">Link</td>
<td>
<form method="POST" action="bot.php">
<input type="text" name="url" size="142">
</td>
</tr>
<tr>
<td width="76">&nbsp;</td>
<td><input type="submit" value="Gönder"></form></td>
</tr>
</table>
</div>');
?>
</body>
</html>

index.php içeriğimiz bu şekilde yaptıklarımız ise bir tane 2 satır, 2 sütunlu tablo oluşturduk içerisine bir adet tipi text olan ve tipi submit olan input alanları oluşturduk. Form methodumuz POST, action olarak yani gideceği sayfa içinse bot.php yazdık. Buraya çekeceğimiz link’i yazıyoruz gönder dediğimizde bot.php sayfasına gidecek orada da birkaç değişiklik yapıyoruz.

bot.php İçeriği

<?php
//* HABER BOTU *//
$formdangelen = $_POST["url"];
$site		= file_get_contents(''.$formdangelen.'');
// BAŞLIK
preg_match_all('@<h1 itemprop="headline" id="haber_baslik" class=" ">(.*?)</h1>@si',$site,$baslik_al);

// ÖZET
preg_match_all('@<h2 itemprop="description" class="ustblkgenislet2 spot ">(.*?)</h2>@si',$site,$ozet_al);

// RESİM
preg_match_all('@<meta itemprop="image" content="(.*?)" />@si',$site,$resim_al);

// İÇERİK
preg_match_all('@<div itemprop="articleBody" class="haber_metni mb20">(.*?)</div>@si',$site,$icerik_al);

$baslik		= $baslik_al[1][0];
$ozet		= $ozet_al[1][0];
$resim		= $resim_al[1][0];
$icerik		= $icerik_al[1][0];

echo ('<div align="center">
<table border="1" width="800" cellspacing="0" cellpadding="0" bordercolor="#000000">
<tr>
<td>'.$baslik.'</td>
</tr>
<tr>
<td>'.$ozet.'</td>
</tr>
<tr>
<td><center><img border="0" src="'.$resim.'" width="640" height="360"></center></td>
</tr>
<tr>
<td>'.$icerik.'<br><a href="index.php">
<button type="submit" class="btn">Geri Dön</button></a></td>
</tr>
</table>
</div>');
//echo "<pre>";
//print_r($icerik_al);
//echo "</pre>";
?>

Burada ilk önce değiştirdiğimiz alan $formdangelen isimli değişkenin karşılığı link artık formdan geleceği için $_POST[“url”]; post methodunu belirtiyoruz. Diğer yaptığımız değişiklikler ise tamamen keyif işi bir adet en basitinden tablo oluşturdum ve içeriğini belirlemiş olduğumuz değişkenleri sırası ile yerleştirdim. $baslik, $ozet, $resim, $icerik..

Bu uygulamamızda en basitinden bir bot veya veri nasıl çekilir bunu göstermeye çalıştım. Eksikler olabilir soru ve problemleri iletebilirsiniz.

incele

indir

1 yorum
  1. Ali diyor

    hocam cok guzel anlatim olmus.fakat bi sey var yabanci haber sitelerinin makeleleini cekersen sikinti yasarmiyiz?mesela ajanslarla calisan haber sitelerinin makalelerini cekersen sorun cikarmi?

Cevap bırakın

E-posta hesabınız yayımlanmayacak.

Bu site, istenmeyenleri azaltmak için Akismet kullanıyor. Yorum verilerinizin nasıl işlendiği hakkında daha fazla bilgi edinin.