À propos de BadAngle

BadAngle est un outil que j’ai codé avec Python pour extraire des informations du site de petites annonces leboncoin.fr. Comment fonctionne-t-il et quelles sont ses limites, ses possibles améliorations?

BadAngle est un outil que j’ai codé avec Python pour extraire des informations du site de petites annonces leboncoin.fr.
Le code est disponible sur Github ou sur git.framasoft.org.

Pourquoi?

D’abord pour le fun. Parce que programmer est amusant.
Pour le défi. Parce qu’analyser un site web pour en extraire des données, ça peut être compliqué. Il y a tout un processus plaisant derrière: dégrossir l’information, comprendre sa structure, affiner, affiner jusqu’au résultat qu’on souhaite, en tenant compte des erreurs possibles.
Pour l’apprentissage: mine de rien, il faut apprendre à faire un parseur, parfois gérer l’encodage. Il faut trouver la meilleure façon de structurer les données, de les exporter dans des formats différents.

Challenge accepted

Comment ça fonctionne, ou comment j’ai codé la chose

BadAngle est composé de trois éléments de code principaux et de quelques données prédéfinies.

Le solveur d’adresse

Pour récupérer des informations du site leboncoin, il faut déjà s’assurer qu’on analyse la bonne page. En l’occurrence, leboncoin est un site dont les URLs sont particulièrement logiques: ainsi on peut aisément déduire quelle sera l’URL de la page correspondant aux paramètres (région, département, catégorie de la recherche, phrase de recherche, page).
http://www.leboncoin.fr/CATEGORIES/offres/
http://www.leboncoin.fr/CATEGORIES/offres/?q=RECHERCHE
http://www.leboncoin.fr/CATEGORIES/offres/REGION/
http://www.leboncoin.fr/CATEGORIES/offres/REGION/?q=RECHERCHE
http://www.leboncoin.fr/CATEGORIES/offres/REGION/DEPARTEMENT/?q=RECHERCHE
http://www.leboncoin.fr/CATEGORIES/offres/REGION/DEPARTEMENT/?q=RECHERCHE
http://www.leboncoin.fr/?o=PAGENUMBER
http://www.leboncoin.fr/?q=RECHERCHE&o=PAGENUMBER
Tous les cas d’adresses possibles pour leboncoin.fr

Le solveur de paramètres de recherche

Le Bon Coin permet de faire des recherches plus fines que par seule recherche dans la région, le département − en remplissant un formulaire. Pour chaque catégorie de recherche, il faut donc noter à quel type correspond chaque paramètre du formulaire: une sélection ou une case à cocher. Même si en pratique, il y a deux type de sélection, mais c’est de la cuisine, OSEF. Après quoi, on crée une fonction qui construit une chaîne de caractères avec les options au format compréhensible par le site.

De quoi faire une URL valide (enfin)

Pour obtenir une URL valide, on utilise le solveur d’adresse, puis le solveur de paramètres de recherche si besoin. On concatène (additionne) les résultats, et voilà, on a une adresse à analyser.

L’analyseur / Parseur

Pour analyser la page web obtenue, on fait une requête HTTP pour obtenir son code source. Puis on charge un parseur de transformer ça en données convenables. En l’occurrence, le parseur HTML de la librairie standard de Python suffit.
Le parseur enregistre une liste dont chaque élément est un dictionnaire correspondant à une annonce.
{
    "url":None,
    "title":None,
    "date":[],
    "images":{"cover":[],"number":0},
    "placement":[],
    "category":None,
    "price":[]
}
Une annonce vide.

Et après?

On a récupéré les données, alors BadAngle peut les renvoyer directement à un autre programme utilisant Python. Sinon, on peut demander au parseur de renvoyer les données en JSON ou XML, avec quelques options pour ces formats là (indentation…).
Pour plus de simplicité pour l’utilisateur, on crée une nouvelle fonction faire la recherche et l’extraction − plus d’appel manuel aux fonctions de construction d’URL et au parseur. Au final, le code d’une extraction peut ressembler à ça:
import badangle_search as lbc

results = lbc.search(
    category="offres_d_emploi",
    options={"type_de_contrat":"cdd"},
    region="bretagne",
    department="morbihan",
    return_format = "json"
)
Rechercher n’importe quel CDD en Bretagne>Morbihan et obtenir le résultat en JSON

Limites

  • BadAngle ne sert qu’à extraire des données. Il ne permet pas d’en entrer, de les trier. Ce n’est pas son rôle. Le tri de pertinence des annonces est exclusivement fait par le serveur du site.
  • La qualité du code de BadAngle est améliorable, mais BadAngle ne permettra jamais autant d’efficacité et de rapidité pour extraire des données qu’un accès direct à la base de données du site.

Améliorations possibles

  • Il faudrait sans doute s’intéresser à Beautiful Soup pour le côté HTML.
  • Au lieu d’enregistrer les pages pour les fournir à l’analyseur, il serait sans doute plus propre de les transformer en StringIO.

Aucun commentaire.