Nun, damit wir hier nicht den Eindruck bekommen, dass ich hier wild auf die Tastatur klopfe - in der Hoffnung, es ergeben zufällig paar nützliche Python-Befehle - werde ich mich mal bemühen den Code so zu beschreiben wie ich ihn interpretiere. Es wird sich dann zeigen, ob ich wirklich nur blind rate
Zeile 1: Die Bibliothek
requests wird importiert. Diese Bibliothek benötigen wir um später überhaupt mit dem Web-Server kommunizieren zu können
Zeile 2: Hier wird die "Basis Authentifizierung" importiert. Warum? Weil viele Web-Services, die eine Authentifizierung erfordern, in der Regel die
HTTPBasicAuth akzeptieren.
Zeile 3: Die Bibliothek
shutil wird importiert. Wird später für Dateioperationen benötigt (Kopiervorgang).
Zeile 5: Ich definiere hier eine
def get_logged_in_session():-Funktion. Diese Funktion werden zwei Argumente hinzugefügt, einmal
user und einmal
pwd.
Zeile 7: Hier wird eine Session-Instanz aufgebaut. Mit diesem Session-Objekt wird ermöglicht, dass bestimmte Parameter (z.B. Benutzername und Passwort) bestehen bleiben.
Zeile 8: Nun erstelle ich mit HTTPBasicAuth eine Anfrage. Ich übergebe der
get()-Methode eine URL, die geschützt ist, und dann durch einen Komma getrennt die Authentifizierung (
auth=HTTPBasicAuth(user,pwd)). user und pwd sind hierbei Argumente. Wenn diese Funktion aufgerufen wird, werden der Funktion Argumente übergeben. Die Argumente werden verarbeitet und für die Anfrage verwendet. Jetzt habe ich ein sogenanntes Response-Objekt (
resp). Dort werden die Informationen gespeichert. Dieser Vorgang ist deswegen wichtig, damit ich im späteren Verlauf immer wieder auf das Response-Objekt zugreifen kann.
Zeile 12: Das Response-Objekt verfügt über ein
status_code()-Attribut. Ich lasse mir anzeigen, wie der gegenwärtige Status lautet. War die Anmeldung erfolgreich, dann bekommt man die Zahl 200. Bekommt man unter anderem die Zahl 401, dann kann man davon ausgehen, dass die Anmeldung fehlgeschlagen ist.
Zeile 13: Ich lasse mir mit Hilfe des
text-Attributes den Inhalt ausgeben. Auf meinem Web-Server wird der entsprechende Anwender auf eine bestimmte nach erfolgreicher Anmeldung auf Text-Datei weitergeleitet. Hier bekomme ich also den Inhalt der Text-Datei angezeigt. In meinem Fall wird dann eine URL angezeigt. Der Inhalt wird in die
content_txt_file-Variable gespeichert.
Zeile 14: Hier wird das Objekt cookie über die Print-Anweisung ausgegeben.
Zeile 15: Zur Überprüfung lasse noch einmal den Inhalt per Print-Anweisung ausgeben, um sicher zu gehen, ob ich hier eine URL habe. Also greife ich auf die
content_txt_file-Variable zu.
Zeile 18: Hier wird das Herunterladen vorbereitet. Ich greife also auf die
content_txt_file-Variable zu. Denn dort ist ja die URL gespeichert, die mir sagt, wo die Datei gespeichert ist. Darüber hinaus verwende ich
stream=True. Auf diese Weise bleibt die Verbindung geöffnet und der Header wird heruntergeladen. All diese Information wird in ein Response-Objekt (
response) gespeichert.
Zeile 19: Hier beginne ich mit einer with-Anweisung. Mit dieser Anweisung erspare ich mit hinterher das Schließen der Datei. Denn die with-Anweisung macht es quasi für mich. In der with-Anweisung finden wir zwei Parameter. Im ersten Parameter gebe ich einen Namen an. Den kann man beliebig benennen. Hier heißt meine Datei nach dem Herunterladen
test_rar.rar. Der zweite Parameter besagt zunächst, dass schreibend (
w) auf die Datei zugegriffen werden soll. Warum? Wenn eine Datei heruntergeladen wird, muss schreibend darauf zugegriffen werden. Das
b ist ein Modus, hier greife ich also schreibend und binär auf die Datei zu. Innerhalb der with-Anweisung muss man diesen Vorgang mit eigenen Variablen deklarieren. Da es sich hierbei um eine heruntergeladene Datei handelt, die schreibend erstellt wird, deklariere ich es als (
as)
out_file. Im späteren Verlauf ist also die Variable
out_file für die Verwendung wichtig.
Zeile 20: Jetzt kommen wir zum
shutil-Modul. Ich bediene mich in diesem Kontext der
copyfileobj ()-Methode. Warum? Wir erinnern uns, dass ich während des Herunterladen schreibend auf eine Datei zugreife. Mit diese Methode wird es mir also möglich sein, das Kopieren einer Datei mit dem tatsächlichen Dateiobjekt. Das heißt, die Datei, die auf dem Server liegt, wird schreibend auf dem lokalen Rechner asl Dateiobjekt kopiert. Mit einem Blick in die Methode sehen wir, dass ich
response.raw verwende. Damit ich das Attribut
raw verwenden kann, muss also
stream=True gegeben sein. Ich bekomme hier also eine rohe Antwort vom Webserver. Und in dieser Methode steckt ein weiter Parameter
out_file, hier wird gesagt, in welches Dateiobjekt die Datei auf dem Rechner kopiert werden soll, die vom Server herunterladen wird.
Zeile 21: Hier lösche ich das Response-Objekt, sprich ich leere das Objekt. Weil ich es nach dem erfolgreichen Herunterladen nicht mehr gebrauchen kann.
Zeile 22: Und ich schließe auch die erste Anfrage (
resp), um die Kommunikation mit dem Web-Server zu unterbrechen. Ich muss ja nicht mehr mit dem Web-Server kommunizieren. Hat sich ja alles erledigt.
Zeile 25: Wird das Modul als Haupt-Modul gestartet, also nicht ein einem anderen Modul aus, dann greift hier eine Bedingung.
Zeile 26 und Zeile 27: : Hier werden Informationen für die Anmeldung in den jeweiligen Variablen gespeichert. Hier werden die Informationen mittels String-Literale angegeben, d. h. direkt im Modul angegeben. Die Angaben werden also nicht erst zur Laufzeit bekannt gegeben, sondern schon vorher festgelegt.
Zeile 28: Nun rufe ich die
get_logged_in_session()-Funktion auf. Der Funktion werden dann die zuvor festgelegten Informationen (
user_name und
user_password) als Argumente übergeben.
Code: Alles auswählen
import requests
from requests.auth import HTTPBasicAuth
import shutil
def get_logged_in_session(user, pwd):
s = requests.session()
resp = s.get('http://xarphus.de/protect_folder/', auth=HTTPBasicAuth(user,pwd))
print "Status: ", resp.status_code
content_txt_file = resp.text
print "Cookies: ", s.cookies
print "Content of txt file: ", content_txt_file
print "start downloading"
response = s.get(content_txt_file, stream=True)
with open('test_rar.rar', 'wb') as out_file:
shutil.copyfileobj(response.raw, out_file)
del response
resp.close
if __name__ == '__main__':
user_name = 'test_account'
user_password = 'test_user'
get_logged_in_session(user_name, user_password)