Active Members dancezar Posted July 13, 2014 Active Members Report Posted July 13, 2014 (edited) Algoritmul nu este conceput de mine l-am vazut mai de mult pe net si m-am gandit sa il scriu in PHP.M-am gandit sa il postez pentru ca mi s-a parut foarte interesant acest algoritm.Ca si ideie acesta foloseste 2 vectori $to_vizit si $vizited, in $to_vizit se pastreza likurile care trebuie vizitate, iar in $vizited linkurile care au fost deja vizitate.Se foloseste de principiul "Cozi" sau FIFO First In First Out, adica se scoate pagina sursa a linkul care se afla la inceputul vectorului $to_vizit iar dupa este eliminat din acea lista.Apoi se scot toate linkurile care se afla in acea pagina HTML si se adauga la sfarsitul vectorului $to_vizit si $vizited DAR doar daca acele linkuri nu se afla deja in lista cu cele vizitate si ca acele linkuri apartina site-ului dorit (daca pe site s-ar afla un link de pe google , programul se v-a duce si v-a extrage linkuri pe google inutil) .Acest proces se v-a desfasura pana cand lungimea vectorului $to_vizit va fi 0 adica se v-a desfasura cat timp sunt linkuri care nu au fost inca vizitate. La sfarsit ar trebui ca toate linkurile care apartinand site-ului sa fie stocate in vectorul $vizited , acesta avand si rolul de istoric.<?phpfunction get_html($urs){ $ch = curl_init($urs); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_BINARYTRANSFER, true); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch,CURLOPT_USERAGENT,'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:26.0) Gecko/20100101 Firefox/26.0'); $content = curl_exec($ch); curl_close($ch); return $content;}$url=$argv[1];$to_vizit=array();$vizited=array();$to_vizit[0]=$url;$vizited[0]=$url;$domain=substr($url,0,-1);while(count($to_vizit)>0){ $html=get_html($to_vizit[0]); echo "Linkuri nevizitate:".count($to_vizit)."\n"; array_shift($to_vizit); if($html!=""){ if(preg_match_all("/<a\s[^>]*href=(\"??)([^\" >]*?)\\1[^>]*>(.*)<\/a>/siU",$html,$linkuri,PREG_SET_ORDER)) foreach ($linkuri as $link_arr) { $link=str_replace("'","",$link_arr[2]); if(strpos($link,"http")===false) if(substr($link,0,1)!="/") $link=$domain."/".$link; else $link=$domain.$link; if(!in_array($link,$vizited)&&strpos($link,$domain)!==false) { array_push($to_vizit,$link); array_push($vizited,$link); fwrite(fopen($argv[2].".txt","a"),$link.PHP_EOL); } } }}?>Se ruleaza din linia de comanda sub forma aceasta:php crawler.php http://site.com/ nume_fisierDupa ce v-a termina toate linkurile vor fi stocate in nume_fisier.txt.Ca sa functioneze pe linux trebuie sa aveti cURL instalat. Edited July 13, 2014 by danyweb09 Quote