133 votes

Comment se "connecter" à un site web en utilisant le module Requests de Python ?

J'essaie d'envoyer une demande de connexion à un site Web en utilisant le module Requests de Python, mais cela ne fonctionne pas vraiment. Je suis novice en la matière... et je n'arrive pas à savoir si je dois créer des cookies pour mon nom d'utilisateur et mon mot de passe ou si je dois utiliser une sorte d'autorisation HTTP que j'ai trouvée ( ??).

from pyquery import PyQuery
import requests

url = 'http://www.locationary.com/home/index2.jsp'

Donc maintenant, je pense que je dois utiliser "post" et cookies.....

ck = {'inUserName': 'USERNAME/EMAIL', 'inUserPass': 'PASSWORD'}

r = requests.post(url, cookies=ck)

content = r.text

q = PyQuery(content)

title = q("title").text()

print title

J'ai l'impression que je fais mal le truc des cookies... je ne sais pas.

S'il ne se connecte pas correctement, le titre de la page d'accueil devrait être "Locationary.com" et si c'est le cas, il devrait être "Home Page".

Si vous pouviez m'expliquer quelques notions sur les requêtes et les cookies et m'aider à résoudre ce problème, je vous en serais très reconnaissant. :D

Gracias.

...ça n'a pas encore vraiment fonctionné. Ok... voici ce que dit le HTML de la page d'accueil avant de se connecter :

</td><td><img src="http://www.locationary.com/img/LocationaryImgs/icons/txt_email.gif">    </td>
<td><input class="Data_Entry_Field_Login" type="text" name="inUserName" id="inUserName"  size="25"></td>
<td><img src="http://www.locationary.com/img/LocationaryImgs/icons/txt_password.gif"> </td>
<td><input  class="Data_Entry_Field_Login"  type="password" name="inUserPass"     id="inUserPass"></td>

Je crois que je fais bien les choses, mais le résultat est toujours "Locationary.com".

2ème EDITION :

Je veux pouvoir rester connecté pendant une longue période et, chaque fois que je demande une page sous ce domaine, je veux que le contenu s'affiche comme si j'étais connecté.

294voto

tigerFinch Points 736

Je sais que vous avez trouvé une autre solution, mais pour ceux qui, comme moi, qui trouvent cette question, cherchent la même chose, il est possible d'y parvenir avec les demandes suivantes :

Tout d'abord, comme l'a fait Marcus, vérifiez la source du formulaire de connexion pour obtenir trois informations - l'url vers laquelle le formulaire est posté, et les attributs de nom des champs nom d'utilisateur et mot de passe. Dans son exemple, il s'agit de inUserName et inUserPass.

Une fois que vous l'avez obtenu, vous pouvez utiliser une requests.Session() pour effectuer une requête post vers l'url de connexion avec vos données de connexion comme charge utile. Faire des demandes à partir d'une instance de session est essentiellement la même chose que d'utiliser des demandes normales, cela ajoute simplement de la persistance, vous permettant de stocker et d'utiliser des cookies, etc.

En supposant que votre tentative de connexion a réussi, vous pouvez simplement utiliser l'instance de session pour effectuer d'autres demandes sur le site. Le cookie qui vous identifie sera utilisé pour autoriser les demandes.

Exemple

import requests

# Fill in your details here to be posted to the login form.
payload = {
    'inUserName': 'username',
    'inUserPass': 'password'
}

# Use 'with' to ensure the session context is closed after use.
with requests.Session() as s:
    p = s.post('LOGIN_URL', data=payload)
    # print the html returned or something more intelligent to see if it's a successful login page.
    print p.text

    # An authorised request.
    r = s.get('A protected web page url')
    print r.text
        # etc...

60voto

katy lavallee Points 1123

Si l'information que vous voulez se trouve sur la page vers laquelle vous êtes dirigé immédiatement après la connexion...

Appelons votre ck variable payload à la place, comme dans le python-requêtes docs :

payload = {'inUserName': 'USERNAME/EMAIL', 'inUserPass': 'PASSWORD'}
url = 'http://www.locationary.com/home/index2.jsp'
requests.post(url, data=payload)

Sinon...

Voir https://stackoverflow.com/a/17633072/111362 ci-dessous.

47voto

Je vais essayer de faire simple, supposons que l'URL du site est le suivant http://example.com/ et supposons que vous devez vous inscrire en indiquant votre nom d'utilisateur et votre mot de passe, nous allons donc aller sur la page de connexion et dire http://example.com/login.php maintenant, affichez le code source et cherchez l'URL de l'action, elle sera dans une balise de formulaire, comme suit

 <form name="loginform" method="post" action="userinfo.php">

maintenant prenez userinfo.php pour faire l'URL absolue qui sera ' http://example.com/userinfo.php Exécutez maintenant un simple script python script.

import requests
url = 'http://example.com/userinfo.php'
values = {'username': 'user',
          'password': 'pass'}

r = requests.post(url, data=values)
print r.content

J'espère que cela aidera quelqu'un quelque part un jour.

11voto

naaman Points 385

Le site requests.Session() a aidé à se connecter à un formulaire avec une protection CSRF (comme celle utilisée dans les formulaires Flask-WTF). Vérifiez si un csrf_token est requis en tant que champ caché et l'ajoute aux données utiles avec le nom d'utilisateur et le mot de passe :

import requests
from bs4 import BeautifulSoup

payload = {
    'email': 'email@example.com',
    'password': 'passw0rd'
}     

with requests.Session() as sess:
    res = sess.get(server_name + '/signin')
    signin = BeautifulSoup(res._content, 'html.parser')
    payload['csrf_token'] = signin.find('input', id='csrf_token')['value']
    res = sess.post(server_name + '/auth/login', data=payload)

7voto

David Points 331

Trouvez le nom des entrées utilisées dans le formulaire des sites Web pour les noms d'utilisateur. <...name=username.../> et les mots de passe <...name=password../> et les remplacer dans le script ci-dessous. Remplacez également l'URL pour qu'elle pointe vers le site souhaité pour se connecter.

login.py

#!/usr/bin/env python

import requests
from requests.packages.urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
payload = { 'username': 'user@email.com', 'password': 'blahblahsecretpassw0rd' }
url = 'https://website.com/login.html'
requests.post(url, data=payload, verify=False)

L'utilisation de disable_warnings(InsecureRequestWarning) réduira au silence toute sortie du script lors d'une tentative de connexion à des sites avec des certificats SSL non vérifiés.

Extra :

Pour exécuter ce script à partir de la ligne de commande sur un système basé sur UNIX, placez-le dans un répertoire, c.-à-d. home/scripts et ajoutez ce répertoire à votre chemin dans ~/.bash_profile ou un fichier similaire utilisé par le terminal.

# Custom scripts
export CUSTOM_SCRIPTS=home/scripts
export PATH=$CUSTOM_SCRIPTS:$PATH

Ensuite, créez un lien vers ce script python à l'intérieur de home/scripts/login.py

ln -s ~/home/scripts/login.py ~/home/scripts/login

Fermez votre terminal, démarrez-en un nouveau, exécutez login

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X