web-dev-qa-db-fra.com

Comment "se connecter" à un site Web à l'aide du module Requêtes de Python?

J'essaie de publier une demande de connexion à un site Web à l'aide du module Requêtes de Python, mais cela ne fonctionne pas vraiment. Je suis novice dans ce domaine ... et je ne peux donc pas savoir si je devrais créer des cookies avec mon nom d'utilisateur et mon mot de passe ou un type d'autorisation HTTP que j'ai trouvé (??).

from pyquery import PyQuery
import requests

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

Alors maintenant, je pense que je suis censé utiliser "post" et les 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 de mal faire les cookies ... Je ne sais pas.

S'il ne se connecte pas correctement, le titre de la page d'accueil doit apparaître sur "Locationary.com" et dans ce cas, il doit s'agir de "Page d'accueil".

Si vous pouviez peut-être m'expliquer un peu les demandes et les cookies et m'aider à résoudre ce problème, je l'apprécierais grandement. :RÉ

Merci.

... Cela n'a toujours pas encore fonctionné. D'accord ... c'est ce que dit la page d'accueil HTML avant de vous 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>

Donc, je pense que je le fais bien, mais la sortie est toujours "Locationary.com"

2e édition:

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

75
Marcus Johnson

Si les informations que vous souhaitez se trouvent sur la page qui vous est dirigée immédiatement après la connexion ...

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

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

Autrement...

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

39
katy lavallee

Je sais que vous avez trouvé une autre solution, mais pour ceux qui, comme moi, trouvent cette question en cherchant la même chose, vous pouvez le faire avec les requêtes suivantes:

Tout d’abord, comme Marcus, vérifiez la source du formulaire de connexion pour obtenir trois informations: l’URL vers laquelle le formulaire est publié et les attributs de nom des champs nom d’utilisateur et mot de passe. Dans son exemple, ils sont inUserName et inUserPass.

Une fois que vous avez cela, vous pouvez utiliser une instance requests.Session() pour faire une demande de publication dans l'URL de connexion avec vos informations de connexion sous la forme d'une charge utile. Faire des demandes à partir d'une instance de session revient essentiellement à utiliser des demandes normalement, cela ajoute simplement de la persistance, vous permettant de stocker et d'utiliser des cookies, etc.

En supposant que votre tentative de connexion aboutisse, vous pouvez simplement utiliser l'instance de session pour adresser d'autres requêtes au 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...
196
tigerFinch

Laissez-moi essayer de simplifier les choses, supposons que l'URL du site est http://example.com/ et supposons que vous deviez vous inscrire en indiquant votre nom d'utilisateur et votre mot de passe. Nous allons donc à la page de connexion. dis http://example.com/login.php maintenant et affichez son code source et recherchez l'URL de l'action dans la balise de formulaire, quelque chose comme

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

maintenant, utilisez userinfo.php pour créer une URL absolue qui sera ' http://example.com/userinfo.php ', exécutez maintenant un simple script python

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.

30
Tarun Venugopal Nair

Recherchez le nom des entrées utilisées sur le site Web pour les noms d'utilisateurs <...name=username.../> et les mots de passe <...name=password../>, puis remplacez-les dans le script ci-dessous. Remplacez également l'URL pour pointer vers le site de votre choix.

login.py

#!/usr/bin/env python

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

L'utilisation de disable_warnings(InsecureRequestWarning) interrompt toute sortie du script lorsque vous essayez de vous connecter à des sites avec des certificats SSL non vérifiés.

Supplémentaire:

Pour exécuter ce script à partir de la ligne de commande sur un système UNIX, placez-le dans un répertoire, c'est-à-dire 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

Créez ensuite 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, lancez login

1
David

La solution requests.Session() a facilité la connexion à un formulaire avec protection CSRF (utilisé dans les formulaires Flask-WTF). Vérifiez si un csrf_token est requis en tant que champ masqué et ajoutez-le à la charge utile avec le nom d'utilisateur et le mot de passe:

import requests
from bs4 import BeautifulSoup

payload = {
    'email': '[email protected]',
    '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)
0
naaman