Hoi,

Ik wil van een website alle links gaan spideren. Ik gebruik geen database, maar een txt bestand om bepaalde reden.

Alle landen uit die website zijn in de txt bestand gespiderd. Maar in die landenpagina staan nog meer links en die wil ik ook gaan spideren.

Met foreach krijg ik alle landen tekstbestand netjes onder elkaar. Geen probleem dus. Als ik begint met landenpagina te gaan spideren, krijg ik de laatste land gespiderd ipv 1e land. Hoe kan ik dat best oplossen?

De code:

function getBron($url){

    $useragent    = "Googlebot/2.1 (http://www.googlebot.com/bot.html)";

    $ch = curl_init();

    curl_setopt($ch, CURLOPT_USERAGENT, $useragent);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

    $bestand = curl_exec($ch);
    curl_close($ch);

    return $bestand;

}

function getLinks($url){

//global $land;
    $pagina = getBron($url);

    $tag_lijst = array ();
    $tag_lijst = explode(">", $pagina);

    $links     = array();
    $regs     = array();

    while (list ($id, $htmlTag) = each($tag_lijst)){

    if (stristr($htmlTag, "href")) {

            preg_match("/(href)\s*=\s*[\'\"]?(([[a-z]{3,5}:\/\/(([.a-zA-Z0-9-])+(:[0-9]+)*))*([+:%\/\?~=&;\\\(\),._ a-zA-Z0-9-]*))(#[.a-zA-Z0-9-]*)?[\'\" ]?(\s*rel\s*=\s*[\'\"]?(nofollow)[\'\"]?)?/i", $htmlTag, $regs);

            $links[] = $regs[2];

        }

    }

 foreach ($links as $item => $value){

 $fh = fopen($land.'.txt', 'a');
 fwrite( $fh, sprintf("%s\r\n", $value ) );
 fclose( $fh );

  print_r($value);
 }
}

$data = file ("landen.txt");
    foreach ($data as $value) {
        $land = explode ('\t\n', $value);
       getLinks($land[0]);
    }


Met de code ziet niks mis aan...Wie weet dus hoe ik elk land in lusje kan stoppen en begint met nieuwe wanneer de 1e klaar is..en ga zo door tot einde van de regel.
Ik weet niet of dit wel mag. Je doet je voor als google bot, terwijl je dat niet bent. Klopt niet, is niet goed.
Verder haal je data van een (?) site(s), dat mag ook niet zo 1-2-3.
Ook snap ik je probleem niet echt.
Ik heb toestemming gekregen om informatie van de site te spideren en scrapen. Omdat die persoon niks anders heeft om aan te bieden zoals xml of iets dergelijks. Deze manier is de laatste oplossing.

Wat die Googlebot betreft...die heb ik ergens vandaan gehaald. Die moet ik nog veranderen.

En de probleem is duidelijk..ik wil de 1e link laten spideren ipv de laatste link. In de lijstje staan 160 landen.
break; is om je lus te stoppen, maar ik snap je niet echt :S. Probeer duidelijker te zijn..

Edit:
Wat wil je gaan doen? Alle actieve links en dode links van dat pagina eruit halen of zo?
Gewoon alle links van de pagina eruit halen..

Maar ik heb een textbestand met alle landen in. Als ik dat landen gaan spideren, pakt ie de laatste land ipv 1e land.

Ik moet met 1e land beginnen, alle links spideren en opslaan in textbestand met naam. Eenmaal klaar is, dan begint ie met volgend land. Het blijft herhalen tot alle landen zijn gedaan.

Dat is in dat geval niet..en dat is dus de probleem.
Ik denk dat de meeste huiverig zijn hier te helpen aangezien het een vreemd verhaal is en mogelijk illegaal. Zou je wat meer openheid van zaken kunnen geven? Welke website wil je spideren? Waarom wil je geen database gebruiken? "Gewoon alle links van de pagina eruit halen.." is erg vaag. Sorry voor het wantrouwen maar ik denk dat die antwoorden jouw verhaal een stuk duidelijker maken ;)
Owkeej

we hebben je antwoord nog niet gekregen maar ik heb je code even verbeterd..

<?php
error_reporting(E_ALL);
class spider {

function __construct($bot,$input_file,$output_file='',$output_ext='.txt') {
$this->useragent = $bot;
$this->input_f = $input_file;
$this->output_f = $output_file;
$this->output_ext = $output_ext;
$this->logs_dir = 'spider';

$this->counter = 0;

if(!file_exists('spider')) {
echo '<font color="blue">Map aangemaakt</font><br>';
mkdir("spider", 0777);
}
$this->score_out();
}

function score_out() {
if(!file_exists($this->input_f)) {
exit('<font color="red">'.htmlentities($this->input_f).' is niet aangemaakt</font>');
} else {
$word = file($this->input_f);
if(count($word)!=$this->counter) {
$this->url = $word[$this->counter];
$this->url = str_replace(PHP_EOL,'', $this->url);
$this->counter++;


if($this->get_links()) {
echo '<font color="green">'.htmlentities($this->url).' is succesvol aangemaakt en gespidert</font><br>';
$this->score_out();
} else {
echo '<font color="red">'.htmlentities($this->url).' is niet gespidert</font><br>';
$this->score_out();
}
}
}
}


function auth(){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $this->url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
$output = curl_exec($ch);
curl_close($ch);
return $output;
}

function get_links(){
preg_match('/[^.]+\.[^.]+$/', $this->url, $name);
$name = str_replace('/','_',$name[0]);
$url_afk = $this->logs_dir.'/'.$this->output_f.$name.$this->output_ext;

if(file_exists($url_afk)) {
return false;
} else {
preg_match_all('#href="(.+?)"#si',$this->auth(),$func);

foreach ($func[1] as $item => $value){
$fh = fopen($url_afk, 'a');
fwrite($fh, sprintf("%s\r\n", $value ));
fclose($fh);
}
return true;
}
}
}


$bot = "PeterBot v1";
$spider = new spider($bot,'links.txt');
?>

links.txt
http://www.google.nl
http://www.phphulp.nl
http://www.google.com


Output:
[color=blue]Map aangemaakt[/color]
[color=green]http://www.google.nl is succesvol aangemaakt en gespidert[/color]
[color=green]http://www.phphulp.nl is succesvol aangemaakt en gespidert[/color]
[color=green]http://www.google.com is succesvol aangemaakt en gespidert[/color]


Nja zoals voorgaande reacties al duidelijk word, word een fake user agent van google of andere bestaande spiders tegen gegaan. Daarom waarschuw ik je ook met het gebruiken van dit.. Het gebruiken/veranderen naar een spider die reeds gebruikt word en/of foutief gebruiken is jouw verantwoordelijkheid..
Peter schreef op 17.06.2009 17:54
Nja zoals voorgaande reacties al duidelijk word, word een fake user agent van google of andere bestaande spiders tegen gegaan. Daarom waarschuw ik je ook met het gebruiken van dit.. Het gebruiken/veranderen naar een spider die reeds gebruikt word en/of foutief gebruiken is jouw verantwoordelijkheid..

Dat wordt niet tegen gegaan hoor. Je spooft die user agent, en dat mag niet.
Wat de script betreft..is al door mij opgelost. Peter..heel erg bedankt voor de code. Helaas is die moeite voor niks geweest.

Na intensief overleg met de klant heeft hij toch besloten om daarvan af te zien. Al deze werk is dus voor niks geweest. Wat er verder gaat gebeuren weet ik nog niet.

Dus als er een moderator hier leest..graag hele bericht verwijderen.
berichten worden niet verwijderd, en zoveel werk was het ook weer niet (ong 10 min)

Reageren