Créer son simulateur de robot d’indexation en PHP

Mathieu Chartier Programmation 16 commentaires

Je suis actuellement en pleine écriture d'un prochain livre sur le référencement technique et le suivi-audit SEO avec Alexandra Martin, notre Miss SEO Girl nationale. Pour cet ouvrage, je code beaucoup en PHP (mais aussi en Javascript, jQuery voire en VBScript pour ASP parfois... :D) afin de vous fournir un maximum d'informations techniques qui nous manquent souvent lorsque nous travaillons.

Simulateur de crawler et spider PHPL'objectif n'est pas de réinventer la roue mais de montrer que le savoir-faire technique et la programmation peuvent vraiment être des armes pour réussir sur le web et dans le référencement naturel. Nous avons trop tendance à nous accrocher à la théorie (Ô combien intéressante mais pas toujours suffisante) et à délaisser les complications causées par la lourdeur de la programmation. Bizarrement, j'ai été formé pour travailler dans la communication, l'écrit web et la gestion de projet et au final, je me retrouve les mains dans le cambouis à longueur de temps pour vous pondre des codes, à croire que cette "lourdeur" me passionne ! :D

Il est vrai que de nombreux outils existent sur le marché en termes de SEO (et certains sont de très grande qualité), mais cela ne remplace pas le "code en dur" à l'ancienne. En effet, n'existe-t-il rien de plus gratifiant que de comprendre ce qui se cache derrière la machine pour au final coder la machine ? Je vous présente ici uniquement l'un des codes prévus dans le prochain livre à sortir mais je vous garantis qu'il regorgera de bien d'autres surprises plus intéressantes (c'est le moment "teasing" de l'article, ne vous ai-je pas dit que j'étais formé dans la communication ? :D).

Principe d'un simulateur de robot en PHP

Le simulateur de robot est un outil qui permet de voir le code source d'un site comme le ferait un moteur de recherche afin de contrôler les éventuels problèmes de crawl, de code ou même dans les en-têtes HTTP.L'intérêt est de mieux connaître ses pages web et de pouvoir déceler les éventuels blocages ou freins au référencement naturel.

De nombreux outils existent sur la Toile pour répondre à ce besoin mais la plupart posent problème ou ne font pas les choses comme il se doit. À contrario, certains services en ligne sont d'une très bonne qualité et peuvent vous donner satisfaction sans problème...

Comme je l'ai dis précédemment, l'idée n'est pas de faire un meilleur outil que les autres ni de jouer à celui qui a la plus longue, mais bien de montrer comment fonctionne un simulateur de spider (robot, crawler, ou autre nom que vous aimez...) par la technique. Sachez que vous pourrez tester le simulateur par un lien fournit en bas de page ou télécharger le script PHP entièrement commenté, vous pourrez donc personnaliser le code et le faire évoluer pour obtenir un résultat encore meilleur.

Le simulateur de robot codé ici présente plusieurs fonctionnalités dont certaines peuvent paraître négligeables mais sont plutôt agréables :

  • Récupération des URL des pages à crawler avec "http://", "https://" ou non. Nativement, les URL avec le protocole sécurisé ne fonctionne pas, il faut ajouter une ligne de code supplémentaire pour autoriser la lecture de ces pages, c'est chose faite... :D
  • Récupération des en-têtes HTTP (lues par les robots, il ne faut pas l'oublier !) et du code source à l'aide de l'extension cURL en PHP (vérifiez que le module est bien installé sur votre hébergeur ou sur votre serveur local dans Wamp Server par exemple).
  • Lecture du code ligne par ligne avec une boucle foreach afin d'assurer un résultat convenable. Il existe également d'autres alternatives si vous voulez mettre la main à la pâte en utilisant les fonctions highlight_file() ou son équivalent show_source() en PHP (avec ces fonctions, il faut mettre en paramètre l'URL de la page pour récupérer le code source bien présenté voire coloré selon les serveurs).
  • Numérotation ou non des lignes du code source afin de se repérer plus facilement.
  • Colorisation ou non du code source (je me suis fait plaisir là dessus, c'était juste pour le fun mais c'est devenu le point fort du simulateur en fait... :D).
  • Réadaptation automatique de l'encodage en UTF-8 quelle que soit l'URL (pour que l'affichage corresponde à l'encodage de l'outil). Il s'agit du plus gros défaut rencontré sur les services en ligne disponibles sur le marché, la plupart affiche des résultats indignes ou avec un mauvais encodage, ce qui nuit à la lecture et s'éloigne de la réalité, à savoir lire réellement comme un robot d'indexation. Les pages qui affichent des caractères mal accentués sont des pages qui n'ont pas précisé leur encodage, cela permet de voir ce manque par exemple...

Avant de vous passer le code et les liens de tests et téléchargement, voici un exemple de rendu dans la capture ci-dessous.

Spider simulator PHP (simulateur de robot en PHP)

Code du simulateur de robot PHP

Rentrons dans le vif du sujet avec le code complet du simulateur de spider PHP. Il suffit de copier à la suite les bouts de code présentés dans un fichier pour créer le simulateur. Ensuite, vous pouvez personnaliser l'interface et le style, je n'ai mis que des exemples ici...

La fonction PHP du spider simulator

La partie HTML-CSS du simulateur de robot

Cette partie comprend quelques codes en PHP pour le traitement du résultat mais pour le reste, ce n'est que de l'HTML et du CSS, rien de bien sorcier !

 Téléchargement et outil de test en ligne du simulateur de crawler PHP

Voici peut-être le moment le plus intéressant pour vous, la section téléchargement et test du simulateur de robot. N'hésitez pas à vous servir, à le tester, à le faire évoluer et à revenir vers moi si vous avez des questions.

Pour télécharger le script PHP commenté et comprendre le fonctionnement profond d'un robot de moteur de recherche (si ce n'est que les robots crawlent de page en page, ce que je présenterais en partie dans le prochain livre) et de ce qu'il voit dans nos pages, c'est juste en-dessous...

Télécharger “Spider Simulator PHP”spider-simulator.zip – Téléchargé 857 fois – 2 KB

Pour tester en ligne, c'est par ici : simulateur de robot d'indexation en ligne.

J'espère surtout que cette présentation d'un simulateur de robot créé en PHP vous donnera envie de coder certaines fonctions et de voir les bienfaits du code pour le référencement naturel. J'en conviens, l'exemple du "spider simulator" n'est pas forcément le plus pertinent mais je n'allais pas vous fournir tout d'un coup, j'entretiens le suspense... :D

16 commentaires

  • Stéphane dit :

    Wow ! Merci Mathieu pour ce joli cadeau. C'est vachement bien expliqué en plus. Surtout que le code est entièrement personnalisable. Je vais pouvoir faire joujou. Je me demande si tous les spiders se ressemblent. Je me doute bien que non. Le crawl peut être exécuté de manière différente. Celui de Google par exemple doit être super complexe. Mais à mon avis, les robots se ressemblent un peu, surtout au niveau de la récupération des données ou du contenu. Ensuite c'est l’interprétation des données qui change tout. On parle alors d'algorithme et c'est ce qui différencie chaque outils.

    • Merci à toi pour tes compliments. Pour tout te dire, il s'agit de l'un des codes les plus "simples" que j'ai eu à faire pour le livre. J'avoue même que certains systèmes m'ont été impossible par manque de temps (réaliser un robot profond et puissant prend du temps, et je n'ai pas toujours ce temps pour tout expliquer...) et ça me frustre un peu...

      En fait, les crawlers en PHP ne doivent pas être légion sur les principaux moteurs de recherche, bien que ce langage soit très puissant et tout-à-fait suffisant pour répondre à la plusieurs des besoins. En général, le langage Java ou l'Ajax (Javascript, XML et autre...) est préféré car plus sécurisé voire plus puissant dans certains domaines. En tout cas, cela ne change rien pour un simulateur de robot car le résultat reste le même, c'est juste le traitement des données qui changent, et avec ce code, vous avez déjà de quoi vous amuser... :D

  • Hello,

    Je viens de lire votre article mais je suis surpris par plusieurs points : je vous cite : " ...car la sécurisation empêche la lecture du code source ..." mais qu'est-ce que ca veut dire ? Le https n'empêche nullement la lecture du code source ! Si le code source était illisible, le navigateur ne saurait pas l'interpréter et le robot non plus. Deuxième point, il ne faut aucunement forcer l'affichage des résultats en utf-8 sinon, vous ne verrez jamais les erreurs d'encodages ! Vous devez garder l'affichage tel que le site le propose avec son propre charset. Surtout si vous enregistrez les données ! Enfin, je conçois que vous créiez un robot d'indexation en php même si c'est loin d'être le choix le plus judicieux, mais j'ai un doute certain sur l'utilité de ce robot. En effet, ce dernier, tel que vous le présentez n'indexe rien du tout, il se contente simplement de lire le code source de la page à laquelle il accède. De plus, il ne parcourt pas la page de liens en liens. Je crois que vous confondez, navigateur, scraper et robot d'indexation. Et finalement, en quoi Est-ce un simulateur ? Soit il lit la page soit il ne la lit pas, mais il ne simule pas une lecture ! Soit vous ne maitrisez pas bien votre sujet, soit votre article et son objectif ne sont pas très clairs.

    • Bonjour,
      Je suis désolé que vous n'ayez pas compris la différence entre "simulateur de robot" et "robot", il me semblait pourtant que la nuance était assez claire... D'ailleurs, vous êtes bien la seule personne a être étonnée (au point que vous me dites presque que je ne comprends pas mon métier, autant m'insulter directement ce sera plus simple ! :D).

      Concernant le "https://", j'ai dû mal m'exprimer en effet. Les codes sources sont lus, bien entendu, mais après redirection la plupart du temps. Je vous invite à reprendre le code, le modifier, et tester des pages avec ce protocole... Vous m'en direz des nouvelles (ça ne fonctionne pas, ça affiche un "blanc" en général voire une erreur). Grâce à vous, je viens de tilter qu'il y avait sûrement une solution pour contrer ce problème, merci ! :D

      Quant à l'UTF-8, je ne pense pas que vous ayez compris l'intérêt. Il n'existe pas de "bons" ou de "mauvais" encodages. Le simulateur de spider est encodé en UTF-8, c'est mon choix et je dois donc présenter les résultats dans cet encodage car s'il s'affiche mal, ce sera de ma faute et non celle du site testé. Si le site est encodé en ISO-8859-1, je ne vais pas afficher plein d'entités HTML ratées pour faire croire au testeur que son site est mal encodé alors qu'au fond, ce serait l'outil qui le duperait ! Décidément, cette confusion sur les "bons" et "mauvais" encodages montrent à quel point les gens ne savent pas ce que c'est...

      J'ai codé un robot également en PHP pour crawler et récupérer les liens, mais ce dernier ne sera pas présenté ici.
      Quand au choix de PHP, il est volontaire car c'est ce qu'on appelle dans le jargon de la "pédagogie", je ne vais pas coder un outil en Java ou autre pour me la péter si personne au fond ne peut le comprendre, j'ai préféré utiliser un langage commun et fonctionnel (et d'ailleurs, je ne vois pas en quoi un langage est meilleur qu'un autre, cela n'est souvent que l'avis des pro-PHP contre les anti-PHP, une espèce de tendance urbaine ou de débat puérile qui ne mène à rien, et je parle en connaissance de cause...).

      Avant de faire le donneur de leçons, lisez l'article en détail et vous verrez que je n'ai jamais proposé un "robot" (crawler ou autre) ou un "scrapper" mais bien un simulateur de robot pour voir comme un spider, tout bêtement... Je pense que vous attendiez un code tout fait pour un crawler car vous ne savez pas le coder mais vous avez été déçu donc votre commentaire est à l'image de cette désillusion. Si vous voulez un robot en PHP (ah non pardon ce n'est pas bien un bon langage), je pourrais vous en fournir un, il suffit de demander (mais vous devez être un pro de PHP pourtant vu votre site, je suis surpris que vous ayez besoin de moi...).

    • C'est bon, j'ai réglé le problème de l'HTTPS et j'ai mis le simulateur et le code à jour, merci de m'avoir fait tilté involontairement. J'avais oublié de remettre une ligne de cURL pour lire les pages sécurisées...
      Concernant l'encodage, il n'y aura d'erreur d'affichage que lorsque l'encodage n'est pas paramétré dans la page, ce qui montre bien à l'utilisateur qu'il a commis une erreur ou qu'il lui manque quelque chose (bien que l'encodage puisse être géré via .htaccess).

      P.S. : juste pour information, une partie des API de Google sur le PageRank et autre sont codées en PHP. Si ce langage est si nul (ou plutôt, il n'est plus "in" ou "tendance), pourquoi même Google coderait encore des API dans ce langage ? Sûrement parce que leurs ingénieurs sont minables non ? :D

  • Hello,
    OK, apparemment, il y a de l'incompréhension dans les deux sens. Premièrement, loin de moi l'idée de penser que PHP n'est pas un bon langage. Ca fait 12 ans que je développe en PHP (professionnellement - comprendre pour des clients ) et je maitrise plusieurs autres langages de développement (mais pas java). J'ai développé pour les besoin de mon entreprise un scraper qui récupère des métadonnées (uniquement) sur des sites internet. Cet outil a été développé en C# pour des raisons particulières : le scraper n'est qu'une petite brique d'un ensemble bien plus important qui se devait d'être développé en C#. J'avais préparé une série de tests au préalable en PHP. Les performances obtenues avec le C# et ses avantages propres au .NET Framework en font un outil particulièrement efficace. Cependant, je pense que le langage le plus performant et adapté pour développer un scraper ou un bot est le Python (voir à ce sujet l'excellent Scrapy). Il n'y a en effet pas de bon ou de mauvais langage de programmation mais des langages adaptés ou pas à ce que l'on veut faire.

    Concernant le https. C'est surtout l'explication dans votre article qui prétait à confusion et je me dis qu'il vallait mieux ne rien indiquer plutôt que d'écrire des erreurs.

    Au sujet de l'utf-8, encore une fois, j'ai al interprété votre article. Si c'est pour afficher au visiteur dans une page web le résultat et que vous le convertissez en utf-8, Ok on est d'accord. Par contre, il faut bien mentionner qu'en cas d'enregistrement des données récupérées (dans une base de données par exemple) il est absolument nécessaire de conserver les données telles qu'elles sont et d'enregistrer le charset du site visité. Si vous convertissez les données en utf-8 systématiquement à l'enregistrement, vous faussez toutes les analyses qui en découleront.
    Je vous rejoins sur le point qu'il n'y a pas de bon ou de mauvais encodage, il y a des encodages adaptés à certaines situation mais l'utf-8 permet quand même de faciliter la tâche aux développeurs (sauf avis contraire spécifique) et aux personnes qui devront faire face aux changements de langues sur un site. Convertir un site existant d'un charset à un autre, entraîne souvent des cascades de problèmes.

    • Salut,
      Voilà, je préfère ça déjà, j'ai l'impression que l'on se comprend mieux, c'était plus de l'ordre du quiproquo qu'autre chose. Je m'étais mal expliqué sur certains points, c'est vrai, c'est d'ailleurs tout le problème de vouloir être pédagogique avec des langages qui par définition ne sont pas les plus clairs du monde... :D

      Concernant le Python, j'en ai fait pas mal et je ne suis pas convaincu qu'il soit le plus adapté pourtant (enfin, pas plus que d'autres). De toutes façons, un langage "informatique" est sûrement plus adapté qu'un langage spécifiquement web comme le PHP, c'est pour cela que C#, Java, Python (...) peuvent aller plus en profondeur et plus rapidement. Le crawler que j'ai réalisé en PHP avec cURL est très efficace et fonctionne parfaitement (sur plusieurs niveaux de profondeur dans les listes de liens obtenus, etc.) mais il demande de la ressource (mais cela est normal pour un robot quand on commence à aller dans des profondeurs des sites web).
      Généralement, il met une petite minute à crawler plusieurs centaines de liens par site (pour ceux qui en ont autant) et plusieurs minutes pour des milliers de pages. Cela vous semble correct ou pas ?

      En fait pour l'encodage, il suffit de bien utiliser l'outil pour se rendre compte qu'on a pas fait du bon boulot. Si l'encodage est absent dans les en-têtes HTTP et dans le code HTML, nous savons que ce n'est pas bon et qu'il n'est pas précise. Dans ce cas, à chacun de penser à bien récupérer les données, sinon gare à la catastrophe comme vous le dîtes ! :D

  • Concernant les vitesses de crawl de notre outil, c'est difficile de comparer pour plusieurs raisons :
    Multithreading, matériel utilisé (et notamment la quantité de RAM).
    Une fois la page récupérée, la vitesse de traitement est influencée par le nombre d'informations que vous voulez traiter et comment vous les enregistrez.
    De manière générale et en moyenne on tourne aux alentours de 1000 pages / minutes (scrapées, informations triées et enregistrées, le tout sans doublon). Comme l'outil tourne depuis le début en version de développement et pas en version de production, je pense qu'au final on devrait tourner aux alentours de 2000 pages / minutes. Nos tests avec Scrapy montrait que Scrapy était plus rapide que notre outil, mais répondait moins à nos besoins.

    • Je pense que votre outil est donc un peu plus rapide que le mien, mais comme vous le dîtes, tout dépend de la configuration de départ et du serveur crawlé également. Je pense tourner autour des 500 URL / minute environ pour récupérer le crawl et la récupération de données, donc ça va en fait, je ne me plains pas trop pour un premier robot perso. :D

  • Freelance SEO dit :

    Beau boulot ! Et merci pour ce genre de cadeau. Cela sera l'occasion d'y apporter des éléments comme surligner les nofollow, les iframe, comptabiliser le nombre de liens externes, liste des H1, H2, H3 (un espece de recap finalement)... en bref tu permets de gagner pas mal de temps et chacun va pouvoir l'adapter à sa manière de fonctionner !
    Et je confirme que la colorisation est un point fort ;) !

    • Merci, c'est le but en effet de le réutiliser et de capter les informations qui nous conviennent. La colorisation permet d'y voir plus clair donc ça aide, il faudrait même aller plus loin pour que ce soit encore mieux ! :D

  • Merci pour cet avant goût.
    Le côté technique n'est pas souvent très maîtrisé, même par les professionnels.
    Une fausse idée que l'on doit abandonner, c'est de croire que le codage n'est attribué qu'aux webmasters. Non, il s'agit d'un point que tous les experts du web doivent maîtriser, ou avoir un minimum de notion, pour pouvoir se déclarer comme tel.

  • Nadhmi dit :

    Merci pour l'article, mais je pense que G a pris l'idée de votre tool :/ .

  • Merci pour cet article.
    Pour technique n’est pas souvent très maîtrisé, même par les professionnels.
    Une fausse idée que l’on doit abandonner, c’est de croire que le codage n’est attribué qu’aux webmasters.

  • Renaud dit :

    Bonjour,
    Est-ce que vous avez prévu une suite à cette article. Car le but est bien ensuite de le parser.
    J'imagine que la réponse est d'aller voir le livre :-) , mais c'est pour savoir s'il y aura une suite à ce billet.

    Cordialement,

    • Effectivement, il y a plus de codes comme celui-ci dans mon prochain livre (qui sort le 31 décembre 2014). Je n'ai pas prévu de suites pour l'article à dire vrai, je voulais juste donner une technique pour générer un simulateur de robot. :D

  • Déposer un commentaire

    L'adresse de messagerie ne sera pas publiée.* Champs obligatoires