« Paie Ton Patch !™ » : Weboob – Partie 2/2

5.3 pages.py

C’est le gros du boulot puisque ces classes vont rechercher les éléments utiles dans le contenu de la page. Ce sont celles que l’on doit patcher lorsqu’un webmaster a un accès de créativité. Heureusement, cette tâche s’est considérablement simplifiée depuis Browser2.

Alors là, ça ressemble à de la magie pour qui n’est pas encore à l’aise avec les décorateurs de classe en Python. Nous déclarons une classe AdvertPage qui dérive de HTMLPage. Le décorateur @method indique que la classe déclarée en dessous (get_job_advert) sera appelée comme une méthode, et qu’elle sera au final une BaseJobAdvert dont nous remplirons les champs juste après. Les autres modules font ainsi, donc ça devrait fonctionner…

Contentons-nous pour l’instant de récupérer l’id, l’url (que l’on reconstruit à partir de l’id et de la regexp de l’URL) et l’intitulé du poste (title et job_name sont identiques) qui ô joie est le contenu de la balise title :

Rassurez-vous, ça se corsera pour les autres champs. Le filtre CleanText permet de nettoyer le texte des tabulations et autres retours à la ligne, et d’être sûr que le résultat est bien de l’Unicode. Nous lui passons en paramètre un sélecteur XPath indiquant la balise title.

Passons à la recherche. Les résultats sont groupés dans un div par catégorie, chacun contenant des balises a vers les annonces. Dans le lien nous trouvons par contre des infos mieux balisées que sur la page de l’annonce elle-même avec des span de classe job-title et job-company

De plus, les résultats sont retournés sur une page unique, nous n’aurons donc pas à gérer la pagination.

Ici aussi nous utiliserons un peu de magie décorative :

Là encore c’est une page HTML, mais des classes existent pour gérer le JSON, CSV, XML… et même des fichiers XLS et PDF !

La magie va opérer et sélectionner tous les éléments répondant au sélecteur item_xpath. Au passage, on me dit que l’on peut user de $x(‘//a…’) dans la console de Firefox pour tester les sélecteurs XPath en direct, pratique !

Notez l’espace dans le nom de classe du lien, elle doit être strictement égale. Une recherche dans le contenu aurait pu être demandée par a[contains(@class, « list-group-item »)], ou a[has-class(« list-group-item »)], mais c’est spécifique à Weboob. Incidemment, la correspondance stricte nous filtre des liens « Voir toutes les annonces pour… » qui elles n’ont pas l’espace en bout de chaîne…

Pour chaque item trouvé, un objet BaseJobAdvert est retourné par l’itérateur avec les propriétés récupérées par les filtres déclarés ici. L’id numérique est retrouvé dans l’URL de l’annonce par une Regexp.

Sans oublier les imports nécessaires au début du fichier, pompés sur popolemploi.

6. Ça marche ?

Une petite mise à jour du cache des modules :

Tentons une recherche :

Nous n’avons pas encore configuré de backend, c’est-à-dire une instance du module. Répondons-y pour sélectionner celui qui nous intéresse, et relançons la recherche avec l’option de debug et sans limiter le nombre de réponses :

Ça marche \o/ Enfin un boulot intéressant ?

Un peu succinct ! C’est normal, nous n’avons pas encore rempli tous les champs depuis la page de l’annonce. La commande info accepte la notation id@backend, ainsi que l’id seule puisque l’on force le backend avec -b.

7. Plus de champs

C’est maintenant que la facilité d’utilisation du framework va s’exprimer, sur la partie la plus tordue. Ajoutons la lecture de la date (en français et en toutes lettres) à iter_job_adverts :

Nous utilisons le filtre Date sur le texte nettoyé du span choisi, en précisant parse_french_date importé depuis weboob.tools.date pour lire notre date pas très standard. Et ça marche !

Passons à la page d’annonce. Les champs importants sont dans des balises h2, h4 ou même small dans quelques div imbriqués pas vraiment identifiés hormis par leur ordre d’apparition dans la page. Vous êtes dispensés de lire la documentation de XPath, voici les spoilers :

La société est en effet dans le premier h4 du lot. La date, elle, est préfixée par un « Ajouté le » sans espace à la fin… Nous précisons donc au filtre CleanText le remplacement à effectuer, puis nous utilisons encore une fois le parseur de date française. Le lieu est contenu dans le second h4, mais nous devons nous débarrasser de la catégorie entre parenthèses… Une Regexp s’en charge très bien. Quant à la description, c’est le 4ème div à droite, 1er div à gauche, on nettoie le HTML bien sûr, et c’est bon !


Les commandes Weboob ne se contentent pas d’afficher le résultat en texte brut. L’option -f permet de spécifier un formater, pour effectuer vos propres traitements. Par exemple :

 


8. Un test

Histoire de montrer que l’on n’oublie pas d’écrire le test.py (ben oui, on cherche du boulot…) :

Ce serait un comble de ne pas trouver d’annonce parlant de Linux ! Vérifions donc le test, ainsi que le style de codage :

9. PTP !

C’est le moment de payer, on crée un commit :

En vrai le commit-log serait plus long, mentionnant les fonctionnalités manquantes dans un second paragraphe. On en extrait un patch :

Le canal upstream documenté étant la liste de diffusion [8], il convient tout d’abord de s’y inscrire pour pouvoir répondre, puis laissons git envoyer le patch :

Avec un peu de chance, votre code sera accepté du premier coup. Sinon il faudra retenter après les corrections demandées.

Lorsque vous deviendrez un contributeur régulier, vous aurez probablement droit à votre propre dépôt sur le serveur, la pratique habituelle étant de proposer une branche pour fusion sur IRC ou la liste de diffusion.

Conclusion

Nous avons écrit et contribué à notre premier patch sur Weboob, ajoutant un module de recherche d’emploi presque complet, en utilisant les nouvelles possibilités du framework. Pour avoir déjà écrit quelques modules avant Browser2, la concision des filtres et leurs possibilités de composition rendent le code bien plus court et lisible.

Notez que Weboob est utilisé par plusieurs entreprises dans leur logiciel (Budgea, Cozy Cloud, etc.), et qu’il dispose même d’un support professionnel [9].

Enfin, sachez qu’en plus de contribuer au code, vous pouvez également soutenir les développeurs en devenant membre de l’Association Weboob [10] pour la modique somme de cinq euros.

Références

[1] Site officiel de Weboob : http://weboob.org/
[2] « Le job board du Logiciel Libre et de l’open source » : https://www.linuxjobs.fr/
[3] Canal IRC officiel de Weboob : irc://irc.freenode.net/#weboob
[4] Documentation développeurs : http://dev.weboob.org/
[5] Procédures d’installation : http://weboob.org/install
[6] Serveur git (dépôts officiels et personnels) : https://git.symlink.me/
[7] BACHELIER L., « Faster module creation for Weboob » : http://laurent.bachelier.name/2013/02/faster-module-creation-for-weboob/
[8] Liste de diffusion : http://lists.symlink.me/mailman/listinfo/weboob
[9] Support professionnel pour Weboob : http://weboob.com/
[10] Association Weboob : http://association.weboob.org/

Pour aller plus loin

Pour les anglophones voulant apprendre à contribuer sérieusement à des projets libres, il existe l’Upstream University : http://upstream-university.org/

François Revol
[Serial Patcheur, contributeur de plusieurs modules (europarl, gdcvault, vimeo) et de leurs icônes (oui, j’ai honte)]

Retrouvez cet article (et bien d’autres) dans GNU/Linux Magazine n°204, disponible sur la boutique et sur la plateforme de lecture en ligne Connect !

Laisser un commentaire