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 :

contenu page url avec submit [Python 3.X]


Sujet :

Réseau/Web Python

  1. #1
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut contenu page url avec submit
    Bonjour,
    Je me casse le nez sur un souci depuis longtemps.
    Je vais sur une page sur laquelle je me connecte avec un identifiant et mot de passe.
    Ensuite, je peux aller sur une autre page dont je souhaite récupérer le contenu.

    J'ai fait pas mal d'essais, par exemple celui-ci :
    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
    s = requests.session()
    res = s.get(url)
    cookies = dict(res.cookies)
     
    payload = (userName, passWord)
     
    with requests.Session() as session:
        post = s.post(url, auth=payload,verify=False,cookies=cookies)
        r1 = session.get(url)
        print(r1.text)
        r2 = session.get(url2)
        print(r2.text)
    Quelle que soit la méthode utilisée, le message retourné est que la session est expirée et que je dois me reconnecter.
    Est-il possible de contourner ce problème ?
    J'ai testé également ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    import urllib.request
    passman = urllib.request.HTTPPasswordMgrWithDefaultRealm()
    passman.add_password(None, url, userName, passWord)
    authhandler = urllib.request.HTTPBasicAuthHandler(passman)
    opener = urllib.request.build_opener(authhandler)
    urllib.request.install_opener(opener)
    res = urllib.request.urlopen(url)
    res_body = res.read()

  2. #2
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    Bon, j'ai avancé un peu avec robobrowser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    import re
    from robobrowser import RoboBrowser
     
    br = RoboBrowser()
    br.open(url)
    form = br.get_form()
     
    form["g_ea_cod"] = userName
    form["g_ea_mot_pas"] = passWord
     
    br.submit_form(form)
    src = str(br.parsed())
    print(src
    Et là, je suis planté. Voici ce que j'ai avec l'inspecteur d'élément en image jointe.
    Nom : capture1.png
Affichages : 564
Taille : 102,0 Ko

  3. #3
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    En développant, j'ai imaginé ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    start = '<div class="dataTables_scrollBody"'
    end = '</div>'
    result = re.search('%s(.*)%s' % (start, end), src).group(1)
    print(result)
    mais j'obtiens l'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AttributeError: 'NoneType' object has no attribute 'group'
    Donc, a priori, rien n'est trouvé...

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 681
    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 681
    Par défaut
    Citation Envoyé par marco056 Voir le message
    Est-il possible de contourner ce problème ?
    Si vous écrivez:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    import requests
    s = requests.session()
    res = s.get(url)
    cookies = dict(res.cookies)
     
    payload = (userName, passWord)
     
    with requests.Session() as session:
        post = s.post(url, auth=payload,verify=False,cookies=cookies)
        r1 = session.get(url)
        print(r1.text)
    Vous avez créé 2 instances de Session (s et session)... et si vous faites le .post avec une puis utilisez l'autre, comment voulez vous que çà fonctionne?
    Vous avez plein d'exemples sur Internet ou dans la documentation de requests... Mais il faut arriver à comprendre que qu'est le protocole HTTP sans y perdre son Python.

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

  5. #5
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    Oui, effectivement, je me suis mélangé les pinceaux.
    J'ai modifié et cela va beaucoup mieux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    import requests
     
    payload = {"g_ea_cod" : userName, "g_ea_mo_pas" : passWord}
     
    post = requests.post(url, params=payload)
    r1 = requests.get(url)
    print("r1.text : ", r1.text)
    J'ai obtenu dans le corps ceci :
    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
    <div id="main">
             <form name="authentification" method="post" action="authentification" onsubmit="return verifLoginPassword(this);">
                    <div class="formulaire">
                            <div class="form">
                                    <label style="width: 40%;">Identification :</label>
                                    <span style="width: 58%;"><input type="text" size="30" name="g_ea_cod" /></span>
                            </div>
                            <div class="form">
                                    <label style="width: 40%;">Mot de passe :</label>
                                    <span style="width: 58%;"><input type="password" size="30" name="g_ea_mot_pas" /></span>
                            </div>
     
                    </div>
                    <input type="hidden" name="ACTION" value="1" />
                    <div class="validation">
                            <table class="bouton">
            <tr>
                    <td class="gauche"></td>
                    <td class="milieu"><input type="submit" value="OK" class="bouton" />            </td>
                    <td class="droite"></td>
            </tr></table>
     
                    </div>
            </form>
    </div>
            </div>
     </div>
    J'avoue mon ignorance quant aux protocoles HTTP et la doc de requests est assez imposante mais je ne trouve pas mon bonheur.
    Je souhaite accéder à des rubriques de la page, sans succès.

  6. #6
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    Je n'ai pas beaucoup de succès...
    Du coup, je pars sur autre chose : j'espère que cela m'aidera à comprendre.
    J'ai donc utilisé un site dispo pour tout le monde.
    Est-ce quelqu'un peut m'indiquer comment remplir les champs ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    url = "http://www.fftt.com/site/competition/championnats-par-equipes/niveau-departemental"
     
    import requests
    s = requests.session()
    res = s.get(url)
    print(res.text)

  7. #7
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    Ici, j'obtiens une liste cohérente sauf que je n'ai pas la bonne page : celle qui correspond à ma recherche liée à payload.
    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
     
    url = "http://www.fftt.com/site/competition/championnats-par-equipes/niveau-departemental"
     
    payload = {"structures_foreign_id": "56",
            "persons_sexe":"M",
            "phases_id":"2",
            "competitions_id":"7505"}
     
    import requests
    from bs4 import BeautifulSoup
     
    r=requests.get(url, data = payload ) 
    soup = BeautifulSoup(r.text,'lxml')
    print(soup)
    products = soup.findAll('div', {'class':'partners-picture2'})
    print(products)
    [edit] Je vais passer mon fil en "Général Python" car j'ai l'impression qu'il n'y a pas beaucoup de passage ici...

  8. #8
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut marco056,

    perso je te filerai bien un coup de main, mais j'avoue que j'ai rien pigé à ce que tu veux faire depuis le début

  9. #9
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    Ben flûte alors !
    Bon, je reprends.
    Je vais sur une page web à l'aide de mon navigateur, par exemple celle du dessus.
    Je remplis les champs et lorsque je remplis les champs, la page s'actualise et fait apparaître d'autres données.
    Ce sont ces données-là qui m'intéressent.
    J'espère avoir été plus clair...

  10. #10
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    Citation Envoyé par marco056 Voir le message
    par exemple celle du dessus.
    c'est particulièrement un mauvais exemple, puisque ça n'est pas tout à fait un formulaire standard, il y a des morceaux d'Ajax derrière et quand on sélectionne dans la première liste déroulante ça modifie dynamiquement la 4ème, en clair ça effectue une requête sur le réseau

    une fois les 4 critères sélectionnés, sauf erreur rien ne se passe et il faut explicitement cliquer sur "Rechercher" pour que la page s'actualise, là encore il s'agit d'une requête sur le réseau

    typiquement si on prend l'exemple que tu donnes au dessus, pour un structures_foreign_id qui vaut 56 (Morbihan), il n'existe (actuellement ?) pas de competitions_id valant 7505, du coup tu peux toujours requêter ça renverra rien forcément

    et au delà lorsqu'on sélectionne un onglet ou un autre etc. idem : ça occasionne du trafic qui renvoie des données nécessaires pour continuer

    hésite pas à être plus précis sur ce que tu veux récupérer précisément, dans quel contexte éventuel etc.

  11. #11
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    En fait, l'id que je donne existe mais il faut que l'option 2 saut cochée pour la phase.
    Sinon, une fois remplis tous les champs, je souhaiterais par exemple accéder à PONT SCORFF / GESTEL TT 1 qui se trouve ici :
    body ; site-wrapper ; container-wrapper-main ; container-wrapper ; content-wrapper ; positions-100-col1 ; plugins-wrapper ; plugins-content ; pagination-global-wrapper ; plugin-large-wrapper ; ajax-pagination-content894450246 ; tab_v1-wrapper ; tab49280-bloc ; plugin-list-large ; li ; wrapper-row-flex-nowrap ; col-xlarge-col-flex !!!!!
    Je ne sais pas si j'exprime correctement mon souhait.

  12. #12
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    avec BeautifulSoup on peut faire un truc comme ça (testé) :
    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
    import requests, bs4
    from pprint import pprint
     
    url = 'http://www.fftt.com/site/ajax1?plugins_controller=structuresRemoteCompetitions&plugins_action=plugin_index_ajax'
    payload = {'persons_sexe': 'M', 'competitions_id': 7505, 'structures_foreign_id': 56, 'phases_id': 2}
    sess = requests.session()
    soup = bs4.BeautifulSoup(sess.post(url, data=payload).text, 'html.parser')
     
    # on cherche le div 'tab_49280-bloc' non-ambigu, puis dans tous les <li> on prend le premier qui contient 'SCORFF'
    li = next(
       i for i in soup\
       .find('div', attrs={'id' : 'tab_49280-bloc'})\
       .find_all('li') \
       if 'SCORFF' in i.text
    )
     
    # sur ce <li>, on prend le div qui englobe, puis tous les div à l'intérieur, et on strip() pour nettoyer le résultat
    pprint([
       i.text.strip() for i in li\
          .find('div', attrs={'class' : 'wrapper-row-flex-nowrap'})\
          .find_all('div')
    ])
    PS:
    Citation Envoyé par marco056 Voir le message
    Je ne sais pas si j'exprime correctement mon souhait.
    y'a des fois ça tient à peu de choses, une capture d'écran par exemple c'est bien plus parlant qu'un chemin dans la DOM

    Nom : Sans titre.png
Affichages : 554
Taille : 34,9 Ko

  13. #13
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    Excellent !
    C'est ce que je cherchais ici !!!
    Merci beaucoup. Je vais tenter de comprendre ceci pour, par la suite, reprendre mon projet initial. Comme il y a une authentification, je ne peux pas mettre le site en lien ici...

  14. #14
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    A nouveau moi,
    je continue vu que j'ai un creux ce week-end...
    J'ai tenté autre chose, par exemple ceci, en m'inspirant de la réponse de BufferBob.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    import requests, bs4
     
    url = 'http://www.fftt.com/site/ajax1?plugins_controller=personsRemoteClassement&plugins_action=plugin_index_ajax'
    payload = {'classement_type': 'cl', 'departements': 'D56', 'persons_sexe': 'Hommes', 'nclub': "03560053"} # 'club': 'PLOEMEUR'
    sess = requests.session()
    r = sess.post(url, data=payload)
    soup = bs4.BeautifulSoup(r.text, 'html.parser')
     
    fich_ping = 'ping2.txt'
    with open(fich_ping,'w') as f:
        f.write(r.text)
    Cependant, je n'ai rien d'exploitable dans mon fichier résultat et je ne vois pas comment avancer.
    Si je peux avoir encore un peu d'aide (ou de la lecture : je suis au niveau réseau en développement web)
    (BufferBob, si tu n'es pas lassé...)
    Au final, je souhaite exploité le site gestion-parcoursup mais je ne peux fournir mes identifiants. Si qqn qui s'y connaît y a accès, je suis preneur.

  15. #15
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    ben un peu comme précédemment, tu pourrais préciser d'où tu pars et où tu veux aller, ça éviterait d'avoir à faire de la divination

    en l’occurrence depuis l'accueil du site il faut aller dans l'onglet "compétitions" puis sélectionner "classement départemental", et ce qui t'intéresse je suppose c'est les données du classement en question, ordonnées

    bonne nouvelle, t'étais vraiment pas très loin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    payload = {
       'classement_type': 'cl',
       'departements': 'D56',
       'persons_sexe': 'Hommes',
       'nclub': '03560053',
       'pagination-items': '100'
    }
    j'ai trouvé en testant, j'ai vu qu'il y avait un certain nombre de paramètres que tu ne reportais pas (categorie, pagination-items, pagination-current, pagination_key etc.), la requête avait cependant l'air bonne, au flair je me suis douté qu'il s'agissait juste de trouver le paramètre manquant

    d'autant que ce qu'on récupère quand ça fonctionne pas a des airs de ressemblance avec ce qu'on récupère quand ça doit fonctionner, on reconnait le même bout de javascript tout à la fin, c'est un indicateur que c'est juste l'api en face qui ne retrouve pas ses petits

    BufferBob, si tu n'es pas lassé...
    pas de souci, je te fais parvenir la facture à l'adresse habituelle

  16. #16
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    Merci et désolé d'avoir manqué de précision.
    Comme je ne remplissais pas d'autre champ, je ne pensais pas que certains étaient mis par défaut (par exemple pagination-items)..
    Je vais maintenant essayer de traiter ces infos avant de passer à un autre exemple.
    Pour la facture, oui, on fait comme d'hab

  17. #17
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    Des nouvelles : j'ai réussi à finaliser tous mes projets, y compris celui qui me posait problème (avec identifiants et sans doute en java).
    Merci pour votre aide.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Urls avec ou sans extension de page ? (.html)
    Par speedev dans le forum Référencement
    Réponses: 5
    Dernier message: 17/07/2008, 00h28
  2. Paramètre URL avec inclusion de page
    Par bogsy15 dans le forum Langage
    Réponses: 3
    Dernier message: 24/07/2007, 18h45
  3. Réponses: 3
    Dernier message: 09/05/2007, 10h49
  4. Servlet Affichant une page html avec contenu javascript
    Par kam81 dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 18/10/2006, 16h37
  5. [C#] Comment récuper un page xml avec une URL
    Par pc152 dans le forum ASP.NET
    Réponses: 4
    Dernier message: 03/02/2005, 16h17

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