Salve a tutti. Sto facendo un semplice crawler in php e ho un piccolo problema. I link che trovo vengono inseriti in coda ad un vettore mentre il link appena visitato viene rimosso dallo stesso. Ho però un errore di cui non capisco il motivo: quando faccio $queue = array_shift($coda), la $coda viene vista come stringa e non come vettore, quindi tutte le iterazioni successive, ovviamente, non funzionano. Ecco il codice
codice:
<?php
// prendo una pagina seme e ne trovo i link. A questo punto prendo tali link e li uso come pagine seme.
function LeggiUrls($url,$coda) {
$file = 'link.txt';
$html = file_get_contents($url);
file_put_contents($file,"".PHP_EOL."pagina analizzata: ".$url.PHP_EOL.PHP_EOL, FILE_APPEND);
//guardo se riesce a visitarla, praticamente guardo se la pagina esiste davvero osservando se testo è vuoto
if(!$html) {
echo"Connessione fallita!";
}
else{
//tengo solo i tag a
$testopulito = strip_tags($html, "<a>");
//questa è un'espressione regolare che mi salva i link nella variabile matches
preg_match_all( '/<a.+?href="(http:\/\/www.[^0-9].+?)"/', $testopulito, $matches);
// Ciclo tutti i risultati li aggiungo in fondo alla coda e li stampo sul file
foreach($matches[1] as $link){
array_push($coda,$link);
file_put_contents($file, $link.PHP_EOL, FILE_APPEND);
}
}
//rimuovo il primo elemento della coda, ossia l'url che è stata appena analizzata
$queue = array_shift($coda);
Iteratore($queue);}
function Iteratore($coda){
// Ciclo e recupero tutte le pagine nella coda fino a quando ci sono elementi
while(count($coda)>0) {
LeggiUrls($coda[0],$coda); }
}
file_put_contents("link.txt", ''); //svuoto il file
// Inizializzo la coda che contiene gli url.
$coda = array("http://espresso.repubblica.it/");
$seme= $coda[0];
LeggiUrls($seme,$coda);
?>