Bonjour à tous,

Récemment je me suis mis en tête de créer un crawler pour faire un petit moteur de recherche. Attention rien de foufou, je ne souhaite pas concurrencer google et bing, juste m'amuser à créer le script pour voir comment ça fonctionne.

Donc j'ai crée un bot avec une fonction récursive qui se charge de récupérer les documents web (avec un DOMDocument), qui les analyse, stocke en bdd, puis se rappelle. La fonction accepte en argument un tableau contenant les urls de sites à vérifier.

Et c'est là mon premier problème.

En fait le script, lorsqu'il analyse une page, stocke tous les liens rencontrés dans le tableau. A chaque url visitée, il la supprime du tableau. On voit bien le problème, au bout d'un moment mon array est trop gros, et l'application plante par manque de mémoire.

Ma question donc, comment gérer autant de liens ? Je dois retravailler la structure de ma fonction pour ça, est-ce que je peux par exemple imaginer de faire un "flush" du tableau, qui se lancerait lorsqu'une variable static arriverait à un certain seuil ? Par exemple le bot analyse tous les liens encore présents dans le tableau, et lorsuq'il n'en reste plus qu'un, il reprend normalement sur celui-ci jusqu'au prochain "flush".

Je ne sais pas si c'est une idée exploitable, d'autant que du coup certains liens ne serons pas analysés.

En fait je ne sais pas trop comment font les moteurs de recherche concrètement.

Sinon je peux enregistrer mes liens dans une bdd, mais forcément ce sera plus lent, puisque je devrais accéder constamment à la base.


Maintenant seconde question. J'attrape le contenu de la page comme ça :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
$body_balise = $document->getElementsByTagName('body');
if($body_balise->length > 0)
	$body = $body_balise->item(0)->nodeValue;
Ensuite le contenu de body est trié, les mots courts sont supprimés, la ponctuation aussi, etc, puis j'enregistre le tout dans la bdd.
Le problème c'est que, malgré l'encodage utf-8 de la bdd, les données caractères spéciaux sont mal affichés. J'ai vérifié avec mb_detect_encoding() et même avec les pages encodées en utf-8, ça sort mal. J'ai essayé le utf8decode, le mb_convert_encoding, etc, mais rien n'y fait je n'arrive pas à obtenir des caractères spéciaux bien affichés.

Voilà, si vous avez des idées quant à mes problèmes, ça m'aiderait beaucoup
En fait j'aimerais plus d'explications sur la façon dont procèdent les moteurs de recherche pour indexer les liens, est-ce qu'ils prennent tous les liens de la page comme moi ? Ou seulement certains ? J'ai lu je ne sais où que google ne prend que les liens externes, mais du coup comment font-ils pour indexer le contenu entier d'un site donné ?

Merci