entrepreneur-interet-general / OpenScraper

An open source webapp for scraping: towards a public service for webscraping
http://www.cis-openscraper.com/
MIT License
93 stars 22 forks source link

Proposition de design alternatif #58

Open DavidBruant opened 5 years ago

DavidBruant commented 5 years ago

Description du problème

Cette section ne décrit que ce que j'ai compris du problème. J'invite les lectrice.eur.s à compléter avec ce que je n'ai pas compris

Le Carrefour des Innovations Sociales (CIS) est un moteur de recherche qui recence les projets d'innovations sociales en France\ Plutôt que de composer sa base de données ex nihilo, le CIS est composé d'un collectif de partenaires (environ 30 actuellement, nombre en croissance) qui fournissent les données\ Plutôt que d'essayer de demander à chaque partenaire sa base de données, puis de travailler à l'uniformiser, la stratégie adoptée par le CIS a été de scrapper les sites des partenaires afin de composer rapidement le moteur de recherche Afin que le moteur de recherche soit à jour, le scraper doit être lancé régulièrement automatiquement

OpenScraper se veut être le morceau de la solution qui va chercher les données chez les partenaires et les uniformise avant traitement puis affichage

Description de la solution actuelle

OpenScraper contient un client et un serveur\ Le serveur stocke dans une base de données MongoDB :

Le serveur fait aussi tourner le scraper

Le client n'est qu'une interface utilisateur qui rend plus agréable de configurer open scraper, décider quand lancer un scrapping, prévisualiser le résultat, mais n'a pas de code "intelligent"

Singularités

OpenScraper hardcode l'idée que l'on sera toujours dans une des deux configurations :

Les Xpath fournis sont appliqués à la fois sur la "page listing" et la "page projet", donc les données sont mélangées si les XPath s'appliquent dans les deux cas (comme dans le site de Coorace)

Les mêmes Xpath sont appliqués à toutes les pages sans exceptions possibles

Une spider est un document dans une base de données Mongo\ Entre autres choses, cela signifie qu'elle est dépendante d'une version d'OpenScraper et aussi qu'elle n'est pas versionnée par défaut (contrairement à si la spider était un fichier de code Python ou autre)\ Le code des spider est unique et stocké dans masterspider.py (actuellement ~1400 lignes de code)

Process de création et modification de spider

  1. Créer une version locale d'open scraper
  2. Créer le même modèle de données qu'en production (manuel) (une seule fois)
  3. Configurer la spider
  4. Tester jusqu'à être satisfait du résultat
    1. Modifier les XPath
    2. Changer le code d'OpenScraper (masterspider.py) si le site ne correspond pas aux pré-supposés hardcodés
    3. Lancer la spider "en mode test"
    4. Lancer la spider "pour de vrai"
  5. Copier la spider en production (manuel)

Pour la modification, pareil que le process de création à part que 3 est une copie manuelle de la version en production

Dans les deux cas, le gros du temps est passé dans l'étape 4

Dangers associés à utiliser le même code pour toutes les spiders

L'étape 4.2 n'est pas systématique, mais est nécessaire dès que l'on cherche à scrapper un site qui ne correspond pas aux pré-supposés du fichier masterspider.py. Cela arrive toutefois assez régulièrement et il est impossible de prévoir quel nouveau site va nécessiter de modifier à nouveau masterspider.py

Chaque nouveau cas est souvent résolu par l'ajout d'une nouvelle option dans l'interface de configuration de la spider. La liste des options est condamnée à ne faire que croître sans que personne ne puisse savoir jusque quand, car enlever une option pourrait casser une spider dépendant de cette option

De par le fait que masterspider.py est le même code utilisé pour toutes les spiders, le modifier est un exercice périlleux, car le modifier pour faire marcher une spider comporte le risque de casser une ou plusieurs autres spiders. Ce risque pourrait être réduit par la présence de tests automatisés, mais il n'y en a actuellement aucun

A noter que ce risque pèse sur l'instance du Carrefour des Innovations Sociales, mais pèse sur toutes les instances futures d'OpenScraper : il est possible que dans une future version d'OpenScraper, masterspider.py soit modifié d'une manière qui casse les spiders de l'instance

Aucun retour direct sur les erreurs durant le scrap

L'étape 4.3 est actuellement assez difficile, car beaucoup d'erreurs sont possibles, mais l'outil ne les fait pas remonter facilement. Erreurs possibles :

On ne se rend compte de ces erreurs que dans des messages dans la console (qui contient beaucoup de messages) ou en constatant que nos attentes ne sont pas satisfaites en inspectant les données récupérées manuellement\ Ce process est aussi limité, surtout quand le scrapper ramène des centaines ou milliers de résultats

Pourtant ces erreurs arrivent avec des causes diverses :

Ces causes sont fréquentes. Même les redesign. Si on imagine qu'un site procède à un redesign tous les 5 ans, alors en moyenne, sur 30 partenaires, l'un d'eux fait un redesign tous les 2 mois. Il est donc fréquent de devoir réécrire des spiders cassées pour redesign

Aussi, en relançant la spider régulièrement, il sera découvert des nouvelles pages qui ne correspondent parfois pas aux attentes de la spider

Aujourd'hui la boucle de feedback d'essayer des XPath, de constater que quelque chose ne va pas, de comprendre pourquoi avant de réessayer est un processus très manuel et long\ Le problème ne va être que plus visible et douloureux quand il va s'agir de laisser OpenScraper tourner tout seul pour se mettre à jour automatiquement

Description d'une autre solution possible

Spider en tant que code

Si chaque spider était son propre fichier de code, elle pourrait être versionnée (donc avoir l'histoire des changements), n'avoir qu'une faible dépendance au cœur d'OpenScraper (ou une dépendance forte, mais choisie et non imposée comme actuellement). Elle serait moins fragile aux changements d'OpenScraper. Le cœur d'OpenScraper pourrait être beaucoup plus petit et donc plus facile à maintenir Chaque spider pourrait aussi être facilement testée par des tests automatisés Copier une spider ne serait plus un jeu de copier/coller entre la prod et le dév, mais juste un git push et un git pull

Cette approche aurait un bonus supplémentaire pour les instances qui souhaitent être open source qui pourraient partager leur code contrairement à l'approche actuelle où la configuration de la spider et ses XPath est cachée dans une base de donnée MongoDB

Chemin de transition pour le Carrefour des Innovations Sociales

Quand une nouvelle spider est à créer, la créer "de zéro"\ Quand une spider est à refaire, réécrire le code "de zéro" sans utiliser masterspider.py

"de zéro" est mis entre guillemet, car il est ok dans ce cas-là de copier/coller du code, par exemple de masterspider.py, en le nettoyant pour ne garder que les morceau utile à ce site spécifique\ S'il est nécessaire de traiter un cas non-prévu par l'actuel masterspider.py, le.a développeur.euse aura accès à tout Python pour le faire

OpenScraper pourra fournir des classes et fonctions qui facilitent la vie d'écriture de spider. L'utilisation de ces fonctions et classes dans une spider sera optionnel

Assistance d'OpenScraper dans la gestion des erreurs

A chaque fois que l'on fait tourner une spider ("en test" ou "en vrai"), il s'agit d'un run. Il serait possible qu'OpenScraper, pour chaque run, stocke toute l'activité utile :

OpenScraper pourrait contenir un écran qui affiche les résultats d'un run en mettant en avant les erreurs rencontrées

Pour les erreurs de contenu qui ne se conforme pas aux attentes, il pourrait être possible de manuellement accepter (un par un ou par groupe) que les contenus soient publiés

Si trop d'erreurs sont rencontrées, les données récupérées dans le run sont mises dans un espace temporaires et ne sont pas publiées. Une revue humaine est nécessaire pour validation. L'intervention d'un.e développeur.euse est peut-être nécessaire

Chemin de transition pour le Carrefour des Innovations Sociales

Rien de spécial, il s'agit d'une nouvelle fonctionnalité qui peut être ajoutée en complément du design actuel

Piste alternative et complémentaire

Plutôt que d'essayer de demander à chaque partenaire sa base de données, puis de travailler à l'uniformiser, la stratégie adoptée par le CIS a été de scrapper les sites des partenaires afin de composer rapidement le moteur de recherche

Au vu du travail conséquent que demande de maintenir OpenScraper et les spiders, rencontrer les partenaires pour voir si une solution alternative au scrapping est possible est peut-être une bonne piste\ Cette piste peut être menée en parallèle d'un redesign d'OpenScraper

JulienParis commented 5 years ago

Quelques ajouts/précisions sur les fonctionnalités "core" d'OpenScraper :

  1. le but d'openscraper est non seulement de moissonner mais aussi de servir la donnée via l'API d'OpenScraper. Les runs de scraper (quelle que soit la refonte de l'outil de scrapping) doivent aboutir à envoyer ces données dans la base de donnée de telle manière qu'elle soit disponible pour le serveur d'API. Scrapers et API doivent pouvoir bien se coupler pour pouvoir faire "sortir" la donnée autant qu'ils lui permettent de "rentrer".
  2. le but d'OpenScraper est non seulement de moissonner mais aussi de pré-structurer la donnée scrapée de telle manière que toute la donnée soit homogénéisée. Cette fonctionnalité et celle précisée auparavant font que le projet ne se concentre pas uniquement sur la partie scrapping, qui est la partie "sous le capot".
  3. un autre objectif central de l'outil est de travailler à une interface graphique pour que l'utilisateur puisse "s'éloigner" du code source et des outils purement "dev", même si la tâche reste technique quelle que soit l'angle choisi pour scraper... Renvoyer les utilisateurs vers GitHub pour versionner des scrapers parlera aux développeurs mais peut éloigner de cette vision fondatrice de l'outil.
  4. l'outil a été une réponse également au retour d'expérience des personnes au sein de Makina Corpus qui avaient développé un POC du carrefour des innovations sociales avant EIG : ils avaient en effet livré une série de scrappers, tous dans des fichiers différents. Leur retour d'expérience était que de maintenir/configurer de zéro/relancer à la main les scrappers leur avait demandé un temps conséquent par scraper à l'ensemble de leur équipe (a priori plus que ce que demande actuellement OpenScraper pour une personne).
  5. enfin cet outil - du moins la démarche consistant à fabriquer une application open source de scrapping mettant en priorité l'interface - a rencontré un intérêt de principe auprès d'autres administrations : le fait que le scrapping soit dédié à des pages de listing et non du scrapping arbitraire est une fonctionnalité qui intéresse pour des usages déjà assez nombreux pour valider ce besoin précis.

Les problèmes principaux à date

Pistes complémentaires

Conclusion (temporaire et pour ouvrir la discussion)

bzg commented 5 years ago

Hello ! Super discussion, très éclairante sur les enjeux autour d'OpenScraper.

Je vois deux sujets:

  1. OpenScraper comme logiciel libre qui apporte une solution générique, d'abord aux besoins de la construction du Carrefour des Innovations Sociales (CIS), potentiellement à d'autres collectifs;
  2. OpenScraper tel qu'il est mis en oeuvre dès aujourd'hui comme outil au sein du CIS.

Pour chaque sujet, voici les priorités que j'identifie:

  1. Trouver un deuxième utilisateur: le but est de valider le fait qu'il y a effectivement besoin d'une solution générique. L'existence de solutions propriétaires fournissant des fonctionnalités équivalentes est un bon indice du fait qu'il existe, quelque part, un deuxième utilisateur - mais le connaître pour de vrai apportera beaucoup.
  2. Construire une interface permettant à un acteur disposant d'un inventaire sur son site de déclarer les XPath pertinents pour la collecte des informations de son inventaire telles qu'elles doivent finalement figurer dans un modèle de données défini.

Je pense que (2) est plus important que les questions de remontée des erreurs sur les spiders et que la question de leur versionnement en base de données ou via des fichiers.

Pour vous donner une idée de ce que j'imagine:

Aujourd'hui, je crois deviner deux points faibles d'OpenScraper: le côté monolithique de masterspider.py et la difficulté, pour un utilisateur non-technicien, de mettre à jour les spiders via l'interface. Je peux me tromper, mais j'ai le sentiment que ce deuxième point faible est le plus critique: si les utilisateurs du CIS disposent d'un moyen de déclarer plus facilement leurs XPath (via un formulaire web les aidant pas à pas), cela rendra moins prioritaire le problème de la remontée d'erreurs et celui de l'évolution de masterspider.py.

Bien sûr, il faut trouver une solution pour injecter les XPath reçus (en json) dans OpenScraper - mais une partie du code pour faire cela doit déjà exister, non?

A terme, il n'est pas inimaginable que ce soit OpenScraper lui-même qui propose cet outil de saisie des XPath facile à prendre en main, mais ce n'est pas nécessaire dans un premier temps; on peut aussi imaginer que la collection des json correspondant aux XPath de chaque site à scraper soit stockée sous forme de fichiers plutôt qu'en BDD, voire que les présupposés cités par @DavidBruant sur les listings ne soient plus hardcodés - mais ces évolutions d'OpenScraper pourraient être priorisées par l'équipe portant OpenScraper plutôt que par le CIS, qui a besoin d'une solution à court terme pour faciliter la mise à jour des points de collecte.

Je vois trois façons pour la discussion de rester dans une impasse:

  1. vouloir s'attaquer trop tôt à masterspider.py, donc au « coeur de la bête »: comme la bête va vivre sa vie de logiciel libre ailleurs qu'au CIS, cela risque de remettre en cause l'utilisation d'OpenScraper pour le CIS;
  2. arguer du potentiel de généricité d'OpenScraper pour refuser une solution ad hoc comme celle que j'imagine (ou une autre);
  3. faire dériver la discussion sur la question de la bonne volonté de tels ou tels acteurs de soutenir une solution libre générique.

L'OpenScraper actuel a permis de collecter des milliers d'infos sur plein de sites: ç'aurait été impossible à la main ou en demandant aux acteurs de le faire dans les temps impartis! Maintenant il y a deux temporalités: à court terme, le souci de la mise à jour des spiders, à moyen terme l'évolution d'OpenScraper comme solution pour son futur deuxième utilisateur.

Je suis disponible pour en parler avec vous la semaine prochaine - il y a certainement beaucoup de naïveté dans mon approche, ce sera plus facile de me déniaiser en IRL :)

JulienParis commented 5 years ago

... petit suivi et réflexions complémentaires

questions d'UX

générique / ad hoc / service saas...

OpenScraper comme projet

réflexions / synthèse d'étape

note sur les utilisateur.rice.s identifié.e.s

JulienParis commented 5 years ago

...et bien sûr je suis dispo IRL aussi pour en discuter :)

bzg commented 5 years ago

Merci pour ton retour !

(Je pense que la liste des utilisateurs identifiés ne devrait pas être publique...)

Ta réponse éclaircit beaucoup de choses pour moi: tu présentes OpenScraper comme un projet qui n'a pas de mainteneur, faute de moyens pour cette maintenance.

D'accord avec toi pour le point central sur l'adéquation entre les outils et les moyens humains: je pense que c'est aussi ce qui a initialement motivé les remarques de @DavidBruant. Cette adéquation est à trouver de deux côtés: celui du CIS (premier utilisateur d'OpenScraper en "production") et celui du (futur) mainteneur d'OpenScraper.

Dans l'idéal, tout s'aligne: le CIS porte un effort de réflexion sur l'UX porté aussi par la structure qui maintient OpenScraper, ou bien fait du développement fusionné upstream par l'équipe d'OpenScraper. Mais il y a aussi la possibilité que tout ne s'aligne pas.

Donc d'accord avec ta proposition de redéfinition du problème: à mon avis, cela mérite une issue à part, car le problème posé par l'issue initialement ouverte par @DavidBruant reste entier.

See you IRL!

JulienParis commented 5 years ago

L'image qui me vient est qu'un projet open source ressemble un peu à un groupe de jazz : on peut improviser, faire un boeuf, avoir des guests, des demandes du public, avoir un groupe temporairement ou un noyau de musiciens plus constitutif... mais au final c'est mieux de se trouver une identité ou/et des standards|répertoire avec lesquels jouer (ici la vision du projet) si on veut faire quelque chose de vaguement mélodieux pour l'audience...

bzg commented 5 years ago

La cathédrale, le bazar et le blue note ;)

bzg commented 5 years ago

J'ai ouvert une issue sur la maintenance. To be continued.

DavidBruant commented 5 years ago

Ecrire cette issue a été compliquée parce qu'il y avait beaucoup de problèmes différents mélangés J'imagine que lire cette issue a dû être compliqué parce que j'ai mélangé problèmes et solutions

J'ai extrait deux choses que je considère être des problèmes dans des issues séparées : #61 et #62 Je propose de discuter là-bas de si nous sommes d'accord sur le fait qu'il s'agit de problèmes et, si c'est le cas, de solutions possibles