Crawler-Py

Introduction

C'est une librairie qui permet la récupération d'informations sur différents sites web. Elle est écrite en Python et utilise la librairie beautifulsoup4 pour le parsing HTML.
Les sites disponibles pour l'instant sont :

Sans plus attendre voici le lien des sources du projet ICI.

Pourquoi ?

Remontons en 2014, je devais attendre le train. Quoi de mieux que de regarder des sites inutiles sur son téléphone pour attendre. Et là ! c'est le drame, le site ne passe pas sur mon téléphone, un Samsung Galaxy Y. Le site VDM étant bourré de pubs et de Jquery non optimisé, le téléphone était incapable d'afficher le site. Pourquoi ne pas prendre l'application mobile Android VDM ? C'est très simple, ce téléphone n'avait que 180 Mo de mémoire interne, il était donc impossible d'installer l'application VDM.

En tant que développeur, j'ai donc créé cette petite lib sans prétention pour lire des vdms sur mon téléphone, puis je l'ai étendu pour d'autres sites. Etant un adepte du Python...

C'est ainsi qu'est né Crawler-Py

Que fait-elle ?

Elle retourne une liste d'article pour un site donné.
Il y a 3 modes:

Le mode aléatoire n'est pas géré par la librairie mais par le site lui-même.

Comment cela fonctionne-t-il ?

Pour commencer, il n'y a pas d'accès via un webservice ou autre chose. Je l'utilise comme un site normal, la librairie recupère la page via une requête HTTP GET, puis parse le contenu de façon à récupérer les articles.

Prenons un exemple, j'aimerais avoir les articles de la page aléatoire VDM. Il suffit pour la librairie de récupérer le contenu à l'adresse suivante http://www.viedemerde.fr/aleatoire. Puis le contenu récupéré est parsé pour avoir la liste des articles.

Ce qu'il faut savoir avant d'utiliser Crawler-Py, elle ne fait que lire le site, or les administrateurs peuvent en changer la structure, qui peut faire dysfonctionner Crawler-Py. Il est probable que je ne puisse pas mettre à jour la lib tout de suite.

Comment s'en servir ?

Généralités

C'est assez simple, il vous faut déjà installer beautifulsoup4. Avec Pip, cela ne devrait pas poser problème.

pip install beautifulsoup4
Je ne vais pas m'étendre plus sur l'installation.

Maintenant, voici le code pour récupérer les articles de la page aléatoire du site DTC. Il faut pour cela exécuter le code ci-dessous.

from crawlerpy.dtc import DtcCrawler
crawler=DtcCrawler()
reponse=crawler.page_random()

Nous importons le crawler DTC, ensuite il suffit d'appeler la bonne métode. La méthode renvoie un objet de type ResponseCrawler, qui contient un code d'erreur et les données. Pour les codes d'erreur, je vous renvoie à la doc string dans le code et au readme. Et les différents types d'objets dans le chapitre ci-dessous.

Les différents modes

Rappelez-vous, il y a trois modes : Page, Aléatoire, et Article. Nous avons vu avec l'exemple ci-dessus le mode aléatoire. Pour les autres modes, c'est presque pareil.

Le mode page

Nous voulons les articles de la page 4.

from crawlerpy.dtc import DtcCrawler
crawler=DtcCrawler()
reponse=crawler.page(3)

ATTENTION, la numérotation des pages commence à 0.

Le mode article

Cette fois-ci, je veux l'article e216fb846be3.

from crawlerpy.dtc import DtcCrawler
crawler=DtcCrawler()
reponse=crawler.article("e216fb846be3")

La librairie ne prend en charge que les identifiants d'articles qu'elle retourne.

Le mode aléatoire

Ce mode est assez spécial, car il y a deux méthodes.
Les voici

Voici un exemple ci-dessous.
from crawlerpy.dtc import DtcCrawler
crawler=DtcCrawler()
reponse_articles=crawler.page_random()
reponse_article=crawler.article_random()

Les objets

Pour expliquer à quoi sert tout ce petit monde, je vais passer par un exemple d'article de DTC.

L'objet ResponseCrawler

L'objet ResponseCrawler est l'objet renvoyé par une des méthodes vu ci-dessus.
Cet objet contient :

L'objet Article

Voici un objet article au complet.
Cet objet contient :

Il est possible que les champs publish_date et categorie soient null.
{
    "identifiant": "fge5g1z46h4e",
    "publish_date":null,
    "categorie":"quote",
    "sections": [
        {
            "id": "quote",
            "contents": [
                {
                    "type": "string",
                    "value": " Salut bidule o/"
                },
                {
                    "type": "string",
                    "value": " Salut Jo !"
                }
            ]
        }
    ]
}

L'objet Section

L'objet Section représente une partie de l'article, par exemple pour DTC cela pourrait être la quote et les commentaires.
Celui contient:

{
    "id": "quote",
    "contents": [
        {
            "type": "string",
            "value": " Salut bidule o/"
        },
        {
            "type": "string",
            "value": " Salut Jo !"
        }
    ]
}

L'objet Data

L'objet Data est constitué de 2 champs :

{
    "type": "string",
    "value": " Salut bidule o/"
}

Les codes d'erreurs

Il y aura principalement 3 types de code d'erreur même si ce sont des codes d'erreurs HTTP, sauf le dernier que j'ai ajouté pour l'api.

Code 200

Avec celui-là c'est le bonheur assuré, il n'y a pas eu d'erreur tout le long du traitement

Code 521

Celui-ci n'est un code d'erreur HTTP, mais il respecte les mêmes règles. Il est de la forme 5XX, c'est donc côté serveur que cela pose problème. Il représente une erreur de parsing, la lib n'a pas réussi à extraire les articles, cela peut etre dû à plusieurs problèmes, structure changé récemment par exemple.

Les autres

Tous les autres codes sont ceux du protocole HTTP

Conclusion

Vous avez toutes les connaissances en main pour utiliser cette lib. Le projet Sap-Server permet d'avoir un serveur web utilisant cette lib. L'API de ce serveur respecte la rfc rfc-sap qui essaye de normaliser tout ce qui est article et autre.