Bonjour à tout le monde
Je suis en train d'apprendre à coder en Python et après avoir travaillé sur quelques projets "clé en main" je me lance dans la création d'un code pour continuer mon apprentissage. J'ai donc de petites bases, je comprends en partie les liens entre les fonctions principales ainsi que la logique et la structure d'un code Python.
Mon projet ici est de créer un script qui me permet de relever une fois par jour le prix d'un article sur un site et de m'envoyer un mail si le prix a évolué. Dans ce cas-ci, rien d'original, c'est pour les langes de ma fille ... Je me doute que ce projet ne vend pas du rêve mais je trouvais que c'était un bon moyen pour continuer à découvrir cette technique.
Je me fais aider par l'IA de ChatGPT car je trouve vraiment intéressant la façon de proposer un code en réponse à une demande mais également sa façon de pouvoir m'expliquer le processus du script. Je ne suis donc pas l'auteur de A à Z du code et ouvert à toute modification me permettant d'arriver à mon objectif. Je parcours également Github pour savoir ce qui est déjà édité dans d'autres projets.
Pour faire étape par étape, j'ai testé divers parties du code :
Test d'envoi de mail via SMTPLIB et MIMETEXT
=> OK, mail bien reçu. J'avais essayé avant avec Yagmail mais j'ai changé de projet car il semble qu'il n'est plus possible de baisser la sécurité de la boite chez Gmail.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 smtplib from email.mime.text import MIMEText # Paramètres du compte Outlook outlook_user = "your_email@outlook.com" outlook_password = "your_password" # Destinataire de l'e-mail to_email = "recipient_email@example.com" # Contenu de l'e-mail email_text = "Ceci est un e-mail de test envoyé à travers un compte Outlook avec SMTPLIB." msg = MIMEText(email_text) msg['Subject'] = "E-mail de test" msg['From'] = outlook_user msg['To'] = to_email # Connexion au serveur SMTP d'Outlook server = smtplib.SMTP('smtp-mail.outlook.com', 587) server.starttls() server.login(outlook_user, outlook_password) # Envoi de l'e-mail server.sendmail(outlook_user, to_email, msg.as_string()) # Déconnexion du serveur server.quit() print("E-mail envoyé avec succès!")
Test de récupération du contenu de la page
=> Avec le code suivant, je reçois une réponse positive. Toutefois je n'ai pas vu ce qu'il a concrètement récupéré.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 import requests headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36' } url = 'https://www.colruyt.be/fr/produits/28742' response = requests.get(url, headers=headers) if response.status_code == 200: print("Page récupérée avec succès") else: print("Erreur lors de la récupération de la page")
Test de relevé de prix avec BeautifulSoup
=> Ici, il me donne le message d'erreur suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 import requests from bs4 import BeautifulSoup headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36' } # URL de l'article à surveiller url = 'https://www.colruyt.be/fr/produits/28742' # Récupération de la page web de l'article page = requests.get(url, headers=headers) soup = BeautifulSoup(page.content, 'html.parser') # Récupération du prix de l'article price = soup.find('span', class_='price-info__unit-price').get_text() # Affichage du prix print(price)
Donc voici où je bloque. Auriez-vous des ressources à me proposer? J'ai déjà fait différentes recherches mais je pense ne pas être encore assez à l'aise avec Python pour trouver comment solutionner mon problème.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 File "/home/pi/PriceMonitor003", line 16, in <module> price = soup.find('span', class_='price-info__unit-price').get_text() AttributeError: 'NoneType' object has no attribute 'get_text'
Dans un premier temps, j'essaie d'extraire un prix pour faire fonctionner mon script mais mon objectif final est d'extraire une partie précise du prix car le site inscrit le prix normal et ensuite le prix à l'achat de X pièces et c'est ce dernier qui m'intéresse.
Mon objectif ici n'est pas de surcharger le serveur d'un site web c'est pour cela que je me limite à une requête par jour.
Actuellement, mes codes sont principalement implémentés sur des Raspberry Pi Zero que je pilote via PUTTY et une connexion SSH . J'utilise Python 3.9 et je rédige le code sur Visual Studio Code.
Actuellement, mon code complet ressemble à ceci mais est encore loin d'être fonctionnel.
J'espère avoir été complet et pas trop brouillon dans mes explications... Si je peux ajouter quelque chose, n'hésitez pas à me le dire!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54 import smtplib from email.mime.text import MIMEText from bs4 import BeautifulSoup import requests import time # Adresse de l'article à surveiller url = "https://www.colruyt.be/fr/produits/28742" # Headers pour la requête HTTP headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0;Win64) AppleWebkit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36" } # Enregistrer le prix actuel de l'article page = requests.get(url, headers=headers) soup = BeautifulSoup(page.content, "html.parser") price = soup.find("div", class_="price").get_text() # Connexion au serveur SMTP d'Outlook smtp_server = "smtp-mail.outlook.com" smtp_port = 587 smtp_username = "your_email@outlook.com" smtp_password = "your_password" # Destinataire de l'email to_email = "your_email@outlook.com" # Boucle de surveillance while True: # Récupération du prix actuel de l'article page = requests.get(url, headers=headers) soup = BeautifulSoup(page.content, "html.parser") new_price = soup.find("div", class_="price-info__price-label").get_text() # Vérifie si le prix a changé if new_price != price: # Envoi d'un email message = MIMEText("Le prix de l'article a changé de " + price + " à " + new_price) message["From"] = smtp_username message["To"] = to_email message["Subject"] = "Changement de prix" server = smtplib.SMTP(smtp_server, smtp_port) server.starttls() server.login(smtp_username, smtp_password) server.send_message(message) server.quit() # Mise à jour du prix enregistré price = new_price # Attente d'une journée avant de vérifier à nouveau time.sleep(24*60*60)
Merci d'avance !
Bonne journée
Partager