Php De Yaptığım İlk Bot [Tbt Aktif Konular]
-
Aktif konulardaki konu başlıklarını sadece yazı olarak listeliyor.
<?php //internetten hazır buldugum bir fonksiyon. function siteBaglan($url){ $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); $browser = $_SERVER['HTTP_USER_AGENT']; curl_setopt($ch, CURLOPT_USERAGENT,"googlebot"); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_REFERER, "http://www.google.com/"); $source = curl_exec($ch); curl_close($ch); return $source; } //Düzenli ifadeleri öğrenmek için bayağı uğraştım ama kafa basmadı. :) //internetten hazır buldugum bir fonksiyon. //fonksiyon, $yazı içerisinden başını ve sonunu belirtiğiniz bölgeyi çekiyor. function ara($bas, $son, $yazi) { @preg_match_all('/' . preg_quote($bas, '/') . '(.*?)'. preg_quote($son, '/').'/i', $yazi, $m); return @$m[1]; } //bağlanmak istediğimiz siteyi yazıyoruz. $site = "http://tahribat.com/Aktif-Forum-Konulari"; $baglan = siteBaglan($site); //akif konuların içerisinde <title> etiketlerinin içerisinde kalan bölgeyi $baslik değişkenine atadık ve yazdırdık. $baslik = ara("<title>", "</title>", $baglan); //site içerisindeki ilk title lar arasındaki veriyi yazdırmak istediğimiz için $baslik[0] dedik. echo "<b>$baslik[0]</b> <br>"; //kaynak kodu incelediğimde konuların da başı-sonu bu şekildeydi. $konular = ara('<td class="Tip2" onMouseOver="this.className=\'Tip2 Aktif\'" onMouseOut="this.className=\'Tip2\'">', '</td>', $baglan); //Üstte konuları çektikten sonra yazdırmış olsaydık linklerle birlikte yazdırılacaktı (2-3-4 gibi sayfalar da cabası). //Bu yüzden $konuların içinde de 2. bir ayıklama daha yapıyoruz ve sadece metin kısmını almış oluyoruz. //for döngüsünde olduğu için $isimler[0] her zaman konu başlığını verecektir. $isimler[1] derseniz ekranda '2' leri görürsünüz sadece. for ($i=0;$i<=count($konular);$i++){ $isimler = ara('/">', '</a>', $konular[$i]); echo "$isimler[1] <br>"; } ?>Tüm aktif konular tek bir sayfada olduğu için çok uğraştırmadı.
Merak ettiğim, bir alışveriş sitesindeki ürünleri çekmek istersem izlemem gereken yol ne olacak?
Aklıma gelen:
Önce kategorileri çekeceğim, ardından alt kategorileri, onun ardından ürünleri...
Umarım yanlış düşünüyorumdur çünkü bu iş bayağı uzar. :| -
Chrome'da kodu düzenleyemedim.
sondaki kodecho "$isimler[0] <br>";
olmalı.
-
güzel olmuş hep böyle düzenli kod yaz
-
güzel olmuş ama kendini biraz daha geliştirmen gerekli bildiğin gibi.. sana tavsiyem api desteği veren sistemler için yaz bunu
örn: youtube, facebook, twitter, friendfeed, vimeo..
buradaki apileri kullanarak bot yazabilirsen diğerleri çocuk oyuncağı gibi gelir. türkçe kaynakları bilmem ama ingilizce çok kaynak var hele php için sürüsüne
bereket. ben masaüstü için yazıyorum. mantığını anlarsan birisi için diğerlerinin de onlara benzediğini görürsün ve cidden çok zevkli bir iş ve kod yazarken kendini
profesyonel gibi hissediyorsun çünkü kullandığın sistem tamamen profesyonel yazılımcılar tarafından hazırlanış bir destek. developer key alıyorsun, authentication
yapıyorsun ondan sonra sisteme erişiyorsun .. böyle bir dizgi içinde yer almak bana zevk veriyorum, yıllardır kod yazdığım halde en çok hoşuma giden kodlamam
bunlar oldu diğeri de usb tabanlı elektronik devrem-masaüstü yazılım-android i birleştiren sistemi yazmam.. kolay gelsin
-
izleyeecegin yöntem yine bu mantıkla sitenin kategori menüsü hangi divdeyse o div içindeki link ve isimleri sırasıyla bir diziye atarsın
sonra bot üzerinden seçilen kategorinin linki sende oldugu için direk o linke gider ve çekmeye devam edersin
sayfalama olayıda genelde blablabla.com/blablabla/2 gibi bişi olucagından her sayfada çekme işlemin bitince linkin page kısmını 1 arttırırsın.
-
Realist bunu yazdı:
-----------------------------güzel olmuş hep böyle düzenli kod yaz
-----------------------------
Teşekkürler.unbalanced bunu yazdı:
-----------------------------güzel olmuş ama kendini biraz daha geliştirmen gerekli bildiğin gibi.. sana tavsiyem api desteği veren sistemler için yaz bunu
örn: youtube, facebook, twitter, friendfeed, vimeo..
buradaki apileri kullanarak bot yazabilirsen diğerleri çocuk oyuncağı gibi gelir. türkçe kaynakları bilmem ama ingilizce çok kaynak var hele php için sürüsüne
bereket. ben masaüstü için yazıyorum. mantığını anlarsan birisi için diğerlerinin de onlara benzediğini görürsün ve cidden çok zevkli bir iş ve kod yazarken kendini
profesyonel gibi hissediyorsun çünkü kullandığın sistem tamamen profesyonel yazılımcılar tarafından hazırlanış bir destek. developer key alıyorsun, authentication
yapıyorsun ondan sonra sisteme erişiyorsun .. böyle bir dizgi içinde yer almak bana zevk veriyorum, yıllardır kod yazdığım halde en çok hoşuma giden kodlamam
bunlar oldu diğeri de usb tabanlı elektronik devrem-masaüstü yazılım-android i birleştiren sistemi yazmam.. kolay gelsin
-----------------------------
Tavsiyen için teşekkür ederim, önceliğim api desteği veren alışveriş siteleri olacak. Aslında amacım fiyat karşılaştırma sitesi yapmak, hatta yaptım bile. Yalnız feed leri xml olarak vermeyen, veremeyen alışveriş siteleri var. Bu yüzden böyle bir yola başvurmayı düşünüyorum ama her site için ayrı bir kod öbeği yazmam gerekecek herhalde. :/
FCN bunu yazdı:
-----------------------------izleyeecegin yöntem yine bu mantıkla sitenin kategori menüsü hangi divdeyse o div içindeki link ve isimleri sırasıyla bir diziye atarsın
sonra bot üzerinden seçilen kategorinin linki sende oldugu için direk o linke gider ve çekmeye devam edersin
sayfalama olayıda genelde blablabla.com/blablabla/2 gibi bişi olucagından her sayfada çekme işlemin bitince linkin page kısmını 1 arttırırsın.
-----------------------------Eyv. hocam sağ ol. Dediğin adımları takip edip ilk botu yaptığımda onu da buraya eklerim.
-
Oh sonunda bitti. :)
Acemi biri için yolu uzatmış olabilirim, belki kullanmak isteyen veya örnek arayan olur diye nerede ne yaptığımı ayrıntılı bir şekilde açıklamaya çalıştım. Şu anda localhost ta sorunsuz bir şekilde çalıştı.
Hedef site olarak Vatan Bilgisayarı (http://www.vatanbilgisayar.com) seçtim.İki adet bot yazdım. Birincisi tüm kategorileri ve kategorilerin ilk sayfasındaki ürünleri çekiyor, işlem uzun sürdüğü için bunun üzerinde o kadar çok durmadım..
Yazdığım ikinci botta ise Kategori seçmeli, listelemeli, sayfalamalı bir bot yaptım. Umarım faydalı olur.
ilk kod:
<?php //internetten hazır buldugum bir fonksiyon. function siteBaglan($url){ $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); $browser = $_SERVER['HTTP_USER_AGENT']; curl_setopt($ch, CURLOPT_USERAGENT,"googlebot"); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_REFERER, "http://www.google.com/"); $source = curl_exec($ch); curl_close($ch); return $source; } //internetten hazır buldugum bir fonksiyon. //fonksiyon, $yazı içerisinden başını ve sonunu belirtiğiniz bölgeyi çekiyor. //fonksiyonu bazı yerlerde çalıştıramadığım için yeni ifadeler yazmak zorunda kaldım. //fonksiyonun sonuna s ekleyince kategoriler ve alt kategorileri çekti. //fonksiyonun sonunda sadece i olursa yalnızca kategori isimlerini çekiyor. function ara($bas, $son, $yazi) { @preg_match_all('/' . preg_quote($bas, '/') . '(.*?)'. preg_quote($son, '/').'/si', $yazi, $m); return @$m[1]; } //bağlanmak istediğimiz siteyi yazıyoruz. $site = "http://www.vatanbilgisayar.com/"; $baglan = siteBaglan($site); $kategoriler = ara('<li style="list-style-type:none; font-size:11px; font-weight:bold; color:#333; padding:2px;">', '</li>', $baglan); //Vatan Bilgisayar'dan verileri çekerken Türkçe karakter sorunuyla karşılaştım. //Bu sorunu çözmek için kullanılan bir döngü for ($i=0; $i < count($kategoriler) ; $i++) { $kategoriler[$i] = mb_convert_encoding($kategoriler[$i] ,'UTF-8',mb_detect_encoding($kategoriler[$i] ,'ISO-8859-9',true)); } // Desene göre $sonuc[1][0] bağlantı adreslerini, // $sonuc[2][0] ise alt kategori isimlerini verecektir. for ($i=0; $i < count($kategoriler) ; $i++) { preg_match_all('/href="(.*?)">(.*?)<\/a>/si', $kategoriler[$i], $sonuc); //Ana kategori ile alt kategorileri bir birinden ayırmak için bir koşul. if (strlen($sonuc[1][0])>5){ echo $sonuc[2][0] . " <b>Adres:</b><a href=\"" .$sonuc[1][0] . "\">" . $sonuc[1][0] . "</a><br>"; //ilk sayfadaki ürün isimleriyle ürün açıklamalarını ayrı ayrı çekelim. $urun_cek = siteBaglan($sonuc[1][0]); preg_match_all('/<span style="font-size: 13px; font-weight: bold; color: #333;">(.*?)<\/span>/si', $urun_cek, $urun_adi); preg_match_all('/<a id="(.*?)" href="(.*?)">(.*?)<\/a>/si', $urun_cek, $urun_aciklama); //ürün adlarıyla ürün açıklamalarını eşleştirelim //$urun_aciklama deseninde hedef sayfanın alt kısmındaki En Çok Satanlar kısmı da alındığı için $urun_adı sayısına göre döngüde işlem yapılacak. //Ek olarak gelen açıklamalardaki Türkçe karakter sorununu da düzeltelim. for ($a=0; $a < count($urun_adi[0]); $a++) { $urun_aciklama[3][$a] = mb_convert_encoding($urun_aciklama[3][$a] ,'UTF-8',mb_detect_encoding($urun_aciklama[3][$a] ,'ISO-8859-9',true)); echo "Ürün adı:" . $urun_adi[0][$a] . "<br>Açıklaması:" . $urun_aciklama[3][$a] . "<br>"; } }else { echo "<b> $kategoriler[$i]: </b><br>"; } } ?>Bu da ikinci: dosyanın adı:alver2.php
<html> <body> <?php $kategori = $_GET['kategori']; $sayfa = $_GET['rcd']; //internetten hazır buldugum bir fonksiyon. function siteBaglan($url){ $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); $browser = $_SERVER['HTTP_USER_AGENT']; curl_setopt($ch, CURLOPT_USERAGENT,"googlebot"); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_REFERER, "http://www.google.com/"); $source = curl_exec($ch); curl_close($ch); return $source; } //internetten hazır buldugum bir fonksiyon. //fonksiyon, $yazı içerisinden başını ve sonunu belirtiğiniz bölgeyi çekiyor. //fonksiyonu bazı yerlerde çalıştıramadığım için yeni ifadeler yazmak zorunda kaldım. //fonksiyonun sonuna s ekleyince kategoriler ve alt kategorileri çekti. //fonksiyonun sonunda sadece i olursa yalnızca kategori isimlerini çekiyor. function ara($bas, $son, $yazi) { @preg_match_all('/' . preg_quote($bas, '/') . '(.*?)'. preg_quote($son, '/').'/si', $yazi, $m); return @$m[1]; } //bağlanmak istediğimiz siteyi yazıyoruz. $site = "http://www.vatanbilgisayar.com/"; $baglan = siteBaglan($site); $kategoriler = ara('<li style="list-style-type:none; font-size:11px; font-weight:bold; color:#333; padding:2px;">', '</li>', $baglan); //Vatan Bilgisayar'dan verileri çekerken Türkçe karakter sorunuyla karşılaştım. //Bu sorunu çözmek için kullanılan bir döngü for ($i=0; $i < count($kategoriler) ; $i++) { $kategoriler[$i] = mb_convert_encoding($kategoriler[$i] ,'UTF-8',mb_detect_encoding($kategoriler[$i] ,'ISO-8859-9',true)); } // Desene göre $sonuc[1][0] bağlantı adreslerini, // $sonuc[2][0] ise alt kategori isimlerini verecektir. ?> <form method="get" action="alver2.php"> <select name="kategori"> <option value=""><--- Seçiniz ---></option> <?php for ($i=0; $i < count($kategoriler) ; $i++) { preg_match_all('/href="(.*?)">(.*?)<\/a>/si', $kategoriler[$i], $sonuc); //Ana kategori ile alt kategorileri bir birinden ayırmak için bir koşul. //Ana kategorilerde her hangi bir bağlantı yok, yani salt metin. O yüzden onları almıyorum. if (strlen($sonuc[1][0])>5){ //Seçtiğimiz kategorinin listede seçili olarak kalması için bir döngü daha. //Eğer hiçbir şey seçilmemişse normal liste gösteriliyor. //Ve eğer bir kategori seçilmişse verileri çekelim ama YAZDIRMAYALIM. if ($sonuc[1][0] == $kategori) { echo "<option value=\"" . $sonuc[1][0] . "\"selected>" . $sonuc[2][0] . "</option>"; //ilk sayfadaki ürün isimleriyle ürün açıklamalarını ayrı ayrı çekelim. $urun_cek = siteBaglan($sonuc[1][0] . "&rcd=" . $sayfa); preg_match_all('/<span style="font-size: 13px; font-weight: bold; color: #333;">(.*?)<\/span>/si', $urun_cek, $urun_adi); preg_match_all('/<a id="(.*?)" href="(.*?)">(.*?)<\/a>/si', $urun_cek, $urun_aciklama); //Sayfaları çekelim ve onları da işlem görecek hale getirelim. preg_match_all('/<div id="ctl00_ContentPlaceHolder1_divRCon2" style="float: left; width: 405px; line-height: 25px; text-align: right;">(.*?)<\/div>/si', $urun_cek, $sayfalar); $sayfala = str_replace("a href=\"","a href=\"alver2.php?kategori=" . $site , $sayfalar[1][0]); }else{ echo "<option value=\"" . $sonuc[1][0] . "\">" . $sonuc[2][0] . "</option>"; } } } ?> </select> <input type="submit" /> </form> <?php //Artık yazdırma işlemimizi yapabiliriz. //ürün adlarıyla ürün açıklamalarını eşleştirelim //$urun_aciklama deseninde hedef sayfanın alt kısmındaki En Çok Satanlar kısmı da alındığı için $urun_adı sayısına göre döngüde işlem yapılacak. //Ek olarak gelen açıklamalardaki Türkçe karakter sorununu da düzeltelim. for ($a=0; $a < count($urun_adi[0]); $a++) { $urun_aciklama[3][$a] = mb_convert_encoding($urun_aciklama[3][$a] ,'UTF-8',mb_detect_encoding($urun_aciklama[3][$a] ,'ISO-8859-9',true)); echo "Ürün adı:" . $urun_adi[0][$a] . "<br>Açıklaması:" . $urun_aciklama[3][$a] . "<br><br>"; } echo $sayfala; echo "<br><br><br><br><br><br><p><p>"; ?> </body> </html> -
en üstte duran botu localhost ta çalıştırdığımda
Fatal error: Call to undefined function curl_init() in C:\wamp\www\bot\bot1.php on line 15
hatasini alıyorum
-
asiminnesli bunu yazdı:
-----------------------------en üstte duran botu localhost ta çalıştırdığımda
Fatal error: Call to undefined function curl_init() in C:\wamp\www\bot\bot1.php on line 15
hatasini alıyorum
-----------------------------
Hocam wamp ile birlikte curl kutuphanesi de gelmis olmali, yalniz aktif edilmemistir. php.ini den gerekli ayarlamali yapsan yeterli olur. Php.ini de ;extension=php_curl.dll satirinin basindaki ; (noktali virgul) kaldir ve servisleri yeniden baslat. Calisacaktir. Yarin demo lari internete yuklerim. -
aynı hata olmadı hocam dedikelrini yaptım wamp ı kapatip tkerar açtim ama yine olmadı
-
asiminnesli bunu yazdı:
-----------------------------aynı hata olmadı hocam dedikelrini yaptım wamp ı kapatip tkerar açtim ama yine olmadı
-----------------------------php_info çekip curl aktifmi bak. php.ini den aktif ettiysen bile aktif gözükmüyorsa system32 ye 1-2 dll atman lazım onlara bak.
