Kapitel 23
Internet-Programmierung
634
Mit der Methode retrbinary() laden Sie die Datei herunter. Als zweites Argument über-
geben Sie den Namen der
write()-Methode des File-Objektes. Damit wird die entfernte
Datei in das lokale File-Objekt geschrieben.
Hat alles geklappt? Schauen Sie sich das Bild an. Das Bildmaterial des DLR dürfen Sie zur
persönlichen Information verwenden. Nur wenn Sie es veröffentlichen wollen, müssen Sie
sich vorher beim DLR über die Bedingungen informieren.
23.2.3 Ein Suchroboter für FTP-Server
Wir entwickeln nun ein Programm, das den öffentlich zugänglichen Bereich eines FTP-
Servers durchsucht und die Pfade aller Dateien ausgibt, in deren Namen eine bestimmte
Zeichenkette (Suchwort) vorkommt. Abbildung 23.3 zeigt die Benutzungsoberfläche.
Abb. 23.3: Suche nach Dateien im öffentlichen Bereich eines FTP-Servers
Hinweis zur Netiquette
Unter der Netiquette versteht man einen Verhaltenskodex für die Arbeit mit dem Internet.
Programme, die das Internet nutzen, verursachen Kosten und können sogar Schaden
anrichten. Bei Experimenten mit Suchrobotern sollte man grundsätzlich vorsichtig sein und
folgende Regeln beachten:
Beschränken Sie die Suche auf einen bescheidenen Suchraum.
Führen Sie umfangreiche Zugriffe auf Server nach Möglichkeit außerhalb der üblichen
Bürozeiten (Ortszeit) durch.
Vermeiden Sie ganz allgemein eine übertriebene Belastung des Netzes und der Server,
mit denen Ihr Programm Kontakt aufnimmt.
Starten Sie nur Internet-Programme, von denen Sie genau wissen, was sie tun.
>>> f = open('wetterbild.jpg','wb')
>>> ftp.retrbinary('RETR 1301271048.de.jpg', f.write)
'226 Transfer complete.'
>>> f.close()
635
23.2
Übertragung von Dateien mit FTP
Arbeitsweise des Suchroboters
Das Skript besteht aus zwei Klassendefinitionen und der Instanziierung eines Objektes der
Klasse
Archie. Abbildung 23.4 gibt die Klassenstruktur wieder. Das Archie-Objekt enthält
die Benutzungsoberfläche. Beim Klick auf den S
UCHE!-Button wird der Suchroboter (Objekt
der Klasse
Robot) in einem eigenen Thread gestartet. Der Roboter nimmt Kontakt mit dem
angegebenen FTP-Server auf und durchläuft nach dem Algorithmus der Breitensuche den
Verzeichnisbaum. Er beginnt im Wurzelverzeichnis / und untersucht jedes Verzeichnis auf
folgende Weise:
Alle Unterverzeichnisse (d.h. ihr vollständiger Pfad) werden an die Liste schlange ange-
hängt.
Alle Dateien, in deren Namen das Suchwort vorkommt, werden im Textfeld der Benut-
zungsoberfläche ausgegeben (vollständige Pfade).
Abb. 23.4: UML-Klassendiagramm für das Suchprogramm
Skript:
# ftpsucher.pyw
from tkinter import*
from threading import *
import ftplib
class Archie(object):
def __init__(self):
self.initOberflaeche()
def initOberflaeche(self):
self.fenster = Tk()
self.fenster.title('Mini-Archie')
self.suchwort = StringVar() #1
self.server=StringVar()
self.oben=Frame(self.fenster) #2
self.oben.pack(padx=5, pady=5)
Robot
start()
run()
breitensuche()
ob
schlange
Archie
initOberflaeche()
suche()
server
suchwort
text
Tkinter.Text
threading.Thread
Kapitel 23
Internet-Programmierung
636
Label(self.oben, text='Server: ').pack(side=LEFT)
Entry(self.oben,
textvariable=self.server).pack(side=LEFT)
Label(self.oben,
text=' Suchwort: ').pack(side=LEFT)
Entry(self.oben,
textvariable=self.suchwort).pack(side=LEFT)
Button(self.oben, text=' Suche! ',
command=self.suche).pack(side=LEFT, padx=5)
self.text = Text(self.fenster)
self.text.pack(padx=5, pady=5)
self.fenster.mainloop()
def suche(self): #3
Robot(self) #4
class Robot(Thread):
def __init__(self, oberflaeche):
Thread.__init__(self) #5
self.ob = oberflaeche #6
self.start() #7
def run(self):
self.ob.text.delete('1.0', END) #8
self.ob.text.insert(END, 'Suchergebnis:\n\n')
self.server = self.ob.server.get()
self.suchwort = self.ob.suchwort.get()
try:
self.ftp = ftplib.FTP(self.server, 'anonymous',
'ich@meinedomain.de') #9
self.schlange = ['/'] #10
self.breitensuche()
self.ftp.quit() #11
self.ob.text.insert(END,'--- Ende der Suche ---')
except: #12
self.ob.text.insert(END,'Kein anonymes Login moeglich.')
def breitensuche(self): #13
while self.schlange:
self.pfad = self.schlange[0]
del self.schlange[0]
637
23.2
Übertragung von Dateien mit FTP
Erläuterung:
#1: Kontrollvariablen für den Domain-Namen des Servers und das Suchwort. An diese Vari-
ablen werden die beiden Entry-Widgets gekoppelt.
#2: Die oberen – waagrecht angeordneten – Widgets werden in einen Frame gepackt.
#3: Die Methode wird aufgerufen, wenn der Button angeklickt wird.
#4: Ein anonymes Objekt der Klasse Robot wird instanziiert. Achtung: Da die Klasse Robot
von threading.Thread abgeleitet ist, wird bei jedem Klick ein neuer Thread gestartet, auch
wenn der alte Thread noch nicht beendet ist.
#5: Initialisierung des Threads.
#6: Der Robot braucht den Zugriff auf das Archie-Objekt mit der Benutzungsoberfläche,
weil er seine Ergebnisse in das Text-Widget einträgt.
#7: Start des Threads. Von dieser geerbten Methode aus wird die (überschriebene) Methode
run() aufgerufen.
#8: Der Inhalt des Text-Widgets wird gelöscht und die Überschrift eingefügt.
#9: Herstellen der Verbindung zum FTP-Server und anonymes Login.
if len(self.schlange)<10: #14
try:
self.ftp.cwd(self.pfad)
verzei = []
self.ftp.retrlines('LIST', verzei.append)
unterverzeichnisse, dateien = self.untersuche(dir)
self.schlange.extend(unterverzeichnisse)
for d in dateien:
self.ob.text.insert(END,d+'\n')
except: pass
def untersuche(self, verzeichnis): #15
liste1 = []
liste2 = []
for z in verzeichnis:
name = z.split()[-1]
if z[0] == 'd':
if name not in ['.', '..']:
liste1.append(self.pfad + name +'/')
elif self.suchwort in name:
liste2.append(self.pfad + name)
return liste1, liste2
a = Archie()

Get Python 3 - Lernen und professionell anwenden now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.