Blog
Scraping en Python pour être alerté des nouveaux créneaux drive chez Super U
- 8 avril 2020
- Publié par : Guillaume Peyronnet
- Catégorie : technique
En ce moment, il y a une forte problématique sur les courses au Drive. D’habitude je vais au Drive Super U. Mais en ce moment les créneaux sont rares. Et je n’ai pas la possibilité de rester devant mon ordinateur en rafraichissant la page toutes les 5 minutes pour voir si un créneau se libère.
J’ai ainsi décidé de résoudre cette tâche répétitive en faisant un script en Python. L’idée ? Toutes les 5 minutes un script va interroger la page de mon drive et selon ce qu’il y trouve ne rien faire, ou m’envoyer… un sms. Comme ça, j’ai toutes les chances de pouvoir rapidement aller sur mon PC et valider ma commande. o/
Trouver la page de son drive
Chez Super U, le plus simple est de commencer par la page de recherche de son magasin U.
Puis je choisis mon magasin, ici je cherche autour de Versailles, et je vois que le Super U Le Chesnay Pottier dispose d’un drive.
Je choisis ce magasin et je note bien l’url, j’en aurai besoin tout à l’heure :
Trouver où se trouve l’information de créneau disponible ou non
Sur la gauche de la capture d’écran je me rends compte qu’il n’y a pas de prochain créneau de drive. Je vais chercher dans le code source de la page où se trouve cette information :
Le texte Information momentanément indisponible se trouve dans une balise qui a pour attribut class store__content-delivery hidden. Je note cette classe pour plus tard.
Maintenant on peut coder, en Python
Je vais maintenant coder un script, très basique, qui va consister à assembler des bibliothèques toutes faites. Il s’agira en l’occurrence de :
- Requests : pour aller chercher le contenu de la page
- BeautifulSoup pour extraire efficacement les contenus
- Time pour gérer l’attente entre deux interrogations de la page distante
- Lxml pour extraire via un chemin xpath la donnée qui m’intéresse
- Twilio pour envoyer un sms vers mon portable en cas de créneau qui se libère
Et maintenant, place au code :
import requests
from bs4 import BeautifulSoup
import time
from lxml import html
from twilio.rest import Client
client = Client("ACXXXX", "XXXXXX")
#il s'agit de l'account_sid + auth_token récupéré depuis la console twilio http://www.twilio.com/console
check = True
while check:
url = "https://www.coursesu.com/drive-superu-lechesnay" #à remplacer par l'url ad hoc
resp = requests.get(url)
data = resp.content
soup = BeautifulSoup(data, "lxml")
tree = html.fromstring(data)
isit = tree.xpath('//a[@class="store__content-delivery hidden"]/text()') #vous remarquez ici le nom de la class à chercher
if isit[0] == "Information momentanément indisponible": #si pas de créneau
time.sleep(60*15) #on fait une pause de 15 minutes
continue #et on poursuit la boucle
else: #si un créneau est disponible
client.messages.create(to="+33xxx", #votre numéro de téléphone portable
from_="+1xxxx", #le numéro de votre compte twilio
body=isit[0]) # on peuple le sms avec le créneau disponible
check = False # et on stoppe la boucle. Je n'ai pas envie de recevoir 10 fois le même sms.
break
On peut maintenant lancer le script et le laisser tourner. Toutes les 15 minutes la page du magasin Super U va être interrogée, et dès qu’un nouveau créneau sera affiché, un sms sera envoyé sur votre portable. Le script s’arrêtera tout seul, et vous n’aurez plus qu’à passer commande.
Bon courage, et prenez soin de vous 🙂