IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Réseau/Web Python Discussion :

Parser un site web avec une jsp


Sujet :

Réseau/Web Python

  1. #1
    Futur Membre du Club
    Homme Profil pro
    consultant
    Inscrit en
    Mars 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : consultant

    Informations forums :
    Inscription : Mars 2014
    Messages : 6
    Points : 5
    Points
    5
    Par défaut Parser un site web avec une jsp
    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

  2. #2
    Futur Membre du Club
    Homme Profil pro
    consultant
    Inscrit en
    Mars 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : consultant

    Informations forums :
    Inscription : Mars 2014
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    bon... je viens de me rendre compte qu'en saisissant l'url que je mettais dans le code dans une nouvelle session d'un navigateur, j'ai une erreur http 500.
    En fait, la bonne url semble être : https://eappointment.pessac.fr/eAppo...service=PESSAC
    qui redirige vers :

    https://eappointment.pessac.fr/eAppo...ppointment.jsp

    Je viens de générer la page.html en utilisant la nouvelle url, et c'est beaucoup mieux !
    Par contre, je veux bien des explications sur la ligne de code suivante, censée avoir une valeur s'il y a un créneau dispo :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    available = soup.find('div', {'class': 'available'})
    J'avoue avoir récupéré ce code sur le net, mais étant débutant, je ne maitrise pas toutes les librairies et/ou lignes de code.
    Est-ce que cela va fonctionner dès qu'il y aura un créneau dispo ?

    Il faudrait que je génère ma page.html lorsqu'il y a un créneau de dispo pour comparer mes page.html avec et sans créneau, et voir ce que je peux tenter de récupérer avec le 'soup.find' afin de m'envoyer un email au bon moment.
    Vos avis ?

  3. #3
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 824
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 824
    Points : 7 120
    Points
    7 120
    Par défaut
    Bonjour,

    Par contre, je veux bien des explications sur la ligne de code suivante, censée avoir une valeur s'il y a un créneau dispo
    Ça recherche un élément <div> avec la classe available.
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par flowlvl Voir le message
    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.
    Trouvez un tuto avec des exercices corrigés: ça éviterait d'avoir à demander de l'aide (*) pire d'aller foutre la grouille sur les sites de l'administration qui fonctionnent grâce à nos impôts.
    Vous n'êtes pas supposé conduire sur des routes publiques sans permis et sans assurance.


    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. Réponses: 4
    Dernier message: 26/11/2013, 21h13
  2. Création de plusieurs sites Web avec une seule IP
    Par yoshï dans le forum Apache
    Réponses: 6
    Dernier message: 22/09/2010, 17h20
  3. Réponses: 4
    Dernier message: 29/08/2008, 09h01
  4. piloter un site web avec une application serveur
    Par nightcyborg dans le forum Langage
    Réponses: 2
    Dernier message: 22/07/2008, 11h15
  5. site web avec une page principale et des icones ?
    Par ricault dans le forum Portails
    Réponses: 3
    Dernier message: 05/06/2007, 09h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo