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 :

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()
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
<!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 :

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)
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.
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