Analyse SEO – un robot pour le référencement

Voici un article plutôt technique mais la finalité de ce projet l’est beaucoup moins.

Un robot, crawler ou encore spider est un programme qui navigue sur un site web. Ça sert à beaucoup de choses, les moteurs de recherches s’en servent pour indexer les pages web, les spammeurs pour récupérer les adresses web qui trainent sur les pages.

Et moi, que pourrais-je bien en faire ?

La première fois que je me suis attaqué à la question c’était pour automatiser la participation à un concours à l’aide de PERL et Mechanize.

Aujourd’hui, c’est plus pour de l’analyse de site web. Oui, il y a plein d’outils en ligne pour cela, mais aucun vraiment complet et gratuit à la fois. Je vais utiliser Python et …

… la librairie à utiliser sera le premier point de cet article.

Logiciels nécessaires

Bibliothèques de crawl

Les forces en présence :

  • Lxml
  • html5lib
  • HTMLParser
  • htmlfill
  • Genshi
  • BeautifulSoup
  • Et sans doute encore d’autres.

Il s’agit là de librairie, BieautifulSoup semble la plus populaire suivi de pres par Lxml, mais Lxml est de loin le plus performant de la liste. Toutefois, afin de me simplifier la tâche j’ai choisir d’utiliser un framework, Scrapy.

Autres modules ou bibliothèques

Scrapy utilise Xpath pour extraire les informations des pages web, c’est bien pratique pour les balises et lorsqu’on sait ce que l’on cherche, titre de la page (balisesituée dans l’entête du document), liens (balises <a>), mais ce sera insuffisant pour détecter les autres liens, par exemple présents dans du javascript. Pour cela, je devrais utiliser des expressions régulières.

On récapitule :

  • Xpath (via Scrapy)
  • Expressions régulières (disponible par défaut)

Installer Scrapy

Pour réaliser les tests présentés dans cet article j’utilise mon RaspberryPi, ceci est important car d’une plateforme à l’autre l’installation de Python et les modules présents par défaut peuvent différer. Pour installer Scrapy, la documentation préconise l’une des commandes suivantes :

  • pip install Scrapy
  • easy_install Scrapy

Pip et Easy_install sont deux modules permettant d’installer facilement et proprement d’autres modules Python, hélas aucun des deux ne fonctionne :

>>> pip install Scrapy
 File "", line 1
 pip install Scrapy
 ^
SyntaxError: invalid syntax

>>> easy_install Scrapy
 File "",
 line 1 easy_install Scrapy
 ^
SyntaxError: invalid syntax

Une fois scrapy installé, il vous faudra installer 3 autres bibliothèques (si elles ne le sont pas déjà sur votre système :

  • Twisted
  • w3lib
  • Lxml

Voilà, c’est fait, passons à la suite.

Initialiser un projet

Avec Scrapy, ça se passe ainsi :

scrapy startproject nom_du_projet

Et pour le reste du démarrage avec, voici un tutoriel Scrapy en VO sur le site officiel et une présentation de démarrage en français.

Il faudra ensuite procéder à quelques petits réglages :

  1. rendre le user-agent aléatoire ;
  2. rendre aléatoire le délai entre deux requêtes ;
  3. suivre ou non les règles du fichier robots.txt.

Configurer Scrapy

Rendre le user-agent aléatoire

Pourquoi rendre le user-agent aléatoire ? Bien sûr il faut savoir ce qu’est un user-agent, si ça ne vous dit rien vous pouvez sauter ce chapitre.

En fait, je ne suis pas sûr que ce soit toujours nécessaire. Tout dépends de du site que vous auditez.

S’il s’agit d’un petit site, vous pouvez ne pas vous soucier du user-agent.

Sur un gros site, deux possibilités, vous avez à faire à un client dont le principal intérêt est :

  • La sécurité
  • Le référencement / marketing

Client orienté sécurité

Dans le premier cas, il y a fort à parier que le site est blindé et qu’un inventaire rapide et exhaustif ne passe pas. Chez ce genre de client, discuter avec le service technique peut prendre beaucoup de temps, plus que l’inventaire en lui-même.

Dans ce cas, la ruse est le meilleur recours. En modifiant le user-agent, on simule des utilisateurs différents.

Pour aller plus loin, on pourrait également faire tourner les adresses IP mais ça devient compliqué, ajouter à cela qu’il faut soit payer les proxies, soit se contenté de la médiocre qualité des proxies gratuits glanés çà et là sur internet.

Voici quand même quelques solutions pour les plus courageux :

Client orienté référencement / marketing

Pour le moment, je ne vous ai présenté que les avantages des méthodes ci-dessus, mais le revers de la médaille c’est que ceci fausser vos statistiques.

Sur un très très gros site ceci passer peut-être inaperçu, mais imaginons que vous ayez à cœur de ne pas polluer les statistiques de votre client, dans ce cas, il serait préférable d’utiliser un IP unique et/ou un user-agent spécifique facilement repérable pour les écarter des stats.

Par défaut Scrapy indique son nom dans le user-agent, mais il est aussi possible de le définir manuellement.

User-agent dynamique dans la pratique

J’ai utilisé le code à l’adresse suivante : https://github.com/svetlyak40wt/scrapy-useragents

Marche à suivre rapide :

1. Copier le code suivant

DOWNLOADER_MIDDLEWARES = {
 # we'll turn off standart user agent middleware
 'scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware': None,
 'scrapy_useragents.middleware.UserAgentsMiddleware': 400,
}

Dans le fichier settings.py

2. Dézipper les fichiers

et placer le dossier scrapy_useragents dans votre projet (attention j’ai bien dis scrapy_useragents et non scrapy-useragents).

3. Récupérer une liste de user-agent

Pour ma part, j’ai utiliser les 10 derniers user-agent présent sur le site who is hosting this et copier les dans un fichier user-agents.txt que vous placerez au même endroit que le dossier scrapy_useragents (et non pas dans ce dernier).

Rendre aléatoire le délai entre deux requêtes

Toujours dans l’idée de passer inaperçu, et avec l’avantage de moins solliciter le serveur, je vous conseille de définir un temps minimal entre chaque requête, pour ma part, j’ai choisi 750 millisecondes.

Dans la pratique, on réalise ceci en ajoutant la ligne

DOWNLOAD_DELAY = 0.75

Dans le fichier settings.py

Oui bon là, je n’ai fait que définir un laps de temps entre deux requêtes, mais alors comment faisons-nous pour avoir un délai aléatoire ?

Réponse : nous ne faisons rien, par défaut Scrapy choisis un délai situé entre 0,5 et 1,5 DOWNLOAD_DELAY.

Suivre ou non les règles du fichier robots.txt

Selon le cas de figure, on pourra choisir d’observer ou d’ignorer les règles du fichier robots.txt :

  • Si vous les ignorer, vous verrez le site comme le voit un moteur de recherche.
  • Si vois les ignorer, vous aurez un comportement plus proche de celui d’un visiteur.

Encore une fois notre amis settings.py entre en jeux, il suffit de lui ajouter la ligne ci-dessous pour suivre les règles du robots.txt (par défaut, elles sont ignorées) :

ROBOTSTXT_OBEY = True

Le spider

Le fichier nom_de_votre_projet.py dans le dossier spiders de votre projet va contenir :

  1. Le domaine à crawler et la page de départ ;
  2. Les fichiers autorisés et ceux qui ne le sont pas ;
  3. Les actions à effectuer pour chaque fichier trouvé.

Là aussi pour les détails, je vous renvoie à la documentation de Scrapy et plus particulièrement la page sur les spiders.

Le résultat attendu

Pour chaque page

  • Code de réponse HTTP (200, 404, 500, etc.)
  • Temps de réponse
  • Descriptions mots-clefs et autre balises <méta>
  • Titre de la page (rien à voir avec les balises <h…>
  • Type mime
  • Titre de niveau 1 à 6
  • Contenu des balises <strong> et <em>
  • Liste de tous les mots de la page et leur fréquence

Pour chaque lien interne ou externe

  • Destination (href)
  • Texte cliquable
  • Cible (target)
  • Relation avec la cible (rel)
  • Titre

Pour chaque ancre

  • Nom
  • Texte

Pour chaque image

  • Source
  • Texte alternatif
  • Titre
  • Largeur
  • Hauteur
  • Poids
  • Type du fichier
  • Type mime

Et tout ça dans un fichier CSV.

Pour aller plus loin :

  • Favicon
  • Pagerank
  • Auteur / author rank
  • Télécharger image
  • Temps de réponse
  • Recherche d’élément proscrit font, style en ligne, etc.
  • Recherche de structure de liste mal formée.
  • Interroger dmoz
  • rapport entre la taille des images et leur taille d’affichage dans le HTML.
  • CSS Javascript, nombre.

Récupération des données

La récupération des données s’effectue à l’aide de Xpath comme je l’ai dit en début d’article.

Xpath est une façon de naviguer dans un document XML, ça fonctionne aussi dans un document HTML.

En gros, soit on fournit un chemin pour sélectionner un objet précis type :

"/html/head/title/text()"

Pour sélectionner le titre de la page.

Soit on demande à récupérer tous les éléments partageant des caractéristiques communes type :

"//a[@rel="follow"]"

Pour sélectionner tous les liens d’une page qui ont l’attribut rel= »follow », ça fonctionne aussi avec les classes CSS.

Il n’y a plus qu’à faire cela pour tous les éléments sus-cités.

Bien entendu, il ne sera pas possible de récupérer tous les éléments de cette manière par exemple la taille ou le poids des images.

Les items

Le codes précédents à pour but d’extraire les données que nous souhaitons conserver. Mais justement, où les concevrons nous ?

Dans des items, il s’agit d’une spécialité de Scrapy. Celle-ci est bien pratique car comme nous le verrons ensuite, elle nous permettra d’exporter les données sous différents formats avec le moins de travail possible

L’export

Comme je l’ai dit au début du chapitre précédent, Scrapy permet d’exporter les items dans différents formats :

  • Json
  • XML
  • CSV

 

 

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.