Hello à tous,
je débute en Python et je me suis donné pour exercice de parser un site web pour récupérer des créneaux disponibles et d'envoyer un email lorsqu'il y a un créneau.
En l'occurrence, il s'agit d'un site d'une mairie qui permet de réserver un créneau pour avoir un rdv. Vu que c'est galère, cet exercice me sera également utile lorsque je voudrai prendre un rdv.
Voici le code que j'ai fait. A noter que j'ai ajouté une condition pour afficher le code retour, et avec mon site, j'ai un code retour 500, avec le site de google, c'est OK, j'ai un code retour 200 et je recois bien un email. Donc le code semble OK, et la config smtp aussi.
J'ai l'impression que le problème vient du type de site.
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 import smtplib import time from bs4 import BeautifulSoup import requests def send_email(subject, message): # Connect to the email server server = smtplib.SMTP('smtp.gmail.com', 587) server.ehlo() server.starttls() server.ehlo() # Login to the email account server.login("mon_email@gmail.com", "mon_mot_de_passe") # Compose and send the email message = "Subject: {}\n\n{}".format(subject, message) server.sendmail("mon_email@gmail.com", "mon_email@gmail.com", message) # Disconnect from the email server server.quit() def check_availability(): # Make a request to the website to get the HTML content page = requests.get("https://eappointment.pessac.fr/eAppointment-PES/element/jsp/appointment.jsp") soup = BeautifulSoup(page.content, 'html.parser') if page.status_code == 200: # Request is OK print("réponse de la request http OK") else: # Request is not ok print("réponse de la request http NOK") # Parse HTML content to check for availability available = soup.find('div', {'class': 'available'}) if available: send_email("Availability Alert", "A slot is now available!") return True else: send_email("Availability Alert", "No slot available!") return False # Continuously check for availability every hour while True: if check_availability(): break time.sleep(3600)
J'ai également fait le code suivant pour voir le code html récupéré dans un fichier page.html :
Voici le contenu de page.html :
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 import smtplib import time from bs4 import BeautifulSoup import requests def check_availability(): # Make a request to the website to get the HTML content page = requests.get("https://eappointment.pessac.fr/eAppointment-PES/element/jsp/appointment.jsp") #page = requests.get("https://www.google.fr") soup = BeautifulSoup(page.content, 'html.parser') if page.status_code == 200: # Réponse réussie print("réponse de la request http OK") else: # Échec de la réponse print("réponse de la request http NOK") html_content = page.content with open("page.html", "wb") as file: file.write(html_content) check_availability()
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 <!doctype html><html lang="fr"><head><title>État HTTP 500 Internal Server Error</title><style type="text/css">H1 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22px;} H2 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:16px;} H3 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:14px;} BODY {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;} B {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;} P {font-family:Tahoma,Arial,sans-serif;background:white;color:black;font-size:12px;}A {color : black;}A.name {color : black;}HR {color : #525D76;}</style></head><body><h1>État HTTP 500 Internal Server Error</h1><hr class="line" /><p><b>Type</b> Rapport d''exception</p><p><b>message</b> java.lang.NullPointerException</p><p><b>description</b> Le serveur a rencontré une erreur interne qui l''a empêché de satisfaire la requête.</p><p><b>exception</b> <pre>org.apache.jasper.JasperException: java.lang.NullPointerException org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:561) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:477) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:395) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:339) javax.servlet.http.HttpServlet.service(HttpServlet.java:731) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) com.es2i.appointment.app.ui.filter.AppointmentFilter.doFilter(AppointmentFilter.java:30) org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:83) org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) com.es2i.commons.http.servlet.filter.encoding.RequestDecoderFilter.doFilter(RequestDecoderFilter.java:44) com.es2i.security.NoSecurityProxy.doFilter(NoSecurityProxy.java:46) org.acegisecurity.util.FilterToBeanProxy.doFilter(FilterToBeanProxy.java:98) com.es2i.commons.servlet.filter.PurgeRequestBeanInfo.doFilter(PurgeRequestBeanInfo.java:30) com.es2i.appointment.app.ui.filter.XSSFilter.doFilter(XSSFilter.java:35) com.es2i.appointment.app.ui.filter.CORSFilter.doFilter(CORSFilter.java:63) </pre></p><p><b>cause mère</b> <pre>java.lang.NullPointerException </pre></p><p><b>note</b> La trace complète de la cause mère de cette erreur est disponible dans les fichiers journaux de ce serveur.</p><hr class="line" /><h3>Apache Tomcat/7.0.90</h3></body></html>
J'ai également tenté d'ajouter un en-tête, mais aucune amélioration :
Comment savoir si le site bloque les requêtes automatiques ? je ne suis pas persuadé qu'une mairie implémente ce genre de truc dans ce genre de site.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36', 'Accept-Language': 'en-US,en;q=0.9' } # effectue une requête HTTP GET pour récupérer le contenu du site web page = requests.get("https://eappointment.pessac.fr/eAppointment-PES/element/jsp/appointment.jsp", headers=headers)
Est-ce que le problème vient du fait qu'il ait une jsp ?
Est-ce mon code qui ne convient pas au type/format du site ?
Merci par avance pour votre aide
Partager