Comment puis-je me connecter à un site Web avec Python?


87

Comment puis-je le faire? J'essayais d'entrer un lien spécifié (avec urllib), mais pour le faire, je dois me connecter.

J'ai cette source sur le site:

<form id="login-form" action="auth/login" method="post">
    <div>
    <!--label for="rememberme">Remember me</label><input type="checkbox" class="remember" checked="checked" name="remember me" /-->
    <label for="email" id="email-label" class="no-js">Email</label>
    <input id="email-email" type="text" name="handle" value="" autocomplete="off" />
    <label for="combination" id="combo-label" class="no-js">Combination</label>
    <input id="password-clear" type="text" value="Combination" autocomplete="off" />
    <input id="password-password" type="password" name="password" value="" autocomplete="off" />
    <input id="sumbitLogin" class="signin" type="submit" value="Sign In" />

Est-ce possible?

Réponses:


70

Vous souhaitez peut-être utiliser du sergé . Il est assez facile à utiliser et devrait pouvoir faire ce que vous voulez.

Cela ressemblera à ceci:

from twill.commands import *
go('http://example.org')

fv("1", "email-email", "blabla.com")
fv("1", "password-clear", "testpass")

submit('0')

Vous pouvez utiliser showforms()pour répertorier tous les formulaires une fois que vous avez utilisé go…pour parcourir le site auquel vous souhaitez vous connecter. Essayez-le simplement depuis l'interpréteur python.


notez que dans certains cas, vous devez utiliser submit (). voir: lists.idyll.org/pipermail/twill/2006-August/000526.html Je confirme ce problème, pour moi, en me connectant à www.pge.com, en utilisant submit () fonctionne.
user391339

2
Existe-t-il une solution pour Python 3.6? Il semble que twill ne prend pas en charge Python 3.5 ni 3.6. J'ai essayé de le télécharger et de le convertir en utilisant 2to3mais maintenant j'obtiens un ModuleNotFoundErroren essayant de l'importer.
CGFoX

En fait, je pourrais résoudre le problème ModuleNotFoundErroren utilisant / convertissant Twill 1.8.0 et en installant lxmlet requestsavec pip install. Mais maintenant j'obtiens un SyntaxErrorquand j'essaye d'importer parce que quelque part False = 0....
CGFoX

2
C'est un peu
pénible

Cela fonctionne-t-il avec les sites HTTP ou je dois faire quelque chose comme ça ?
Mahesha999

51

Laissez-moi essayer de faire simple, supposons que l'URL du site est www.example.com et que vous devez vous inscrire en remplissant le nom d'utilisateur et le mot de passe, nous allons donc à la page de connexion, dites http://www.example.com/login .php maintenant et affichez son code source et recherchez l'URL d'action, il sera sous forme de balise quelque chose comme

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

maintenant, prenez 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.


cela ne fonctionne pas pour la plupart des sites Web que j'ai essayés
Anurag Pandey

Sur les deux douzaines de pages d'aide / stackoverflow que j'ai consultées, c'était la seule solution qui fonctionnait sur le site dont j'avais besoin.
Bouée du

le meilleur choix pour l'automatisation Web est le webbot. stackoverflow.com/a/51170181/6665568
Natesh bhat

Toutes les valeurs sont-elles toujours un nom d'utilisateur et un mot de passe? Je ne pense pas que cela semble fonctionner pour mon site choisi.
Dylan Logan

@DylanLogan Vous devez toujours inspecter ce que la page Web envoie au serveur et y adapter votre script. Le serveur ne doit pas être en mesure de faire la distinction entre votre script et le navigateur Web.
Jeyekomon

28

En règle générale, vous aurez besoin de cookies pour vous connecter à un site, ce qui signifie cookielib, urllib et urllib2. Voici un cours que j'ai écrit lorsque je jouais à des jeux Web Facebook:

import cookielib
import urllib
import urllib2

# set these to whatever your fb account is
fb_username = "your@facebook.login"
fb_password = "secretpassword"

class WebGamePlayer(object):

    def __init__(self, login, password):
        """ Start up... """
        self.login = login
        self.password = password

        self.cj = cookielib.CookieJar()
        self.opener = urllib2.build_opener(
            urllib2.HTTPRedirectHandler(),
            urllib2.HTTPHandler(debuglevel=0),
            urllib2.HTTPSHandler(debuglevel=0),
            urllib2.HTTPCookieProcessor(self.cj)
        )
        self.opener.addheaders = [
            ('User-agent', ('Mozilla/4.0 (compatible; MSIE 6.0; '
                           'Windows NT 5.2; .NET CLR 1.1.4322)'))
        ]

        # need this twice - once to set cookies, once to log in...
        self.loginToFacebook()
        self.loginToFacebook()

    def loginToFacebook(self):
        """
        Handle login. This should populate our cookie jar.
        """
        login_data = urllib.urlencode({
            'email' : self.login,
            'pass' : self.password,
        })
        response = self.opener.open("https://login.facebook.com/login.php", login_data)
        return ''.join(response.readlines())

Vous n'aurez pas nécessairement besoin des gestionnaires HTTPS ou Redirect, mais ils ne font pas de mal, et cela rend l'ouvreur beaucoup plus robuste. Vous n'avez peut-être pas besoin de cookies, mais il est difficile de le dire uniquement à partir du formulaire que vous avez publié. Je soupçonne que vous pourriez, uniquement à partir de l'entrée «Souvenez-vous de moi» qui a été commentée.


19
import cookielib
import urllib
import urllib2

url = 'http://www.someserver.com/auth/login'
values = {'email-email' : 'john@example.com',
          'password-clear' : 'Combination',
          'password-password' : 'mypassword' }

data = urllib.urlencode(values)
cookies = cookielib.CookieJar()

opener = urllib2.build_opener(
    urllib2.HTTPRedirectHandler(),
    urllib2.HTTPHandler(debuglevel=0),
    urllib2.HTTPSHandler(debuglevel=0),
    urllib2.HTTPCookieProcessor(cookies))

response = opener.open(url, data)
the_page = response.read()
http_headers = response.info()
# The login cookies should be contained in the cookies variable

Pour plus d'informations, visitez: https://docs.python.org/2/library/urllib2.html


Le lien ne fonctionne pas: un a 2été ajouté dans les docs.python.orgurls: docs.python.org/2/library/urllib2.html
Michael Kopp

18

Automatisation de page Web? Certainement "webbot"

webbot fonctionne même des pages Web qui ont des identifiants et des noms de classe qui changent dynamiquement et qui ont plus de méthodes et de fonctionnalités que le sélénium ou la mécanisation.

Voici un extrait :)

from webbot import Browser 
web = Browser()
web.go_to('google.com') 
web.click('Sign in')
web.type('mymail@gmail.com' , into='Email')
web.click('NEXT' , tag='span')
web.type('mypassword' , into='Password' , id='passwordFieldId') # specific selection
web.click('NEXT' , tag='span') # you are logged in ^_^

Les documents sont également assez simples et simples à utiliser: https://webbot.readthedocs.io


Cet examen fonctionne très bien. Cela fonctionnera-t-il également où autocomplete=off.?
S Andrew

ne pas installer sur win 64 bits. Erreur:Could not find a version that satisfies the requirement webbot (from versions: 0.0.1.win-amd64)
Mostafa

Essayez d'utiliser python3
Natesh bhat

Comment gérer l'iframe dans le webbot? Je veux dire que je dois fermer un iframe qui apparaît après le chargement de la page ..
Arihanth Jain

7

Les sites Web en général peuvent vérifier l'autorisation de différentes manières, mais celle que vous ciblez semble vous faciliter la tâche.

Tout ce dont vous avez besoin est d' attribuer POSTà l' auth/loginURL un blob codé par formulaire avec les différents champs que vous y voyez (oubliez les étiquettes for, ce sont des décorations pour les visiteurs humains). handle=whatever&password-clear=pwdet ainsi de suite, tant que vous connaissez les valeurs du handle (AKA email) et du mot de passe, tout devrait bien se passer.

Vraisemblablement, POST vous redirigera vers une page "vous vous êtes connecté avec succès" avec un en- Set-Cookietête validant votre session (assurez-vous de sauvegarder ce cookie et de le renvoyer lors d'une nouvelle interaction au cours de la session!).


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.