mercredi 24 décembre 2014

Le bon coin : Making-off #dataleboncoin


C’est à l’issue d’un Data Tuesday, le 1er juillet 2014, alors que les conversations se prolongeaient avec les confrères que Jessica Dubois m’a parlé de ce projet qui lui tenait à coeur : “Scraper le Bon coin”. Échaudé par des précédentes expériences stériles, ma première réponse,  fut : « Ok, mais à condition de trouver une pige pour rentabiliser le travail. »

Elle me contacta une grosse semaine plus tard avec l’heureuse nouvelle : Hexagones.fr était prêt à financer l’investigation datajournalistique. Les tarifs n’étaient pas encore clairs, mais il était acquis que ce ne serait pas un travail gratuit.
Bref..


Je commence donc à mettre en place mon premier script. Les objectifs au départ n'était pas très précis, donc nous avons pris l'option d'avoir une vison d'ensemble pour voir ce qui sortait du lot. La première étape a été de faire un tour du propriétaire. C’est à dire de connaitre les ventes par catégorie et département. Le Bon coin construit ces liens en trois parties :




D’abord il faut parcourir les pages de départements puis de catégories les unes après les autres. À chaque page, récupérer les trois nombres qui nous intéressent.



Je n’ai pas utilisé Outwit Web parce que le logiciel est limité à 100 collectes automatisées en version gratuite. De plus j’ai déjà des scripts en Python qui ont déjà fait leur preuve. Or, pour les 100 départements, il y a 61 catégories. Ce qui donne 6100 lignes et donc bien est bien au delà de la limite gratuite de Outwit Web.

Voici un exemple de Xpath avec le module firebug sous Firefox :



Une fois chaque page chargée, on récupére les nombres d’articles en utilisant la librairie Python lxml et le codage xpath. Pourquoi Lxml ? Parce que cette librairie a été testée  et se place largement devant la librairie Python Beautifulsoup en rapidité d’exécution. Je n’ai pas refait le test, mais la différence parait significative.


Cette première étape nous a permis d’avoir une vue d’ensemble sur les annonces du Bon coin que nous avons pondéré avec la population légale au premier janvier 2014 que nous donne l'INSEE.


À partir de là, les angles que l’on voulait aborder ont décidé de la suite. Ce qui nous intéressait était d’abord les vêtements. Cette catégorie étant plus variée et le nombre des annonces étant plus élevé. Cela nécessitait automatiquement beaucoup, beaucoup plus de collectes automatisées. Si la première étape mettait à peu près deux heures, le deuxième allait être forcément beaucoup plus longue. J’ai essayé de trouver un script qui fasse du multitâche et je l’ai trouvé. En parallèle j’ai également appris l’existence de Docker.

D’une manière assez systématique j’ai fait le choix de la courbe d’apprentissage la plus rapide. Je ne voulais pas m’engager sur des pistes trop hasardeuse. J’ai donc choisi de fonctionner avec Docker pour sa simplicité, ne maitrisant pas le multitasking en Python.

Docker est un système virtuel qui se situe quelque part entre Virtualbox et Github. On fait un script qui automatise la création du système d’exploitation ( les différentes variantes de Linux) jusqu’au script de démarrage, l’installation des packages et la configuration de la machine virtuelle. Sur cette base j’ai pu faire autant de machine virtuelles qu’il était nécessaire. J’avais donc une instance par catégorie qui tournait en permanence.

La fréquence des requêtes.
D’abord il est important de prendre conscience que pour faire du scrapping journalistique, il faut avoir une éthique absolue : ne pas géner le fonctionnement normal du site. Il est relativement aisé de mettre KO un site, ou en tout cas de fausser ses statistiques en exécutant trop de requètes en peu de temps. J’ai donc mis entre chaque requête une temporisation aléatoire entre 0,5 et secondes.

Le blocage de l’IP
Évidemment une adresse IP qui fait des millions de requêtes sur un site est vite repérée par l’administrateur système. Il est aussi détecté par un logiciel du serveur qui permet de bloquer ce qu’on appelle un DDOS ou déni de service. Je m’en suis rendu compte assez vite puisque de temps en temps j’avais une erreur “HTTP 403” qui m’était retournée. J’ai donc utilisé un système de proxy que j’alternais automatiquement toute les dix minutes. Cette rotation des adresses IP qui “scrappait” m’a permis de faire l’essentiel de mes collectes. L’avantage avec Docker c’est que les scripts peuvent fonctionner avec plusieurs proxy differents en même temps chacun dans leur environnement.

Le stockage des données
Alors là, je vais choquer quelques geeks. Je n’ai pas utilisé de base de données MySQL ni de Nosql. Non j’ai utilisé des fichiers. Parce qu’avec des fichiers je pouvais débuguer plus rapidement, je pouvais les concaténer ensemble et le résultat était directement exploitable par un Excel ou un Google fusion. Avec les commandes awk et sed, j’ai pu également manipuler les fichiers assez rapidement même s’il faisait plus de 2 Go. Si je refais ça, je mettrai au point une méthode plus “classieuse”, mais pour la manip pendant laquelle j’apprenais en marchant, j’avais besoin de réduire le nombre de courbes d’apprentissage au minimum. En bref moins il y avait d’outils, plus je maitrisais le processus.

Il s’agissait enfin de faire une enquête classique, nous avions des informations et avec celles-ci nous avons interrogé de nombreux sociologues et géographes qui pouvaient être intéressés par ces données. De temps en temps on tombait sur une valeur particulièrement importante par rapport à d’autres. Parfois notre curseur était le nombre d’offres dans le département du Pas-de-Calais. Car ce département est le plus important utilisateur du bon coin. Dans ces cas là on recherchait la source de ce dépassement. Nous avons fait des choix, éliminer ce qui nous semblait le moins significatif, gardé ce qui faisait sens. Parfois, lorsque cela était nécessaire, nous repassions sur une catégorie.

Pour certains départements qui sortaient du lot, on revenait sur le site pour quelquefois découvrir des utilisateurs hors du commun parce qu’ils vendaient beaucoup de cassette vidéos par exemple.

Voilà probablement que je n’ai pas répondu aux questions mais je suis à votre disposition.

Les articles sont là : 
La France vue par leboncoin 
Leboncoin des pauvres, leboncoin des riches 
Leboncoin au soleil, Leboncoin sous la neige 
Leboncoin des villes, Leboncoin des champs
Michel, serial vendeur de DVD sur Leboncoin