Scraping en Python pour être alerté des nouveaux créneaux drive chez Super U

Scraping en Python pour être alerté des nouveaux créneaux drive chez Super U

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 <a> 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 :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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 🙂