English (UK)
Français (France)
Brezhoneg (Breizh)

À la recherche des objets perdus

September 5 2017

Un petit poste programmation, ça faisait longtemps  :) et aussi surprenant que ce le soit, c'est mon premier post Scala  :!: (alors que je vous bassine avec depuis des années  :) )

À force de fréquenter des rôlistes, collectionneurs, bricoleurs, brocanteurs, ... en tout genre, je me suis dit que je pourrais faire un petit quelque chose à leur attention.

Je propose donc un petit scrapper pour leboncoin.fr bien que je suis plutôt adepte d'un concurrent en ce qui me concerne.

Vous trouverez une version assez simple (le challenge était de tenir en moins de 50 lignes) qui va vérifier toutes les 10 minutes si votre recherche matche des objets, si oui, elle approfondit la recherche en recherchant des mots-clés supplémentaires ou en vérifiant le vendeur (et oui, j'ai acheté une grosse majorité de mes mangas au même vendeur... c'est quand même dommage de ne pas pouvoir chercher par vendeur sur leboncoin :s )

Ensuite, vous customisez votre fonction de notification pour être prévenu de la mise en vente.


Pour les non-adeptes des langages fonctionnels, le code risque de vous faire bizarre, mais vous en noterez la concision (ça pourrait encore être plus court).

Quelques petits coups de pouces avant de vous lancer dans le code.
myHtmlDoc >> element("a") est pour rechercher dans le document html l'élément "a".
myHtmlDoc >?> element("a") est pour rechercher dans le document html un élément optionel "a"
Pour le scheduling (uniquement), j'utilise le scheduler des acteurs akka. D'où la présence d'un ActorSystem.
Enfin, en Scala, la dernière expression d'un bloc (fonction, condition, ...) est la valeur de retour du bloc. Autrement dit, le mot clé "return" est implicite.

Pour le code c'est ici : scrapper leboncoin.fr

avatar

Hiryu


Hiryu

2018-02-20 22:20:06

Hello,

Pour ceux que ça intéresse, vous aurez remarqué que le script ne fonctionne plus. En effet leboncoin a un peu changé de look et s'est mis au goût du jour.

Un petit update du script (du moins, un extrait de ma version) :

for { // extract optionally description and vendor name
titleOpt <- loadedPage >?> text("._1KQme")
title <- titleOpt
descriptionOpt <- loadedPage >?> text("[data-qa-id=adview_description_container] span")
description <- descriptionOpt
vendorOpt <- loadedPage >?> text("div._2rGU1")
vendor <- vendorOpt
} yield Offer(title, description, vendor.toString, offerHref)

Have fun !

Hiryu

2018-07-10 22:04:03

Hello,

Si vous crawlez aussi, vous aurez remarqué que le site a de nouveau été mis à jour, il y a quelques semaines. Je n'avais jusqu'alors pas mis à jour mon script, par manque de temps et d'intérêt pour cette application.

Si vous êtes tenté par une mise à jour du code :

val offerHrefs: Seq[String] = page >> elementList("""li[itemtype=http://schema.org/Offer]""") flatMap (_ >?> element("a") map (_ attr "href")) // extract the links href
val withProtocolHrefs: Seq[String] = offerHrefs.reverse map ("https://www.leboncoin.fr" + _) // add missing protocol + base url to each extracted href

Par ailleurs, le format de l'url de recherche a changé, mettez-le à jour selon convenance.

Bonne soirée,