urllib cookies

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Lasse
User
Beiträge: 112
Registriert: Donnerstag 3. Februar 2011, 18:25

Hallo,
ich versuche gerade mich in eine Seite einzuloggen. Das einloggen an sich klappt auch mit Python 3 und urllib allerdings sollte beim einloggen ein Cookie erstellt werden, was dann an alle späteren Seitenaufrufe mitgeschickt wird. Wie bekomme ich das Cookie und wie schicke ich es bei Anfragen an den Server mit?

LG Lasse
lunar

@Lasse: Sieh Dir die Dokumentation zu urllib an, und suche auf der Seite nach "Cookie". Die entsprechenden Klassen kann man doch eigentlich nicht übersehen. Ansonsten empfiehlt sich auch die Verwendung der Drittbibliothek "requests". Das ist quasi "urllib" in hübsch und komfortabel :)
Lasse
User
Beiträge: 112
Registriert: Donnerstag 3. Februar 2011, 18:25

Gut, ich hatte mir die urllib Dokumentation schon angeschaut bevor ich hier die Frage gestellt habe, aber nicht die nötigen Methoden gefunden. Mit requests bekomme ich noch nicht einmal alle die Sachen zum laufen, die mit urllib funktioniert haben.

Heute habe ich mich noch einmal mit dem Problem beschäftigt und jetzt die mitzuschickenden Cookies gefunden.

Code: Alles auswählen

('Set-Cookie', 'T3E=%3DImY4ATM0ADOiZmO5cDMzgjN4ozM2EjNzozMwYjNzIjNzMTM6Aj
O3UWOxEDN5MzMihDN5UDN0kTM3ITN0EmMjNDMldjY4YDZiRWM3MDZ2oDepJXdvNWYyFmciFkOxIjM4EjOwMCMjEjMygTM; path=/; httponly'),
EDIT: Zeilenumbruch eingefügt um das Forenlayout nicht zu zerstören.

Sie sind in dem von der Webseite geschickten Header enthalten.

Das gesamte Header, was mit der Seite zurückgeschickt wird:

Code: Alles auswählen

 [('Server', 'nginx'), ('Date', 'Sat, 05 May 2012 16:50:03 GMT'), ('Content-Type', 'text/html; charset=UTF-8'), ('Transfer-Encoding', 'chunked'), ('Connection', 'close'), ('Set-Cookie', 'sess_id=b882b2ac227f45f2890b11b7436290a6'), ('Set-Cookie', 'lowRes=0; path=/; httponly'), ('Set-Cookie', 'T3E=%3DImY4ATM0ADOiZmO5cDMzgjN4ozM2EjNzozMwYjNzIjNzMTM6AjO3UWOxEDN5MzMihDN5UDN0kTM3ITN0EmMjNDMldjY4YDZiRWM3MDZ2oDepJXdvNWYyFmciFkOxIjM4EjOwMCMjEjMygTM; path=/; httponly'), ('Expires', 'Mon, 26 Jul 1997 05:00:00 GMT'), ('Last-Modified', 'Sat, 05 May 2012 16:50:03 GMT'), ('Cache-Control', 'no-store, no-cache, must-revalidate'), ('Cache-Control', 'post-check=0, pre-check=0'), ('Pragma', 'no-cache')]
DATA-DICT:  (('sess_id', 'b882b2ac227f45f2890b11b7436290a6'), ('lowRes', '0'), ('T3E', '%3DImY4ATM0ADOiZmO5cDMzgjN4ozM2EjNzozMwYjNzIjNzMTM6AjO3UWOxEDN5MzMihDN5UDN0kTM3ITN0EmMjNDMldjY4YDZiRWM3MDZ2oDepJXdvNWYyFmciFkOxIjM4EjOwMCMjEjMygTM'))
Wie rufe ich jetzt Internetseiten mit den Cookies auf?

Bisher gehe ich so vor:
-Aus dem Header die Tupel mit den Cookies heraussuchen
-Den zweiten Teil des Tupels so umbauen, dass ich ein Tupel dieser Art enthalte: ("Cookiename", "Cookieinhalte")
-Diese Teile werden dann in mein zu sendenes Header eingefügt, mit urllib.parse.encode verarbeitet und als data Argument von urlopen verschickt.

Das Problem ist nur dass es nicht funktioniert, wo liegt mein Denkfehler?

Bin am verzweifeln und für jede Hilfe dankbar.
lunar

@Lasse: Das "data"-Argument von "urlopen()" dient zur Angabe von POST-Daten, und dessen Angabe führt automatisch dazu, dass ein POST- anstelle eines GET-Requests getätigt wird. Cookies aber gehören in den HTTP-Header, und nicht in die POST-Daten, und Du willst sicherlich auch keinen POST-Request absetzen. Um die Cookies anzugeben, musst Du ein "Request"-Objekt erzeugen, und dabei das "headers"-Argument entsprechend setzen. Dazu sind mindestens rudimentäre Kenntnisse des HTTP-Protokolls nötig, welche Dir offensichtlich fehlen, mithin lege ich Dir die Lektüre der entsprechenden RFCs oder zumindest der Wikipedia-Einträge zum Thema nahe.

Allerdings besteht kein Grund, Cookies manuell zu behandeln. Im Modul "urllib.request" findest Du auch die Klasse "HTTPCookieProcessor", die Cookies automatisch behandelt, so dass Du Dich nicht selbst um die korrekten Header kümmern musst. Diese Klasse wird normalerweise nicht aktiviert, daher musst Du mit der Funktion "build_opener()" aus demselben Modul erst einmal ein "Opener"-Modul mit Cookie-Unterstützung erzeugen, wobei Du beim Aufruf dieser Funktion ein Exemplar der "HTTPCookieProcessor"-Klasse angeben musst. Bitte lies die Dokumentation dieser Klassen und Funktionen, dann erschließt sich auch die Art und Weise, wie sie zu verwenden sind.

Natürlich ist das alles recht kompliziert, daher auch mein Rat zu "requests". Dessen Dokumentation enthält einen eigenen Abschnitt über Cookies, und zeigt auch, wie man Cookies über Requests hinweg senden lassen kann. Mithin fällt es mir schwer, Dir abzunehmen, dass Du die Dokumentation wirklich gelesen hast…
Antworten