Crowl, un crawler SEO open-source

Posté par (page perso) . Édité par Nils Ratusznik, Davy Defaud, Benoît Sibaud et palm123. Modéré par Pierre Jarillon. Licence CC by-sa.
39
28
août
2018
Python

Crowl est un projet de développement d’un crawler SEO collaboratif sous licence GPL v3. Développé en Python et basé sur le cadriciel Scrapy, Crowl a pour but de fournir aux professionnels du référencement un outil simple, robuste et innovant pour répondre à des besoins non couverts par les outils actuels.

À quoi sert un crawler SEO ?

Crawler, spider, scraper ou robot d’indexation : quel que soit le nom qu’on leur donne, de nombreux robots parcourent le Web et réalisent différentes tâches. La plupart du temps, il s’agit de récupérer des informations sur les pages Web et de les stocker.

Pour les professionnels du SEO, le modèle est Googlebot : la famille de robots d’indexation de Google. Ces robots parcourent chaque jour des dizaines de milliards de pages Web. Mais les besoins d’un moteur de recherche ne sont pas les mêmes que ceux d’un référenceur : là où le premier doit parcourir le Web dans son intégralité, le second cherche à optimiser un seul site (à la fois).

Les informations récupérées sont variables, mais on s’intéressera au statut HTTP des pages, à leur contenu ou encore aux liens qui les relient. Ces informations permettent ensuite de réaliser différentes analyses et de définir les chantiers d’optimisation du site concerné. Il peut s’agir de problèmes simples (liens cassés, redirections inutiles, pages dupliquées…) ou d’analyses plus complexes (répartition de la popularité interne, pertinence du contenu…).

Yet another crawler?

De nombreux outils existent sur le marché, mais la plupart sont commerciaux ou obsolètes. Par ailleurs, ils sont souvent limités d’une manière ou d’une autre dans leur fonctionnement. Bon nombre sont limités quant au volume de pages à traiter, ou aux informations qu’il est possible de récupérer.

Ainsi, il n’est pas rare que des référenceurs se lancent dans la conception d’un crawler pour dépasser ces limitations. Malheureusement, ce sont souvent des initiatives isolées, et « crawler » le Web n’est pas aussi simple qu’il n’y paraît.

Au fil de discussions avec quelques confrères, nous avons réalisé que nous étions plusieurs à travailler sur les mêmes problématiques en parallèle. Afin de mettre nos efforts en commun, nous avons décidé de lancer un projet open source, dans l’espoir d’attirer d’autres contributeurs.

Comment fonctionne Crowl

Crowl est basé sur Scrapy, un cadriciel Python qui permet d’extraire facilement des données depuis les sites Web. C’est une excellente base de départ, d’autant plus que Python est un langage facile d’accès et déjà utilisé par de nombreux référenceurs, notamment pour ses capacités en science des données. Cependant, Scrapy n’est pas pensé pour répondre aux besoins d’un crawler SEO et demande un certain nombre de configurations et d’adaptations.

En l’état, Crowl propose donc un projet Scrapy configuré pour les besoins génériques des référenceurs. Il est capable de parcourir l’intégralité d’un site Internet et de stocker les informations utiles dans une base de données MySQL.

Nous proposons en outre une méthode de calcul du poids des liens sortant d’une page Web, basée sur leur hauteur respective dans le code source. Ceci permet le calcul d’un PageRank interne plus précis, car les liens en pied de page sont ainsi dévalués.

Feuille de route et perspectives

Si l’outil est déjà opérationnel, il reste très basique pour l’instant. Nous avons déjà de nombreuses idées pour l’améliorer, qui seront mises en place au fil du temps et de la disponibilité des contributeurs.

Parmi ces idées, on peut citer le choix de multiples options de sauvegarde des données en plus de MySQL, la configuration des options au moyen d’un fichier de configuration, ou encore la création d’une interface utilisateur pour lancer les crawls et en analyser les résultats.

L’objectif est de séparer les principales fonctionnalités en une suite de modules indépendants pour traiter :

  • le crawl en lui‐même ;
  • les traitements post‐crawl ;
  • les interfaces de lancement et d’analyse d’un crawl.

Toute contribution est la bienvenue, y compris de la part de personnes qui ne sont pas issues du milieu du SEO : les contributeurs actuels n’étant pas des développeurs professionnels, nous sommes preneurs des conseils de personnes plus aguerries.

Aller plus loin

  • # bravo

    Posté par . Évalué à 1.

    Très belle initiative.

    • [^] # Re: bravo

      Posté par (page perso) . Évalué à 2.

      Merci :-)

    • [^] # Re: bravo

      Posté par . Évalué à 2. Dernière modification le 31/08/18 à 12:45.

      Youpee, encore un énième scrapy qui va bouffer nos ressources pour permettre à d'autres de se faire de l'argent sur notre dos.
      Et comme la plus part des trucs basé sur scrapy, le robot.txt à l'air d'être un truc OSEF.

      J'espère que vous avez au moins mis un user-agent par défaut histoire qu'on puisse bloquer les plus noobs.

      Donation : 1N8QGrhJGWdZNQNSspm3rSGjtXaXv9Ngat (Bitcoin | Bitcoin Cash)

      • [^] # Re: bravo

        Posté par (page perso) . Évalué à 7.

        Bonjour,

        Youpee, Crowl respecte par défaut le robots.txt !
        Youpee, Crowl possède par défaut un user-agent spécifique !

        Youpee, le but d'un crawler SEO c'est d'analyser un site pour le faire progresser et donc de vous faire gagner plus d'argent !

        Bonne journée ;)

  • # Quelles sont les informations utiles ?

    Posté par (page perso) . Évalué à 4.

    En l’état, Crowl propose donc un projet Scrapy configuré pour les besoins génériques des référenceurs. Il est capable de parcourir l’intégralité d’un site Internet et de stocker les informations utiles dans une base de données MySQL.

    J'avais testé des outils en mode SAAS permettant de faire ce travail et donc de proposer des pistes d'amélioration, de détecter des faiblesses, etc.

    Quelles sont les informations utiles remontées par Crowl ?

    Nous proposons en outre une méthode de calcul du poids des liens sortant d’une page Web, basée sur leur hauteur respective dans le code source. Ceci permet le calcul d’un PageRank interne plus précis, car les liens en pied de page sont ainsi dévalués.

    Je ne suis pas certain de comprendre ce paragraphe (le "poids des liens sortant" m'induit peut-être en erreur). Ce que fait Crowl, c'est de calculer le PageRank des pages internes en fonction de la position des liens qui pointent vers cette page ? Genre si j'ai un lien "créer un compte" dans le header et que ce bouton pointe vers la page "/account/new", cela donnera un bon PageRank à la page de création de compte, ce qui permet de déterminer si les pages que l'on doit mettre en valeur sont bien celles qui sont effectivement mises en valeur. C'est bien ça ?

    • [^] # Re: Quelles sont les informations utiles ?

      Posté par (page perso) . Évalué à 5.

      J'avais prévu de compléter le commentaire précédent suite à mes tests, mais finalement, comme j'ai testé en même temps OpenDBViewer 1.1.0 le résultat a pris la forme d'un journal qui relate mes manipulations Crowl & OpenDBViewer.

      • [^] # Re: Quelles sont les informations utiles ?

        Posté par (page perso) . Évalué à 2.

        Bonjour et merci pour ce retour d'expérience.

        L'outil est encore à un stade peu avancé, et nous avons quelques éléments à régler (dont l'affichage plus clair de la base de données créée).

        Les données collectées pour l'instant sont celles que l'on trouve dans la base de données, comme expliqué dans votre journal :-)
        Nous ajouterons bientôt de nouvelles informations, ainsi qu'un export en CSV pour que ceux qui le souhaitent puissent se passer de MySQL.

        Concernant le PageRank, Crowl n'en effectue pas le calcul, mais collecte les données nécessaires pour le faire. Il "suffit" ensuite de créer un graphe du site parcouru à l'aide de la table des liens, pour ensuite calculer le PageRank. Des librairies, comme iGraph ou Networkx en Python par exemple, permettent de le faire en quelques lignes de code. Et ce calcul peut se faire de manière simple (tous les liens ayant le même poids) ou en pondérant les liens (d'où le calcul d'un poids, ici basé sur la hauteur du lien dans le code source de la page source).

    • [^] # Re: Quelles sont les informations utiles ?

      Posté par . Évalué à 5. Dernière modification le 31/08/18 à 10:52.

      Le pagerank repose grossomodo sur le nombre de pages pointant vers la page considérée. Là ils introduisent un pondération partant du principe que plus ce lien est bas dans la page source moins ce poids est important.
      Exemple, si toutes les pages d'un site ont en bas de page un lien vers la page "contact", le pagerank de la page "contact" est très élevé. Mais avec cette pondération, comme ce lien est en bas, le pagerank est réduit.
      Il y aussi une approximation qui dirait que bas de page est environ lié à fin de code source bien que en pratique, CSS et JS peuvent rompre ce lien.

  • # Problème avec python 3.7?

    Posté par . Évalué à 1. Dernière modification le 03/09/18 à 19:22.

    Bonjour,

    Je suis assez intéréssé par votre project et j'aimerai bien contribuer, cependant je n'arrive pas a le faire tourner.

    A l'installation des dépendances python, reppy 0.4.9 génère des erreurs lors de la compilation(gcc 8.2).
    J'ai donc installé la dernière version à la place.

    Et au lancement de crowl, scrappy démarre bien mais twisted n'a pas l'air content du tout!

    $python crowl.py -l -c -u https://www.algoo.fr/ -b algoo
    2018-09-03 17:34:12 [scrapy.utils.log] INFO: Scrapy 1.5.0 started (bot: scrapybot)
    2018-09-03 17:34:12 [scrapy.utils.log] INFO: Versions: lxml 4.2.1.0, libxml2 2.9.8, cssselect 1.0.3, parsel 1.4.0, w3lib 1.19.0, Twisted 18.4.0, Python 3.7.0 (default, Jul 15 2018, 10:44:58) - [GCC 8.1.1 20180531], pyOpenSSL 18.0.0 (OpenSSL 1.1.0h  27 Mar 2018), cryptography 2.2.2, Platform Linux-4.14.67-1-MANJARO-x86_64-with-arch-Manjaro-Linux
    2018-09-03 17:34:12 [scrapy.crawler] INFO: Overridden settings: {'CONCURRENT_REQUESTS': 5, 'DEPTH_PRIORITY': 1, 'DOWNLOAD_DELAY': 0.5, 'LOG_LEVEL': 'INFO', 'RETRY_ENABLED': False, 'ROBOTSTXT_OBEY': True, 'SCHEDULER_DISK_QUEUE': 'scrapy.squeues.PickleFifoDiskQueue', 'SCHEDULER_MEMORY_QUEUE': 'scrapy.squeues.FifoMemoryQueue', 'USER_AGENT': 'Crowl (+https://www.crowl.tech/)'}
    Traceback (most recent call last):
      File "crowl.py", line 118, in <module>
        process.crawl(Crowler, **conf)
      File "/usr/lib/python3.7/site-packages/scrapy/crawler.py", line 170, in crawl
        crawler = self.create_crawler(crawler_or_spidercls)
      File "/usr/lib/python3.7/site-packages/scrapy/crawler.py", line 198, in create_crawler
        return self._create_crawler(crawler_or_spidercls)
      File "/usr/lib/python3.7/site-packages/scrapy/crawler.py", line 203, in _create_crawler
        return Crawler(spidercls, self.settings)
      File "/usr/lib/python3.7/site-packages/scrapy/crawler.py", line 55, in __init__
        self.extensions = ExtensionManager.from_crawler(self)
      File "/usr/lib/python3.7/site-packages/scrapy/middleware.py", line 58, in from_crawler
        return cls.from_settings(crawler.settings, crawler)
      File "/usr/lib/python3.7/site-packages/scrapy/middleware.py", line 34, in from_settings
        mwcls = load_object(clspath)
      File "/usr/lib/python3.7/site-packages/scrapy/utils/misc.py", line 44, in load_object
        mod = import_module(module)
      File "/usr/lib/python3.7/importlib/__init__.py", line 127, in import_module
        return _bootstrap._gcd_import(name[level:], package, level)
      File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
      File "<frozen importlib._bootstrap>", line 983, in _find_and_load
      File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
      File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
      File "<frozen importlib._bootstrap_external>", line 728, in exec_module
      File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
      File "/usr/lib/python3.7/site-packages/scrapy/extensions/telnet.py", line 12, in <module>
        from twisted.conch import manhole, telnet
      File "/usr/lib/python3.7/site-packages/twisted/conch/manhole.py", line 154
        def write(self, data, async=False):
                                  ^
    SyntaxError: invalid syntax

    Une idée pour régler ça?
    (Je suis sous manjaro)

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.