Yazarlar Sözlük Makaleler Yardım Masası Gözlük Forum İstatistik

Yardım Masası

SORU: Bir arama motoru yazmak
Ben bir arama motoru yazmak istiyorum. Bana yardımcı olabilir misiniz? HTML ile bu işi yapabilir miyim yoksa PHP gibi bir dil kullanmak mı gerekir? Bunun bir hazır scripti var mıdır?


Cevaplar

1.  Arama motoru ile kastın kendi sitende arama yaptırtabilmek demi...
Google'in kendi scriptleri vardı, google'a kendi siteni taratıyorsun!
haydar
19 Şubat 2008 11:19
2.  hayır yani google gibi bir şey yapmak.onu bende biliyorum yoksa sağol.yani spiderlar sitelere girip siteleri tarıyor hani kendi arama motoru dizinine ekliyor.
mehmetcc
19 Şubat 2008 11:27
3.  ne kızıyon hocam :) ne kastettiğini nerden bileyim ben...
Bu konuda fizikçi ustadır. Yakında cevap verir...
haydar
19 Şubat 2008 11:56
4.  abicim kızmadım ya.ama suç bende ters algılancağını biliyordum(kızmadım ama)
mehmetcc
19 Şubat 2008 18:17
5.  Şşşşt. Aman arkadaşlar bağırmayın, girişleri başlıkları falan uyandıracaksınız. 1 senedir uyuyolar ne güzel. Barney bile terketti siteyi hesap edin artık. :)

Welcome back Haydar Bey, hoşgeldiniz Mehmet Bey.

Mevzuya dönelim. Arama motoru yazmak çok kolay bir şey abi. Linkleri takip ederek siteden siteye atlayan bir kod yazmak gerekiyor. Bu kod bulduğu sayfaların adreslerini ve HTML'den arındırılmış içeriklerini kelimelere göre indeksleyerek saklıyor. Bu spider. Bir tane de Google'ın ana sayfası gibi form yapıp kaydedilen bilgi üzerinde arama yapılabilmesini sağlıyorsunuz. Bu kadar.

Bütün bu işler herhangi bir dil ile yapılabilir. İlk yaptığınız amatör bir şey olur büyük ihtimalle. İkincisini biraz daha iyi yaparsanız. İndeksleme konusu çok önemli bunu zamanla geliştireceksinizdir. Yani bence hobi olarak başlayın bu işe, zamanla güzel bir şey ortaya çıkarabilirsiniz.

Kolay gelsin.
fizikci
20 Şubat 2008 15:11
6.  spiderlar normal bir kodlama ile mi kodlanıyor.internette hazır bir sürü vvar.bu iş için jsp bile öğrenecem.yardımlarınız için teşekkürler.ayrıca html veya jsp ile bot ve spider kodlayabilirmiyim?
mehmetcc
20 Şubat 2008 16:44
7.  Sanırım bu konunun zor kısımları indexleme yöntemin ve indexlenmiş veride arama yöntemin.
Fizikçi paşanın dediği gibi sayfaları gezmek zor değil, sayfaları gezecek kodu yazmakda zor değil...
Aslında merak ettiğim bir husus, web adresleri, linkler toplu olarak bir yerlerde var ve gezilecek adresler buralardan alınabiliyormu? Neden sordum? Fizikçi paşa linkten linke gitme derken bir web sitesi içerisinde sayfalarda bulunan diğer linkleri gezmeyi kastetmiş olabilirmi acaba diye düşündümde...
haydar
20 Şubat 2008 17:10
8.  kastettiği webde dolaşmak geri link:)eğer istersen haydar bir şeyler yapalım senle:)fizikçi abi destek ver bana.ayrıca meta tagları nasıl algılıcam.fizikçi paşa abimiz acaba bunun için bir algoritma verebilirmi?
mehmetcc
20 Şubat 2008 17:37
9.  Mehmet Bey, meta tagları ve linkleri elde etmek için regular expression kullanabilirsiniz. Spiderlar doğası gereği HTML ve JSP ile kodlanmaz. Çünkü bu talep edilen bir sayfa ya da sunucu tarafı kodlaması değil. Aksine spiderlar talep eden ya da istemci konumunda. Browser gibi.

Yani konsol uygulamaları yazmanıza izin veren (Java, PHP, C#, Pascal, vb) bir dil ile spiderınızı yazmalısınız. Bir zamanlar heves edip C# ile bişeyler yazmıştım. Bulabilirsem önemli kısmını buraya yazayım inşallah.

Haydar Bey, bence bir spiderın başlangıç adresi http://www.dmoz.org gibi bir web dizini sitesi olmalı. Oradan zaten epey bi site keşfeder. Tabi o sitelerdeki linklerden başka sitelere, onlardan diğerlerine dolaşmaya devam etmelidir. Eğer bir sitede RSS yayınına rastlarsa bilgiyi daha düzenli almak adına bundan faydalanmalıdır. Tabi gene de sayfaları indekslemeye devam etmelidir.
fizikci
20 Şubat 2008 21:51
10.  Hmm. Bulamadım. Ama buyrun efenim burada geliştirelim. PHP olsun mu? Bence olsun. Kolay güzel bi dil. C'ye çok benziyor sadece değişkenlerin başına $ işareti koycaz hepsi o. :)

Mesela bir web sayfasını talep edip, cevabı bi stringe depolamak şu kadar kolay:

$cevap = implode('', file('http://www.dmoz.org'));

Dmoz.org'un kaynak HTML kodu string olarak elimizde. Şimdi bu kod içindeki linkleri bulalım. Bu kadar kolay:

preg_match_all("|href=\"(.*)\"|U", $cevap, $linkler, PREG_PATTERN_ORDER);

$linkler dizisinin 1. elemanı burada bir dizi olarak bize linkleri veriyor. Bu yüzden
$linkler = $linkler[1];

yazalım ki linkler dizi olarak elimizde bulunsun.

Bu linklerden http:// ile başlamayanlar site içi link olmalı. Bunları http ile başlayacak şekilde düzenlemeliyiz. Yani relative adresleri absolute adrese çevirmeliyiz. Fakat bu o kadar kolay bir iş değil. Mesela www.dmoz.org/World/Turkey adresinde ../Iraq şeklinde bir adres (url) bulduk diyelim. Bunun absolute hali www.dmoz.org/World/Iraq olur. Daha bir sürü ihtimal var ../../Fun şeklinde bir adres de olabilir. Ya da sadece Iraq şeklinde bir adres de olabilir. Bunları her zaman doğru şekilde absolute adrese dönüştürmeliyiz. Kendimizi yemeyelim Google'dan araştıralım. Bakalım bir hayırsever bu işi yapan bir fonksiyon yazmış mı?

...

Evvet, buldum. Şöyle bişey var:

    function InternetCombineUrl($absolute, $relative) {
        $p = parse_url($relative);
        if($p["scheme"])return $relative;
       
        extract(parse_url($absolute));
       
        $path = dirname($path);
   
        if($relative{0} == '/') {
            $cparts = array_filter(explode("/", $relative));
        }
        else {
            $aparts = array_filter(explode("/", $path));
            $rparts = array_filter(explode("/", $relative));
            $cparts = array_merge($aparts, $rparts);
            foreach($cparts as $i => $part) {
                if($part == '.') {
                    $cparts[$i] = null;
                }
                if($part == '..') {
                    $cparts[$i - 1] = null;
                    $cparts[$i] = null;
                }
            }
            $cparts = array_filter($cparts);
        }
        $path = implode("/", $cparts);
        $url = "";
        if($scheme) {
            $url = "$scheme://";
        }
        if($user) {
            $url .= "$user";
            if($pass) {
                $url .= ":$pass";
            }
            $url .= "@";
        }
        if($host) {
            $url .= "$host/";
        }
        $url .= $path;
        return $url;
    }

Bu fonksiyonu kullanarak linklerimizi absolute hale getirelim:
for($i=0; $i<count($linkler); $i++)
    $linkler[$i] = InternetCombineUrl("http://www.dmoz.org", $linkler[$i]);

Bu da tamam. Şimdi bu işi rekürsif olarak sonsuza dek yapan bir fonksiyon yazmalıyız. Şöyle bişey mesela:

function spider($baseUrl)
{
    $cevap = implode('', file($baseUrl));
    preg_match_all("|href=\"(.*)\"|U", $cevap, $linkler, PREG_PATTERN_ORDER);
    $linkler = $linkler[1];
    for($i=0; $i<count($linkler); $i++)
    {
        $linkler[$i] = InternetCombineUrl("http://www.dmoz.org", $linkler[$i]);
        spider($linkler[$i]);
    }
}

// burada spider'ımıza start verelim:
spider("http://www.dmoz.org");


Spider tamam. Tabi bu spider sadece geziyor. Faydalı hiç bir şey yapmıyor. Mesela $cevap değişkenine kaynak kodu yazdıktan sonra bunu veritabanına kaydetse iyi olur. Şu linkin içeriği şu gibi. Ayrıca hangi siteden hangi sitenin linkine ulaştığı bilgisini de veritabanına kaydederse süper olur. Böylece bir adrese kaç farklı adresten link verildiğine bakarak o sayfanın rankını gesaplayabiliriz. Arama sonuçlarında hangi siteyi daha yukarıda göstereceğimize dair bir veri olmuş olur.

İnternet'te 10 milyar civarında web sayfası var bildiğim kadarıyla. Bütün interneti veritabanımıza kaydetmemiz mümkün değil! :) Ayrıca kaydetsek bile bu milyarlarca terabaytlık bilgi içerisinde arama yapmak hangi işlemcinin haddine? Bunun için Google binlerce işlemci ve hard disk kullanıyor ve bunların üzerinde çalışan dağıtık bir işletim sistemi geliştirmişler. (Şehir efsanesi olabilir, bilmiyorum) YAni kısaca dananın kuyruk acısı burada başlıyor. O yüzden danayı üzmeyelim, sadece spider yazarak bu maceraya son verelim. :)
fizikci
20 Şubat 2008 23:00
11.  Kodu test ettim. Bi düzine hata buldum. :) En kısa kodda bile oluyor bu böcekler.

Çalışır vaziyette son hali şöyle:
<?

    function InternetCombineUrl($absolute, $relative) {
        $p = parse_url($relative);
        if($p["scheme"])return $relative;
      
        extract(parse_url($absolute));
      
        $path = dirname($path);
  
        if($relative{0} == '/') {
            $cparts = array_filter(explode("/", $relative));
        }
        else {
            $aparts = array_filter(explode("/", $path));
            $rparts = array_filter(explode("/", $relative));
            $cparts = array_merge($aparts, $rparts);
            foreach($cparts as $i => $part) {
                if($part == '.') {
                    $cparts[$i] = null;
                }
                if($part == '..') {
                    $cparts[$i - 1] = null;
                    $cparts[$i] = null;
                }
            }
            $cparts = array_filter($cparts);
        }
        $path = implode("/", $cparts);
        $url = "";
        if($scheme) {
            $url = "$scheme://";
        }
        if($user) {
            $url .= "$user";
            if($pass) {
                $url .= ":$pass";
            }
            $url .= "@";
        }
        if($host) {
            $url .= "$host/";
        }
        $url .= $path;
        return $url;
    }

$readUrls = array();

function spider($baseUrl)
{
    global $readUrls;
    if($readUrls[$baseUrl]) return;

    $cevap = implode('', file($baseUrl));
    $readUrls[$baseUrl] = 1;

    echo $baseUrl."\n";
    preg_match_all("|href=\"(.*)\"|U", $cevap, $linkler, PREG_PATTERN_ORDER);
    $linkler = $linkler[1];
    for($i=0; $i<count($linkler); $i++)
    {
        $linkler[$i] = InternetCombineUrl($baseUrl, $linkler[$i]);
        spider($linkler[$i]);
    }
}

// burada spider'ımıza start verelim:
spider("http://www.dmoz.org");

?>


Bu kodu nasıl çalıştırabilirsiniz?

1. Eğer yoksa önce PHP'yi indirin.
        http://www.php.net/get/php-5.2.5-Win32.zip/from/tr2.php.net/mirror
2. Zipli bir dosya gelecek, bunu C:\php dizinine açın.
3. Yukarıdaki kodu spider.php adıyla c:\php dizinine kaydedin.
5. Başlat > Çalıştır > cmd yazın. Komut penceresi açılsın.
6. "cd c:\php" komutuyla php dizinine geçin.
7. "php spider.php" komutuyla scripti çalıştırın.

spiderın dolaştığı adreslerin listelendiğini göreceksiniz. Canınız sıkıldığında Ctrl+C ile programı durdurun.

Örnek çıktı:
C:\php>php spider.php
http://www.dmoz.org
http://www.dmoz.org/about.html
http://www.dmoz.org/css/docs.css
http://www.dmoz.org/
http://blog.dmoz.org/
http://blog.dmoz.org/media/styles_mock.css
http://blog.dmoz.org/rss.xml
http://resource-zone.com/
http://resource-zone.com/\/rz-style.css
http://resource-zone.com/\/guidelines.php
http://www.dmoz.org/Kids_and_Teens/
http://www.dmoz.org/Kids_and_Teens
^C
C:\php>

fizikci
20 Şubat 2008 23:44
12.  Yav bu fizikçi paşa büyük adam :)
haydar
21 Şubat 2008 15:21
13.  Verdin gazı coştum abi... :)
fizikci
21 Şubat 2008 16:42
14.  Gene fizikçi üstadım döktürmüş maşallah.
Vallahi benim bir yere gittiğim yokta üstad kimseler yok ben ne yapayım hiçkimse yok biraz kendi sitemle uğraştım onunla oyalandım.

Ölmek var BK'dan dönmek yok.. Şuan azda olsa birşeyler biliyorsam BK ve siz değerli üstadlarım sayesinde..
BaRNeY
22 Şubat 2008 11:50
15.  vayy...sayemde nelere sebeb oldum:)neyse fizikçi paşa abi gerçekten yapmışsın bu işi bende şu jsp'ye bakıyorum.ingilizce biraz zorluyo ama bu işi yapıcam.peki bir arama motoru javascript ile kodlanır mı?kolay olmayan sitenin indexlenip dizine koyulması.
mehmetcc
22 Şubat 2008 18:08
16.  fizikçi paşa abi şu dana paragrafını okudum ve bu işe artık yatmıcam.tam 6 aydır bu işle uğraşıyorum ama neyse...
mehmetcc
22 Şubat 2008 18:12
17.  http://www.cobituol.com/Makalegoster.aspx?ID=113
Veri konusunda bu bilgi yeterli olur sanırım.. Ama genede hemen vazgeçmemek lazım. Bkz: BaRNeY*
BaRNeY
22 Şubat 2008 18:51
18.  Barney haklısın biz terkettik siteyi ama senin için de hayır oldu, cobituol'u ilerlettin baya. :)

Benim ilgi alanım siyasal bilimlere kaydı, o yüzden aşağıda belirtilen dost sitelerde dolaşıyorum epey bi zamandır. Derin Düşünce'de yazarlığa bile cüret ettim hesap et.. :)

Mehmet Bey JSP güzel tercih. O konuda size başarılar dilerim. Ama bence de arama motoru işinden vazgeçmeyin. Bu tür hobiler son derece eğitici oluyor. İnsan bir hayalin peşinden koşuyor, başaramıyor ama bir de bakıyor bir dünya şey öğrenmiş. Ben bunu çok yaşadım. Öğrendiklerim yanıma kar kaldı. Danaya acımayın yani bırakın üzülsün biraz. :)
fizikci
22 Şubat 2008 23:59
19.  Evet biraz öyle oldu hocam ama her zaman BK'yı örnek alarak yaptım..
BaRNeY
23 Şubat 2008 00:37
Bu konuda bildiklerinizi bizlerle paylaşabilirsiniz
Tabi bunun için yazarsanız giriş yapmalı, yazar değilseniz yazar olmalısınız.
© 2005, Bilişim Kulübü. (1125 ms)
Ne yapabilirsin: SubtitleClick ile İngilizceni Geliştir, Çınar Framework ile kod yaz, Eglencelik.org'ta biraz eğlen