Jump to content
dancezar

Website crawler in PHP

Recommended Posts

  • Active Members

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.


<?php
function 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_fisier

Dupa ce v-a termina toate linkurile vor fi stocate in nume_fisier.txt.

Ca sa functioneze pe linux trebuie sa aveti cURL instalat.

Edited by danyweb09
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...