Wie kann ich mich mit Python auf einer Website anmelden?


87

Wie kann ich es tun? Ich habe versucht, einen bestimmten Link (mit urllib) einzugeben, aber dazu muss ich mich anmelden.

Ich habe diese Quelle von der Website:

<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" />

Ist das möglich?

Antworten:


70

Vielleicht möchten Sie Twill verwenden . Es ist recht einfach zu bedienen und sollte in der Lage sein, das zu tun, was Sie wollen.

Es wird wie folgt aussehen:

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

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

submit('0')

Sie können showforms()alle Formulare go…auflisten, sobald Sie zu der Site navigiert haben, für die Sie sich anmelden möchten. Probieren Sie es einfach mit dem Python-Interpreter aus.


Beachten Sie, dass Sie in einigen Fällen submit () verwenden müssen. Siehe: lists.idyll.org/pipermail/twill/2006-August/000526.html Ich bestätige dieses Problem, indem ich mich mit submit () works bei www.pge.com anmelde.
user391339

2
Gibt es eine Lösung für Python 3.6? Es scheint, dass Twill weder Python 3.5 noch 3.6 unterstützt. Ich habe versucht, es herunterzuladen und mit zu konvertieren, 2to3aber jetzt bekomme ich eine, ModuleNotFoundErrorwenn ich versuche, es zu importieren.
CGFoX

Eigentlich könnte ich das ModuleNotFoundErrordurch Verwenden / Konvertieren von Twill 1.8.0 und Installieren lxmlund requestsmit lösen pip install. Aber jetzt bekomme ich eine, SyntaxErrorwenn ich versuche zu importieren, weil irgendwo False = 0....
CGFoX

2
Es ist eine Art Schmerz, es zu beheben, aber es funktioniert: stackoverflow.com/a/45459994/2745116
CGFoX

Funktioniert es mit HTTPs Standorten arbeiten oder ich habe so etwas wie zu tun dies ?
Mahesha999

51

Lassen Sie mich versuchen, es einfach zu machen. Angenommen, die URL der Website lautet www.example.com, und Sie müssen sich anmelden, indem Sie Benutzername und Passwort eingeben. Wir gehen also zur Anmeldeseite und sagen http://www.example.com/login .php jetzt und sehen Sie sich den Quellcode an und suchen Sie nach der Aktions-URL, die in Form eines Tags vorliegen soll

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

Nehmen Sie jetzt userinfo.php, um eine absolute URL zu erstellen, die " http://example.com/userinfo.php " lautet. Führen Sie nun ein einfaches Python-Skript aus

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

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

Ich hoffe, dass dies irgendwann jemandem irgendwo hilft.


Dies funktioniert nicht für die meisten Websites, die ich ausprobiert habe
Anurag Pandey

Von den zwei Dutzend Hilfe- / Stapelüberlaufseiten, die ich mir angesehen habe, war dies die einzige Lösung, die auf der einen Site funktionierte, die ich brauchte.
Boje

Die beste Wahl für die Webautomatisierung ist der Webbot. stackoverflow.com/a/51170181/6665568
Natesh bhat

Sind alle Werte immer Benutzername und Passwort? Ich glaube nicht, dass dies für meine ausgewählte Site funktioniert.
Dylan Logan

@DylanLogan Sie müssen immer überprüfen, was die eigentliche Webseite an den Server sendet, und Ihr Skript daran anpassen. Der Server sollte nicht in der Lage sein, zwischen Ihrem Skript und dem Webbrowser zu unterscheiden.
Jeyekomon

28

Normalerweise benötigen Sie Cookies, um sich auf einer Website anzumelden. Dies bedeutet cookielib, urllib und urllib2. Hier ist eine Klasse, die ich zurückgeschrieben habe, als ich Facebook-Web-Spiele gespielt habe:

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())

Sie werden nicht unbedingt die HTTPS- oder Redirect-Handler benötigen, aber sie tun nicht weh und machen den Opener viel robuster. Möglicherweise benötigen Sie auch keine Cookies, aber es ist schwer, dies anhand des von Ihnen geposteten Formulars zu erkennen. Ich vermute, dass Sie dies möglicherweise nur aufgrund der auskommentierten Eingabe "Erinnere dich an mich" tun.


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

Weitere Informationen finden Sie unter: https://docs.python.org/2/library/urllib2.html


Der Link funktioniert nicht: a 2wurde in den docs.python.orgURLs hinzugefügt : docs.python.org/2/library/urllib2.html
Michael Kopp

18

Webseitenautomatisierung? Auf jeden Fall "Webbot"

webbot funktioniert sogar auf Webseiten, deren ID und Klassennamen sich dynamisch ändern und die mehr Methoden und Funktionen als Selen oder Mechanisierung aufweisen.

Hier ist ein Ausschnitt :)

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 ^_^

Die Dokumente sind auch ziemlich einfach und einfach zu bedienen: https://webbot.readthedocs.io


Dieses Beispiel funktioniert hervorragend. Funktioniert das auch wo autocomplete=off?
S Andrew

nicht auf Win 64 Bit installieren. Fehler:Could not find a version that satisfies the requirement webbot (from versions: 0.0.1.win-amd64)
Mostafa

Versuchen Sie es mit Python3
Natesh Bhat

Wie gehe ich mit Iframe in Webbot um? Ich meine, ich muss einen Iframe schließen, der nach dem Laden der Seite erscheint.
Arihanth Jain

7

Websites im Allgemeinen können die Autorisierung auf viele verschiedene Arten überprüfen, aber die, auf die Sie abzielen, scheint es Ihnen einigermaßen einfach zu machen.

Sie müssen lediglich einen formularcodierten Blob mit den verschiedenen Feldern POSTan die auth/loginURL senden (vergessen Sie die Beschriftungen for, sie sind Dekoration für menschliche Besucher). handle=whatever&password-clear=pwdund so weiter, solange Sie die Werte für das Handle (AKA-E-Mail) und das Passwort kennen, sollte es Ihnen gut gehen.

Vermutlich leitet POST Sie auf eine Seite "Sie haben sich erfolgreich angemeldet" mit einem Set-CookieHeader weiter, der Ihre Sitzung bestätigt (speichern Sie dieses Cookie und senden Sie es bei weiterer Interaktion während der Sitzung zurück!).


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.