Seite 1 von 1

Login auf einer Webseite

Verfasst: Dienstag 3. April 2007, 16:24
von Marcus
Moin,

ich will mich per Python Script auf einer Webseite einloggen, um dort eine Datei herunter zu laden, was auch sonst.

Allerdings ist das Login auf der Seite als Form realisiert und entweder bin ich zu doof oder finde es einfach nicht, aber urllib kann das nicht?!?

Hier die Formulardefinition der Seite:

Code: Alles auswählen

<form name="LoginForm" method="post" action="/login.asp">
<table border="0">
<tr>
<td>Username:</td>
<td><input type="text" name="username" class="boxes" style="width:150px;" value=""></td>
</tr>
<tr>
<td>Password:</td><td><input type="password" name="password" class="boxes" id="Password1" style="width:150px;"></td>
</tr>
<tr>
<td><input type="checkbox" name="remember" value="1" 0>Save password</td>
</tr>
<tr>
<td>
<input type="hidden" name="Check" value="OK" id="Hidden1">
<input  type="submit" name="login" value="Login" style="width:150px;">
<input type="hidden" name="r" value="/">
<input type="hidden" name="t" value="/data/index.asp?">
</td>
</tr></table>
</form>
Ich müsste also die beiden Variablen username und password belegen und die post action auslösen, aber wie geht das mit urllib? Die Dokumentation von der Seite bringt mich auch noch mal um den Verstand. Geht das überhaupt mit urllib und falls nicht, wie geht es dann?

So verständlich ich Python Code normalerweise finde, so wenig verstehe ich die wenigen Beispiele zu urllib.

Es grüßt,
Marcus

Verfasst: Dienstag 3. April 2007, 17:09
von Leonidas
Deswegen auch urllib2. Ähnlicher Thread dazu.

Verfasst: Freitag 6. April 2007, 00:07
von pythonist
Ich hab dir mal auf die schnelle ne kleine Klasse geschrieben die alles hat was du dazu brauchen solltest, ich habs nicht getestet also keine Garantie auf Funktion:

Code: Alles auswählen

from urllib import urlencode
from BeautifulSoup import BeautifulSoup
import urllib2

class wasweisich:

    def login(self, url, user, pw):
        ws = urllib2.urlopen(url)
        soup = BeautifulSoup(ws.read())
        ws.close()
        postdata = urlencode({"username":user, "password":pw, "remember":1, "Check":soup.find("input", {"name":"Check"})["value"], "login":soup.find("input", {"name":"login"})["value"], "r":soup.find("input", {"name":"r"})["value"], "t":soup.find("input", {"name":"r"})["value"]}
        ws = urllib2.urlopen(url, postdata)
        info = ws.info()
        cookie = [x.split(';')[0] for x in info['Set-Cookie'].split(', ')]
        cookielist = []
        for x in range(0,len(cookie),2):
            cookielist.append(cookie[x])
        self.cookie = ";".join(cookielist)

    def getfile(self, url):
        req = urllib2.Request(url)
        req.add_header('Cookie', self.cookie)
        ws = urllib2.urlopen(req)
        return ws
Wie dus benutzt sollte ja selbsterklärend sein

Gute Nacht

pythonist