Problem: Das Einreichen von Hausaufgaben erfordert das Navigieren in einem Labyrinth von Webseiten, die so komplex sind, dass ich die Aufgabe mehrmals an der falschen Stelle eingereicht habe. Obwohl dieser Vorgang nur 1–2 Minuten dauert, scheint er manchmal ein unüberwindbares Hindernis zu sein (zum Beispiel, wenn ich eine Aufgabe zu spät in der Nacht erledigt habe und mich kaum an mein Passwort erinnern kann).
Lösung: Verwenden Sie Python, um abgeschlossene Aufgaben automatisch zu senden! Im Idealfall könnte ich die Aufgabe speichern, einige Schlüssel eingeben und meine Arbeit in Sekunden laden. Es klang zu gut, um zuerst wahr zu sein, aber dann entdeckte ich Selenium, ein Tool, das mit Python zum Navigieren im Web verwendet werden kann.
Jedes Mal, wenn wir langwierige Aktionen im Internet mit derselben Abfolge von Schritten wiederholen, ist dies eine großartige Gelegenheit, ein Programm zur Automatisierung des Prozesses zu schreiben. Mit Selenium und Python müssen wir das Skript nur einmal schreiben, und dann können wir es so oft ausführen, wie wir möchten, und uns vor wiederholten Aufgaben schützen (und in meinem Fall ist es unmöglich, den Job an den falschen Ort zu senden)!
Hier gehe ich auf eine Lösung ein, die ich entwickelt habe, um meine Aufgaben automatisch (und korrekt) einzureichen. Auf dem Weg werden wir die Grundlagen der Verwendung von Python und Selen für die programmatische Websteuerung behandeln. Während dieses Programm funktioniert (ich benutze es jeden Tag!), Ist es ziemlich individuell, so dass Sie den Code für Ihre Anwendung nicht kopieren und einfügen können. Die hier beschriebenen allgemeinen Methoden können jedoch auf eine unbegrenzte Anzahl von Situationen angewendet werden. (Wenn Sie den vollständigen Code sehen möchten, ist er auf GitHub verfügbar .)
Ein Ansatz
Bevor wir uns mit dem unterhaltsamen Teil der Automatisierung befassen, müssen wir die Gesamtstruktur unserer Lösung herausfinden. Der Einstieg in das Codieren ohne Plan ist eine großartige Möglichkeit, Stunden zu verschwenden und frustriert zu werden. Ich möchte ein Programm schreiben, um abgeschlossene Klassenaufgaben an die richtige Stelle in Canvas ( das „Lernmanagementsystem“ meiner Universität) zu senden . Zuerst muss ich dem Programm den Jobnamen und die Klasse mitteilen können. Ich habe einen einfachen Ansatz gewählt und einen Ordner erstellt, in dem abgeschlossene Aufgaben mit untergeordneten Ordnern für jede Klasse gespeichert werden. In den untergeordneten Ordnern habe ich ein fertiges Dokument abgelegt, das für einen bestimmten Job benannt ist. Das Programm kann den Klassennamen anhand des Ordners und den Aufgabennamen anhand des Dokumentnamens ermitteln.
Hier ist ein Beispiel, in dem der Klassenname EECS491 und die Aufgabe Aufgabe 3 - Ausgabe in großen Grafikmodellen lautet. "
Dateistruktur (links) und vollständige Zuordnung (rechts).
Der erste Teil des Programms ist eine Schleife, die die Ordner durchläuft, um den Job und die Klasse zu finden, die wir in einem Python-Tupel speichern:
# os for file management
import os
# Build tuple of (class, file) to turn in
submission_dir = 'completed_assignments'
dir_list = list(os.listdir(submission_dir))
for directory in dir_list:
file_list = list(os.listdir(os.path.join(submission_dir,
directory)))
if len(file_list) != 0:
file_tup = (directory, file_list[0])
print(file_tup)
('EECS491', 'Aufgabe 3 - Inferenz in größeren grafischen Modellen.txt')
Dies kümmert sich um die Dateiverwaltung, und jetzt kennt das Programm die Klasse und die Aufgabe, die eingeschlossen werden sollen. Der nächste Schritt besteht darin, mit Selenium zur richtigen Webseite zu navigieren und den Job zu laden.
Web Control mit Selen
Um mit Selenium zu beginnen, importieren wir die Bibliothek und erstellen einen Webtreiber, einen Browser, der von unserem Programm gesteuert wird. In diesem Fall verwende ich Chrome als Browser und poste den Treiber auf der Canvas-Website, auf der ich Aufträge sende.
import selenium
# Using Chrome to access web
driver = webdriver.Chrome()
# Open the website
driver.get('https://canvas.case.edu')
Wenn wir die Canvas-Webseite öffnen, stehen wir vor dem ersten Hindernis - dem Anmeldefeld! Um dies zu umgehen, müssen wir die ID und das Passwort eingeben und auf die Anmeldeschaltfläche klicken.
Stellen Sie sich vor, ein Webtreiber ist jemand, der noch nie eine Webseite gesehen hat: Wir müssen genau angeben, wo geklickt werden soll, was gedruckt werden soll und auf welche Schaltflächen geklickt werden soll. Es gibt verschiedene Möglichkeiten, unserem Webtreiber mitzuteilen, welche Elemente zu finden sind, und alle verwenden Selektoren. Ein Selektor ist eine eindeutige Kennung für ein Element auf einer Webseite. Um einen Selektor für ein bestimmtes Element zu finden, z. B. das Feld „CWRU ID“, müssen wir uns den Code der Webseite ansehen. In Chrome können Sie dazu Strg + Umschalt + I drücken oder mit der rechten Maustaste auf ein Element klicken und Code anzeigen auswählen. Dies öffnet sichChrome Developer Tools , eine äußerst nützliche Anwendung, die den HTML-Code einer Webseite anzeigt .
Um den Selektor für das Feld "CWRU ID" zu finden, habe ich mit der rechten Maustaste in das Feld geklickt, auf Code anzeigen geklickt und in den Entwicklertools Folgendes angezeigt. Die hervorgehobene Zeile entspricht dem Element id_box (diese Zeile wird als HTML-Tag bezeichnet).
Dieser HTML-Code mag überwältigend aussehen, aber wir können die meisten Informationen ignorieren und uns auf Teile
id = "username"
und konzentrieren name = "username"
. (Diese werden als HTML-Tag-Attribute bezeichnet).
Um ein Feld
id
mit unserem Webtreiber auszuwählen , können wir das Attribut id
oder verwenden name
was wir in Entwicklertools gefunden haben. Selenium-Webtreiber bieten viele verschiedene Möglichkeiten, Elemente auf einer Webseite auszuwählen, und häufig gibt es mehrere Möglichkeiten, dasselbe Element auszuwählen:
# Select the id box
id_box = driver.find_element_by_name('username')
# Equivalent Outcome!
id_box = driver.find_element_by_id('username')
Unser Programm hat jetzt Zugriff darauf
id_box
und wir können auf verschiedene Arten damit interagieren, z. B. durch Eingabe von Tasten oder Drücken (wenn wir eine Schaltfläche ausgewählt haben).
# Send id information
id_box.send_keys('my_username')
Wir gehen den gleichen Vorgang für das Kennwortfeld und die Anmeldeschaltfläche durch und wählen jedes auf der Grundlage dessen aus, was wir in den Chrome-Entwicklertools sehen. Wir senden dann Informationen an die Artikel oder klicken bei Bedarf darauf.
# Find password box
pass_box = driver.find_element_by_name('password')
# Send password
pass_box.send_keys('my_password')
# Find login button
login_button = driver.find_element_by_name('submit')
# Click login
login_button.click()
Sobald wir angemeldet sind, werden wir von dieser leicht einschüchternden Symbolleiste begrüßt:
Wir müssen das Programm erneut durch die Webseite navigieren und die genauen Elemente angeben, auf die geklickt werden soll, sowie die einzugebenden Informationen. In diesem Fall fordere ich das Programm auf, Kurse aus dem Menü links auszuwählen und dann die Klasse, die der Aufgabe entspricht, die ich bestehen muss:
# Find and click on list of courses
courses_button = driver.find_element_by_id('global_nav_courses_link')
courses_button.click()
# Get the name of the folder
folder = file_tup[0]
# Class to select depends on folder
if folder == 'EECS491':
class_select = driver.find_element_by_link_text('Artificial Intelligence: Probabilistic Graphical Models (100/10039)')
elif folder == 'EECS531':
class_select = driver.find_element_by_link_text('Computer Vision (100/10040)')
# Click on the specific class
class_select.click()
Das Programm findet die richtige Klasse anhand des Ordnernamens, den wir im ersten Schritt gespeichert haben. In diesem Fall verwende ich die select-Methode
find_element_by_link_text
, um eine bestimmte Klasse zu finden. Der "Link-Text" für ein Element ist nur eine weitere Auswahl, die wir auf der Seite finden können:
Dieser Workflow mag etwas langweilig erscheinen, aber denken Sie daran, dass wir dies nur einmal tun müssen, wenn wir unser Programm schreiben! Danach können wir so oft auf "Ausführen" klicken, wie wir möchten, und das Programm wird für uns alle diese Seiten aufrufen.
Wir verwenden den gleichen Prozess zum Überprüfen einer Seite - Auswählen eines Elements - Interagieren mit einem Element, um einige weitere Bildschirme zu durchlaufen. Schließlich erreichen wir die Seite zum Einreichen von Jobs:
Zu diesem Zeitpunkt konnte ich die Ziellinie sehen, aber anfangs verwirrte mich dieser Bildschirm. Ich hätte ganz einfach auf das Feld Datei auswählen klicken können, aber wie sollte ich die Datei auswählen, die ich hochladen möchte? Die Antwort ist unglaublich einfach! Wir finden das Feld
Choose File
mithilfe eines Selektors und verwenden eine Methode send_keys
, um den genauen Dateipfad ( file_location
im folgenden Code genannt) an den Block zu übergeben:
# Choose File button
choose_file = driver.find_element_by_name('attachments[0][uploaded_data]')
# Complete path of the file
file_location = os.path.join(submission_dir, folder, file_name)
# Send the file location to the button
choose_file.send_keys(file_location)
Durch Übermitteln des genauen Dateipfads können wir den gesamten Ordnernavigationsprozess überspringen, um die gewünschte Datei zu finden. Nach dem Senden des Pfads wird der folgende Bildschirm angezeigt, der zeigt, dass unsere Datei geladen und zum Senden bereit ist.
Jetzt wählen wir die Schaltfläche "Aufgabe senden", klicken und unsere Aufgabe wird gesendet!
# Locate submit button and click
submit_assignment = driver.find_element_by_id('submit_file_button')
submit_assignent.click()
Reinigung
Die Dateiverwaltung ist immer ein kritischer Schritt, und ich möchte sicherstellen, dass ich alte Jobs nicht erneut einreiche oder verliere. Ich dachte, die beste Lösung wäre, die Datei zu speichern, die in einem Ordner
completed_assignments
abgelegt werden soll, und die Dateien in den Ordner submitted_assignments
zu verschieben, sobald sie heruntergeladen werden. Das letzte Codebit verwendet das OS-Modul, um den abgeschlossenen Job an den richtigen Ort zu verschieben.
# Location of files after submission
submitted_file_location = os.path.join(submitted_dir, submitted_file_name)
# Rename essentially copies and pastes files
os.rename(file_location, submitted_file_location)
Der gesamte Quellcode ist in einem Skript zusammengefasst, das ich über die Befehlszeile ausführen kann. Um die Möglichkeit von Fehlern zu begrenzen, reiche ich jeweils nur einen Job ein, was keine große Sache ist, wenn man bedenkt, dass das Starten des Programms nur etwa 5 Sekunden dauert!
So sieht es aus, wenn ich das Programm ausführe:
Das Programm gibt mir die Möglichkeit, vor dem Laden sicherzustellen, dass dies der richtige Job ist. Nach Beendigung des Programms erhalte ich die folgende Ausgabe:
Während das Programm ausgeführt wird, kann ich beobachten, wie Python für mich ausgeführt wird:
Schlussfolgerungen
Automatisierungstechniken mit Python eignen sich hervorragend für viele Aufgaben, sowohl allgemein als auch in meinem datenwissenschaftlichen Bereich. Zum Beispiel könnten wir Selenium verwenden, um jeden Tag automatisch neue Datendateien herunterzuladen (vorausgesetzt, die Website verfügt nicht über eine API ). Während das Erstellen von Skripten auf den ersten Blick mühsam erscheint, besteht der Vorteil darin, dass wir den Computer zwingen können, diese Sequenz so oft zu wiederholen, wie wir möchten. Das Programm wird nie den Fokus verlieren und auf Twitter gehen. Die Schritte werden genau in perfekter Reihenfolge ausgeführt (der Algorithmus funktioniert einwandfrei, bis sich die Site ändert).
Ich muss erwähnen, dass Sie vorsichtig sein müssen, bevor Sie kritische Aufgaben automatisieren. Dieses Beispiel ist ein relativ geringes Risiko, da ich jederzeit zurückgehen und Aufgaben erneut einreichen kann und das Programm normalerweise noch einmal überprüfe, um zu funktionieren. Websites ändern sich, und wenn Sie das Programm nicht im Gegenzug ändern, erhalten Sie möglicherweise ein Skript, das etwas völlig anderes tut als ursprünglich beabsichtigt!
In Bezug auf den ROI spart mir dieses Programm etwa 30 Sekunden pro Aufgabe und das Schreiben dauert 2 Stunden. Wenn ich damit 240 Aufgaben erledige, bekomme ich rechtzeitig ein Plus! Die Auszahlung dieses Programms liegt jedoch in der Entwicklung einer coolen Lösung für das Problem und lehrt dabei viel. Obwohl meine Zeit effizienter damit verbracht werden konnte, Aufgaben zu erledigen, anstatt herauszufinden, wie sie automatisch abgegeben werden können, hat mir die Herausforderung sehr gut gefallen. Es gibt einige Dinge, die so zufriedenstellend sind wie das Lösen von Problemen, und Python ist ein ziemlich gutes Werkzeug dafür. ...
In den kostenpflichtigen Online-Kursen von SkillFactory erfahren Sie, wie Sie einen hochkarätigen Beruf von Grund auf neu aufbauen oder Ihre Fähigkeiten und Ihr Gehalt verbessern können:
- Kurs für maschinelles Lernen (12 Wochen)
- Data Science (12 )
- (9 )
- «Python -» (9 )