Weboob : une version 1.1 pour son sixième anniversaire

Posté par . Édité par Benoît Sibaud et palm123. Modéré par tankey. Licence CC by-sa
Tags :
56
14
fév.
2016
Internet

Weboob (Web Outside Of Browsers) est une bibliothèque et un ensemble d'applications interagissant avec des sites web.

Plus d'un an après la sortie de la première version stable de weboob, nous sommes heureux de vous annoncer la sortie de weboob 1.1.

Pour rappel, weboob est une bibliothèque permettant d’accéder à près de 200 sites web en ligne de commande ou avec des applications graphiques spécialisées.

Débuté par un simple script permettant d'automatiser certaines actions sur un célèbre site de rencontre, c'est désormais une communauté conséquente (plus de 100 contributeurs depuis le début du projet), qui maintient quotidiennement l'ensemble des modules.

Depuis toutes ces années, weboob est devenu un hub interopérable permettant à de multiples applications de récupérer, croiser et présenter des données issus de sites tiers. Tant et si bien, qu'il est fort possible que vous ayez déjà utilisé weboob sans le savoir au travers des entreprises suivantes : Cozycloud, Budget Insight, Winancial, ou d'autres projets libres : Skrooge, Kmymoney, GTranslate, Gnome Shell, un greffon pour XMBC/Kodi, Kresus, hinance.

La nouvelle version 1.1 est exceptionnelle pour le projet. Le cycle de développement a duré plus d'un an (contre une moyenne entre 3 et 4 mois habituellement), et cette version inclut donc plus de 1200 commits écrits par 35 contributeurs. S'il n'y a pas de fonctionnalité impressionnante à mettre en avant, les changements sont très nombreux et cette dépêche se propose d'en évoquer quelques-uns.

Sommaire

Nouveautés depuis la 1.0

Cap sur le patrimoine

La récupération d'informations bancaires est une des premières fonctionnalités de weboob, et probablement la plus populaire en France. Il s'agit également de la capability la plus stable, de part les contributions importantes de Budget Insight (qui représentent 58% des commits de cette version).

Si tous les modules permettent depuis longtemps la récupération des comptes simples (comptes courants, comptes sur livret), seuls quelques modules permettaient de récupérer des informations plus détaillés sur des comptes financiers plus complexes (comptes titres et PEA, assurance vie, etc.). Cette fonctionnalité est désormais présente sur plus d'une dizaine de modules, et cette diversification a permis également d'améliorer la qualité des outils l'utilisant (meilleur affichage dans l'application boobank, meilleure documentation des champs récupérés, etc).

Des modules permettant de gérer des cartes de crédits (surtout pour les USA, avec notamment les cartes Amazon Store et Victoria's Secret) ont également fait leur apparition. Ces modules ont conduit à l'ajout de nouveaux attributs pour les comptes, comme la date du prochain paiement pour la carte de crédit, le montant minimal de paiement et la limite de crédit.

Enfin, l'épargne salariale se retrouve renforcée dans weboob avec le module s2e qui permet d'accéder aux informations des sites Esalia, Capeasi, BNP Épargne entreprise et HSBC Épargne entreprise.

Une commande « weboob »

La diversité des interactions possibles avec les sites web a conduit au développement de nombreuses applications (44 actuellement) dans le cadre de weboob. Leurs noms ne sont pas toujours simples à retenir, et il est courant pour un nouvel utilisateur d'installer Weboob puis de se demander quoi faire pour l'utiliser.

Dans le but d'améliorer cette première approche, une commande « weboob » permet à présent d'accéder facilement aux applications disponibles pour exploiter une capability (un ensemble de fonctionnalités communes, respectant une interface définie). Par exemple, weboob bank lancera boobank, et weboob video offrira le choix entre qvideoob et videoob. De plus, l'application permet de lister les capabilities disponibles.

Shopoob

En parlant d'applications et de noms à retenir, une nouvelle application a été ajoutée : [shopoob], vous permettant de lister et extraire vos commandes de sites marchands. Vous pouvez ainsi accéder au site d'Amazon, d'ideel, de MyHabit et de Victoria's Secret.

Exemple d'utilisation de shopoob avec Amazon

Du côté des développeurs

Asynchrone

Le support des requêtes asynchrones a été ajouté au Browser.

Concrètement, cela permet de faire des requêtes HTTP sans bloquer l'exécution, dans le but d'en faire plusieurs en parallèle. Pour cela, on utilise le module concurrent.futures rétroporté de Python 3. Le nombre de requêtes exécutées en parallèle peut être limité afin de ne pas surcharger le serveur distant.

Plusieurs modules utilisent déjà la fonctionnalité, notamment pour aller sur toutes les pages de détail d'une liste (ce qui est d'autant plus facilité par le filtre AsyncLoad). Le parcours en est devenu significativement plus rapide.

L'utilisation est très simple, au lieu de :

    page = browser.open(...)

On peut faire :

    page_future = browser.async_open(...)
    page = page_future.result()

Seul l'appel à result() est bloquant. Il est aussi possible de fournir un callback.

Quand on utilise les filtres, on peut faire :

    class iter_list(ListElement):
        class item(ItemElement):
            load_details = Link(...) & AsyncLoad  # URL de la sous-page à charger
            obj_truc = Async('details') & CleanText('./p[@class="truc"]')  # le filtre CleanText sera appliqué sur la sous-page récupérée

Des outils pour les API

Avec l'avènement des frameworks JavaScript tels que backbone.js ou angular.js, de plus en plus de sites web sont construits sous une forme d'API renvoyant du JSON. De même, beaucoup disposent d'applications mobiles qui interagissent avec une API.

Même si ça constitue une avancée inconsciente en terme d'accès aux données, puisqu'elles sont récupérées sous forme structurée, cela n'enlève pas l'intérêt de weboob, qui est d'agréger les informations depuis plusieurs sources et de les renvoyer dans un modèle de données unifié.

De fait, une classe APIBrowser a été rajoutée, ainsi que des filtres permettant de parser le JSON de façon similaire aux filtres CSS ou XPath.

Persistance des sessions

Les modules peuvent désormais sauvegarder leur état (page courante, cookies, ou plus si le module décide d'étendre le mécanisme) afin d'éviter de repasser par l'étape de connexion à chaque lancement. La fonctionnalité est encore à un stade expérimental, les modules devant être vérifiés auparavant.

L'intérêt initial était de permettre au module Boursorama de conserver le cookie validant l'authentification à deux facteurs (par confirmation SMS) imposée lors d'une connexion depuis un nouveau lieu.

Futur

La version 1.1 est la dernière à supporter Python 2.6. En effet, cette version est de plus en plus rare et est rarement testée. Cela permettra aussi d'améliorer la compatibilité avec Python 3.

La prochaine version 1.2 devrait sortir dans deux ou trois mois, de beaux changements sont déjà intégrés dans la branche de développement, notamment le portage à Qt5 de toutes les applications graphiques.

Soirée Weboob

Cela fait maintenant six ans que Weboob existe, et nous organisons comme il se doit une soirée pour réunir les membres de la communauté. Elle aura lieu lundi 15 février 2016 au Hall's Beer Tavern, à Paris. Plus d'informations sur l'agenda du libre.

Gâteau des cinq ans de weboob

Contributeurs

Merci aux contributeurs qui ont participé à cette version :

  • Alexandre Morignot
  • Baptiste Delpey
  • Benjamin Bouvier
  • Benjamin Carton
  • Caram Dache
  • Cédric Félizard
  • Christophe Lampin
  • Florent Fourcot
  • Grant Tzabro
  • Guilhem Bonnefille
  • James Galt
  • Jean-Philippe Dutreve
  • Johann Broudin
  • juliaL03
  • Julien Veyssier
  • Laurent Bachelier
  • Loic Bontonou
  • Lucas Nussbaum
  • Matthieu Weber
  • Mickaël Thomas
  • Mr Tchuss
  • nojhan
  • Oleg Plakhotniuk
  • P4ncake
  • Pierre-Louis Bonicoli
  • Pierre Mazière
  • Raphaël Rigo
  • Roger Philibert
  • Romain Bignon
  • RouxRC
  • Samuel Loury
  • Simon Muraïl
  • Vincent A
  • Vincent Paredes
  • Vincent Texier

Weboob est un projet qui grossit et qui vit grâce à ses contributeurs. Si vous souhaitez l’améliorer, que vous connaissiez le Python ou pas, n’hésitez pas à contribuer.

  • # Weboob dans la vie courante

    Posté par . Évalué à 10.

    J'utilise Weboob comme un bon élève (banque), mais plusieurs fois je me suis surpris à vouloir dumper des données sur un site web (exemple : la gestion des bugs au boulot) et j'ai de suite pensé à weboob.

    Est-ce qu'il y en a qui l'utilisent par exemple pour s'éviter le fameux parsing HTML que n'importe quel script doit se tenter à un moment ou à un autre ? Est-ce qu'on peut s'écrire un petit module/capability en 1h ou est-ce qu'il faut se plonger dans le hacking lourd ?

    • [^] # Re: Weboob dans la vie courante

      Posté par . Évalué à 10.

      Je n'utilise pas weboob, mais j'ai déjà utilisé leur browser (browser2) pour ce genre de choses et ça marche pas mal.

      Il y a une série de billet de blog en français sympa pour s'y mettre : https://people.symlink.me/~rom1/blog/weboob/Browser2_:_Introduction.html?view=blog

      Les logiciels sous licence GPL forcent leurs utilisateurs à respecter la GPL (et oui, l'eau, ça mouille).

      • [^] # Re: Weboob dans la vie courante

        Posté par . Évalué à 3.

        Merci pour le lien !

        Bon cela dit, je coinche un peu le "pour s'y mettre", vu qu'il est orienté "les nouveautés du Browser2". Vu que je connais pas le "Browser1", c'est pas tout à fait ce que je cherche.

        Mais yapuka mettre un peu les mains dans le cambouis, le fait de m'orienter sur Browser2 est déjà une bonne info.

        • [^] # Re: Weboob dans la vie courante

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

          Je confirme que c'est possible, nous sommes plusieurs à utiliser Browser directement pour des petits programmes jetables.

          Il y a sûrement un tutoriel à écrire, en attendant :

          from weboob.browser import URL, PagesBrowser
          from weboob.browser.pages import HTMLPage
          from weboob.browser.filters.standard import CleanText
          
          
          class MyPage(HTMLPage):
              def get_myinfo():
                  return CleanText('//my/xpath')(self.doc)
          
          
          class MyBrowser(PagesBrowser):
              BASEURL = 'http://www.mywebsite.com/'
          
              mypage = URL('mypage\.html', MyPage)
          
              def get_myinfo():
                  return self.mypage.stay_or_go().get_myinfo()
          
          b = MyBrowser()
          print b.get_myinfo()

          En bonus, activer le logging est très utile.

          import logging
          from weboob.tools.log import createColoredFormatter
          
          
          logging.getLogger('').setLevel(logging.DEBUG)
          fmt = '%(asctime)s:%(levelname)s:%(name)s' + \
                ':%(filename)s:%(lineno)d:%(funcName)s %(message)s'
          handler = logging.StreamHandler(sys.stderr)
          handler.setFormatter(createColoredFormatter(sys.stderr, fmt))
          logging.getLogger('').addHandler(handler)
  • # Soirée Weboob au HB.

    Posté par . Évalué à 2.

    Petite question d'orga, avez-vous privatisé la Taverne ?

    Sinon, je tombe sur cette annonce un peu tard et je vais voir pour me libérer. Si Roger Philibert en est, je ferais l'effort de ma présence.

    Enfin, juste pour dire que c'est un très bon projet, qui prend de l'ampleur. Bravo aux contributeurs.

    • [^] # Re: Soirée Weboob au HB.

      Posté par . Évalué à 6.

      La communauté parisienne de Weboob n'est pas (encore ?) assez grande pour privatiser la taverne :-) On a pu en tout cas y croiser plusieurs incarnations de Roger Philibert.

  • # Pub déguisée

    Posté par . Évalué à -10.

    Y'aurait moyen de ne pas rendre les liens vers des sites fermés non cliquables (voir de ne pas les citer).
    Sinon ceci s'apparente à du publi-reportage et devrait donc figurer dans les journaux.
    Ou alors toutes les boîtes qui utilisent git ont le droit de faire leur pub ici ?

    Merci !

    • [^] # Re: Pub déguisée

      Posté par . Évalué à 7.

      C'est quoi un site « fermé » ? Et un lien non cliquable ??

    • [^] # Re: Pub déguisée

      Posté par . Évalué à 9. Dernière modification le 15/02/16 à 18:41.

      1. C'est quoi un site fermé ? Un site qui n'existe plus ?
      2. C'est quoi un lien non cliquable ?
      3. Il y a pleins de dépêches faites par des employés concernant ceux qu'ils proposent. Généralement c'est bien accepté tant que c'est en rapport avec le libre notamment si l'entreprise dans le cadre de ce dont elle nous parle contribue à un ou plusieurs projet libre.

      Globalement je ne vois pas ce qu'il y a de gênant à montrer qu'une entreprise utilise du logiciel libre. C'est très bon pour les utilisateurs de logiciels libres comme toi.

      Les logiciels sous licence GPL forcent leurs utilisateurs à respecter la GPL (et oui, l'eau, ça mouille).

    • [^] # Re: Pub déguisée

      Posté par . Évalué à 10.

      Quelques petites précisions sur la rédaction de cette dépêche :

      • J'en suis l'auteur principal, et je ne suis lié à aucune des entreprises citées (il y a en plusieurs si tu regardes bien. Ce qui pour un publi-reportage est un peu con).
      • Quand je parle de « principal », c'est que je dois avoir rédigé peut-être 30% de la dépêche. Elle a été écrite en collaboration avec divers contributeurs du projet.
      • J'admets qu'il y a un problème sur le lien vers le Hall's Beer Tavern, on aurait du mettre du Openstreetmap. Mais je ne suis pas certain que ce soit le sens de ta remarque.
      • Toutes les entreprises citées (à l'exception du bar) fournissent du code sous license AGPL au projet. Faut-il arrêter de parler des contributions de Google, Facebook, et d'autres, dans les dépêches sur le noyau ?
      • [^] # Re: Pub déguisée

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

        J'admets qu'il y a un problème sur le lien vers le Hall's Beer Tavern, on aurait du mettre du Openstreetmap. Mais je ne suis pas certain que ce soit le sens de ta remarque.

        Corrigé, merci.

  • # Fini l'aigritude

    Posté par . Évalué à 4. Dernière modification le 15/02/16 à 21:41.

    Avant j'étais aigri, je devais passer par le nouveau site de la BNP Paribas et me perdre 5 minutes à chaque connexion pour retrouver l'historique de mon compte. Des cauchemars à foison et autant de cachetons. Maintenant, un petit

    boobank
    ls
    history 1

    et tout va bien dans le meilleur des mondes. La panacée serait de pouvoir faire en une seule commande boobank history numerocompte@bnporc comme indiqué sur la page http://weboob.org/applications/boobank mais ça ne fonctionne pas… J'ai peut-être mal interprété la commande ceci dit.
    Mais tout de même, merci. Mille mercis.

    • [^] # Re: Fini l'aigritude

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

      Pour voir l'ID à utiliser, il faut utiliser boobank en mode cli.

      $ boobank -b bnporc ls
                                      Account                     Balance    Coming
      ---------------------------------------------------------+----------+----------
                   XXXXXXXXXXX@bnporc CCHQ                         100.00
                   XXXXXXXXXXX@bnporc CSL                          100.00
                   XXXXXXXXXXX@bnporc LDD                         1000.00
                   XXXXXXXXXXX@bnporc CODEBIS                       10.00
      ---------------------------------------------------------+----------+----------
                                                         Total    1210.00       0.00
      

      Ensuite, il faut réutiliser l'un de ces ID dans ta ligne de commande :

      $ boobank history XXXXXXXXXXX@bnporc
       Date         Category     Label                                                  Amount 
      ------------+------------+---------------------------------------------------+-----------
       2016-02-15   Paiement Par Ovh Roubaix                                             -9.99
       2016-02-10   Prelevmnt    Free Mobile                                            -19.99
      

      Chez moi ça fonctionne plutôt bien.

  • # Filtres CSS ?

    Posté par . Évalué à 4. Dernière modification le 16/02/16 à 09:31.

    De fait, une classe APIBrowser a été rajoutée, ainsi que des filtres permettant de parser le JSON de façon similaire aux filtres CSS ou XPath.

    Justement, comment ça marche les filtres CSS ?

    Je suis en train de regarder par quoi remplacer mes scripts de scrapping qui traînent à gauche et à droite, en en réécrivant avec scrapy/weboob.browser. Et je dois dire que autant je préfère de loin le design général de weboob.browser, autant xpath me donne de l’urticaire. Par exemple, comment remplacer les sélecteurs xpath par des sélecteurs css dans l’exemple de la doc ?

    class ListPage(LoggedPage, HTMLPage):
        @method
        class get_accounts(ListElement):
            item_xpath = '//ul[@id="list"]/li'
    
            class item(ItemElement):
                klass = Account()
    
                obj_id = Attr('id')
                obj_label = CleanText('./td[@class="name"]')
                obj_balance = CleanDecimal('./td[@class="balance"]')

    (pourquoi xpath pue objectivement la merde pour le scraping ? parce que le sélecteur pour balance par exemple ne fonctionnera pas sur <td class="closed-account balance numeric">. En xpath pour sélectionner une classe c’est [@class and contains(concat(' ', normalize-space(@class), ' '), ' balance ')])

    M’enfin toujours est-il que j’arrive pas à trouver quelque chose qui se rapproche de la simplicité de la mini lib que je m’étais faite (qui a par contre l’inconvénient d’être mal testée et bugguée à mort), je trouve ça un peu décevant :(

    • [^] # Re: Filtres CSS ?

      Posté par . Évalué à 9.

      Salut,

      Pour utiliser un sélecteur CSS, tu peux faire :

      obj_balance = CleanDecimal(CSS('td.balance'))

      Sinon, dans weboob on a rajouté une fonction xpath has-class qui permet de faire :

      obj_balance = CleanDecimal('./td[has-class("balance")]')
    • [^] # Re: Filtres CSS ?

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

      On préfère historiquement le XPath car il est beaucoup plus puissant. Cependant dans les cas simples, c'est moche, et c'est plus difficile d'accès.

      À noter que l'on a ajouté la fonction has-class(class) au langage XPath, qui équivaut au .class des sélecteurs CSS. C'était de loin le plus gros défaut.

      • [^] # Re: Filtres CSS ?

        Posté par . Évalué à 3.

        Merci à vous deux pour vos réponses :)

        On préfère historiquement le XPath car il est beaucoup plus puissant. Cependant dans les cas simples, c'est moche, et c'est plus difficile d'accès.

        Pourquoi du coup ne pas avoir mis CSS par défaut et une fonction XPath quand on a besoin de cette puissance plutôt que l’inverse ?

  • # videoob

    Posté par . Évalué à 2.

    Bonjour,

    J'ai utilisé pas mal weboob pendant un temps, essentiellement pour videoob, mais j'eu de nombreux soucis avec les backends, du coup j'ai arrêté de l'utilisé. A noter que j'utilisais généralement la version des dépôts. C'est dommage, je trouvais que c'était très pratique. Par ailleurs, ça dérive un peu du sujet, mais un portage sur android serait top ;)

    Cordialement
    ```

  • # Uninstall ? Remove ?

    Posté par . Évalué à 2.

    Je voudrais refaire proprement mon installation weeboob et je m'aperçois que je ne trouve pas le moyen propre de faire une désinstallation.

    Pas vu la commande "uninstall" ou "remove" ou …. ni parmi les fichiers installés, ni sur le site Web de l'appli.

    Quelle est la bonne méthode (sachant que j'ai fait une install via ''./setup.py install'' (car pas de package sous Fedora) ?

    Merci

  • # Homebrew sous Mac non mentionnée ?

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

    Y a t'il une raison particulière pour laquelle l'installation de sous Mac via homebrew n'est pas mentionnée ?

Suivre le flux des commentaires

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