Bonjour,
Je galère à trouver un script tout simple en python et efficace pour me connecter à un site avec login et mot de passe, en vue de scraper un tableau csv ou son code source.
Merci de votre retour.
Bonjour,
Je galère à trouver un script tout simple en python et efficace pour me connecter à un site avec login et mot de passe, en vue de scraper un tableau csv ou son code source.
Merci de votre retour.
Salut,
Si vous venez ici, c'est pour avoir de l'aide pour écrire ce genre de script, pour trouver un script tout fait, un moteur de recherche fait l'affaire. Néanmoins, l'authentification a un site Web dépend du site, sans aucune idée du mécanisme d'authentification utilisé difficile de coder (et que chercher?).
- W
oups...
Salut,
voici le code source de la page d'identification du site (j'ai mon identifiant et mdp) :
Code html : 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 <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>Connexion</title> <link rel="stylesheet" href="css/login.css" /> </head> <body> <div class="center-screen"> <form action="/login.php" method="post"> <div class="container"> <label for="username"><b>Nom d'utilisateur</b></label> <input type="text" name="username" value="" required> <label for="password"><b>Mot de passe</b></label> <input type="password" name="password" required> <input type="submit" value="Se connecter"> </div> </form> </div> </body> </html>
le script que j'ai utilisé :
sauf que le résultat, il imprime le code source de la page d'identification. Il ne passe pas l'étape de la connexion et accès à la page souhaitée
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 import requests with requests.Session() as s: url = 'https://www.exemple.fr/login.php' s.get(url) values = {'username': 'mon_identifiant', 'password': 'mon_mdp'} r = requests.post(url, data=values) #print r.content r = s.get("https://www.exemple.fr/tableau.php") print(r.text)
le site ne propose pas d'API ?
tu as regardé le résultat (la réponse) de ton post ?
Bonjour
Et il te semble lisible? Tu ne te dis pas qu'il manque des tabulations par ci, par là? C'est pourtant important les tabulations, surtout en Python. Tu ne t'es pas un peu baladé sur le forum voir comment faisaient les autres à défaut d'aller lire les règles???
Accessoirement le site www.exemple.fr n'existant pas, on ne peut pas reproduire. Mais je suis dubitatif quant à ces deux instructions à suivre: r = requests.post(url, data=values) puis r = s.get("https://www.exemple.fr/tableau.php") parce que dans tous les langages du monde, remplir deux fois une même variable sans la traiter entre temps est soit inutile et du temps perdu (dans le meilleur des cas) soit une erreur de programmation.
Mon Tutoriel sur la programmation «Python»
Mon Tutoriel sur la programmation «Shell»
Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
Et on poste ses codes entre balises [code] et [/code]
Si vous avez testé ça sur l'URL https://www.exemple.fr, c'est peut être "normal"
- W
En copiant/collant, j'ai omis de remettre les tabulations. Mais en fait, elles disparaissent , donc j'ai remplacé pour ce message par des "_".
Le site original, je ne suis pas autorisé à le diffuser...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 import requests with requests.Session() as s: url = 'https://www.exemple.fr/login.php' s.get(url) values = {'username': 'mon_identifiant', 'password': 'mon_mdp'} r = requests.post(url, data=values) r = s.get("https://www.exemple.fr/tableau.php") <-----2nd page après connexion. print(r.text)
Je vois bien qu'il manque une commande intermédiaire. Je pensais r=requests.post... me permettait de me connecter
et que r=s.get.. d'aller à la page demandée. Après trouver une commande pour enregistrer un tableau csv.
J'avoue, je suis novice et bidouille, mais on me demande une petite appli html pour rendre visible des données de niveaux d'étiage dans les rivières bretonnes. Voili voilà.
On ne demande pas de faire ça à un débutant sans pouvoir lui mâcher le boulot et résoudre les difficultés qu'il pourrait rencontrer.
Pour le reste, il n'y a pas de grosse boulette dans le code => il faut vérifier 3 fois plutôt qu'une que les informations de connexion sont correctes (et puisqu'on ne peut pas le faire pour vous...).
- W
Je vais à l'automne en formation python. Il y a besoin..
Je cherche la commande pour mon script afin de valider la fenêtre login/password. Car, je ne rentre pas sur le site.
Sauf si il y a mieux que requests. J'ai essayé aussi ftplib, insta, sans succès.
Merci
C'est pas une question d'outil mais de mise en œuvre: les instructions du script déclenchent l'expédition de messages HTTP dont le contenu sera bien celui attendu par le serveur. Si ce n'est pas le cas, c'est qu'il y a soucis côté données ou protocole. Et si on ne peut pas "tester" à votre place, pas grand monde va pouvoir aider (sauf par chance).
Ici, c'est plutôt une formation réseau qu'il faudrait (car vous n'avez pas l'air de comprendre quelles sont les informations pertinentes à fournir pour obtenir de l'aide).
- W
Euréka : j'ai trouvé : sur la ligne r = s.post(url, values), j'ai rajouté True, soit : r = s.post(url, values, True).
Du coup je rentre enfin sur le code source de la page que je cherche. Maintenant, étape suivante.
Récupérer le tableau en csv pour scraper des infos.
Merci pour vos commentaires.
Bien à vous.
Super! le problème initial est...
- W
Je doute fortement que ça soit la bonne solution, le troisième paramètre correspond à l'argument json de la méthode post...
Quelque chose comme ceci devrait suffire, car les get préalables ne sont probablement pas utiles, sauf peut-être pour choper un cookie préalable, mais je doute. A noter que le fait d'utiliser Session offre la gestion automatique des cookies.
Sinon, je conseille de toujours regarder le status code après chaque requête pour vérifier qu'il n'y a pas d'erreur.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 import requests with requests.Session() as s: url = 'https://www.exemple.fr/login.php' values = {'username': 'mon_identifiant', 'password': 'mon_mdp'} r = requests.post(url, data=values) print(f"Status code: {r.status_code}") print(r.text)
Il y a beaucoup de sites qui font appel à du JS, de l'Ajax ou qui rejettent les bots, sans parler des captchas. Soyez donc conscient du fait que cette méthode ne marchera donc pas sur tous les sites, et il ne faut pas s'en étonner si cela arrive.
ici, ce n'est pas un problème, parce que le premier r ne fait "qu'envoyer des données", seul les données du second seront traitées.Envoyé par Sve@r
pourrait-on envoyer des données avec requests sans stocker le "résultat" dans une variable (puisqu'on ne traite pas le "résultat" de l'envoi) ?
si on ne tient pas compte deen effet, ce n'est pas anodin.Envoyé par binarygirl
![]()
L'appel à une fonction méthode du module requests reste l'appel à une fonction: le boulot sera fait que l'appelant en utilise ou pas le retour (qui n'est pas toujours un "résultat").
Si on n'a pas l'intention de l'utiliser, inutile de le stocker sinon ça fait comme si on avait commencé quelque chose et oublié de le terminer.
La fonction habille un échange de messages sur un réseau, difficile de passer à l'étape/échange suivant sans avoir validé du bon déroulement de l'étape courante et conforter que l'autre côté est en état de recevoir la suite.
- W
Tout à fait, ce n'est pas un problème, juste une inutilité. Un peu comme si, en bash, j'écrivais var="$(ls)"; var="$(date)". Tu dirais quoi si tu voyais ça dans un script?
Oui. Tu as parfaitement le droit, si tu te trouves dans une configuration que tu assures correcte, d'appeler une fonction qui fait un travail sans récupérer son retour. Il peut y avoir par exemple des fonctions qui font un job et qui retournent le nb d'infos traitées, si ça ne t'intéresse pas tu appelles juste la fonction.
C'est un peu l'équivalent d'une redirection dans /dev/null en bash![]()
Mon Tutoriel sur la programmation «Python»
Mon Tutoriel sur la programmation «Shell»
Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
Et on poste ses codes entre balises [code] et [/code]
Mouais. En fait je n'aurais pas dû mettre "ls" car même si c'est amusant de te titiller à ce sujet, dans ce cas précis ça nuit à l'idée que je voulais développer.
Donc non, ce n'est pas un problème, juste une inutilité. Mais une inutilité n'est jamais quelque chose de bon. Ca ne peut mener qu'au mieux à une situation inchangée, et au pire une merde.
Tandis que ne pas écrire d'inutilité ça amène au pire à une situation inchangée et au mieux une situation meilleure. C'est un peu l'équivalent du pari de Pascal mais transcrit en programmation. D'un côté écrire un truc qui ne peut mener, au mieux, qu'à que dalle ; et de l'autre écrire un truc qui même dans le pire des cas, ne posera aucun souci. Vers quoi penche ta morale de développeur? Vu ton niveau bash je n'ai aucun doute sur la réponse qui devrait, suite à cette prise de conscience, te venir à l'esprit![]()
Mon Tutoriel sur la programmation «Python»
Mon Tutoriel sur la programmation «Shell»
Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
Et on poste ses codes entre balises [code] et [/code]
Partager