Für die Logpuzzles-Übung verwenden Sie Python-Code, um zwei Rätsel zu lösen. Bei dieser Übung wird das urllib-Modul verwendet, wie im Abschnitt Python-Dienstprogramme dargestellt. Die Dateien für diese Übung befinden sich im Logpuzzle. im Verzeichnis „google-python-exercises“. Laden Sie die Datei google-python-exercises.zip herunter, falls Sie dies noch nicht getan haben. Weitere Informationen finden Sie unter Einrichten. Code zu "logpuzzle.py" hinzufügen -Datei.
Ein Bild eines Tieres wurde in viele schmale Bilder mit vertikalen Streifen aufgeteilt. Die Streifenbilder sind irgendwo im Internet zu finden, jedes mit einer eigenen URL. Die URLs sind in einer Webserverprotokolldatei verborgen. Ihre Mission ist es, die URLs zu finden und alle Bildstreifen herunterzuladen, um das Originalbild zu reproduzieren.
Die Slice-URLs sind in den Apache-Protokolldateien verborgen. Der Open-Source-Apache-Webserver ist der am häufigsten verwendete Server im Internet. Jede Protokolldatei stammt von einem Server und die gewünschten Slice-URLs sind in den Protokollen verborgen. Die Protokolldatei codiert den Server, von dem sie stammt, wie folgt: Die Protokolldatei tier_code.google.com stammt vom Server code.google.com (informiert nehmen wir an, dass der Servername dem Namen nach der ersten Unterleiste entspricht). Die Protokolldatei tier_code.google.com enthält die Daten für das Tier. Puzzlebild. Obwohl die Daten in den Protokolldateien die Syntax eines echten Apache-Webservers haben, sind die Daten, die über die Anforderungen für das Rätsel hinausgehen, randomisierte Daten aus einer echten Protokolldatei.
So sieht eine einzelne Zeile der Protokolldatei aus (so sehen Apache-Protokolldateien tatsächlich aus):
10.254.254.28 - - [06/Aug/2007:00:14:08 -0700] "GET /foo/talks/ HTTP/1.1" 200 5910 "-" "Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.1.4) Gecko/20070515 Firefox/2.0.0.4"
Die ersten Zahlen sind die Adresse des Browsers, der die Anfrage gesendet hat. Der interessanteste Teil ist der "GET path HTTP"-Teil zeigt den Pfad einer vom Server empfangenen Webanfrage an. Der Pfad selbst enthält nie Leerzeichen und wird von GET und HTTP durch Leerzeichen getrennt (Regex-Vorschlag: \S (großes S) stimmt mit jedem Zeichen überein, das kein Leerzeichen ist). Suchen Sie im Protokoll nach den Zeilen mit der Zeichenfolge „puzzle“. innerhalb des Pfades erscheint und dabei die vielen anderen Zeilen im Protokoll ignoriert.
Teil A – Protokolldatei in URLs
Führen Sie die Funktion read_urls(filename) aus, die die Puzzle-URLs aus einer Logdatei extrahiert. Finde alle Rätsel Pfad-URLs in der Logdatei. Kombinieren Sie den Pfad jeder URL mit dem Servernamen aus dem Dateinamen, um eine vollständige URL zu erstellen. Beispiel: "http://www.example.com/path/puzzle/from/inside/file". Hiermit können Sie URLs ausblenden, die mehr als einmal vorkommen. Die Funktion read_urls() sollte die Liste der vollständigen URLs in alphabetischer Reihenfolge und ohne Duplikate zurückgeben. Wenn Sie die URLs in alphabetischer Reihenfolge verwenden, erhalten Sie die Bildausschnitte in der richtigen Reihenfolge von links nach rechts, sodass das ursprüngliche Tierbild reproduziert werden kann. Im einfachsten Fall sollte mit "main()" nur die URLs ausgegeben werden, und zwar eine pro Zeile.
$ ./logpuzzle.py animal_code.google.com http://code.google.com/something/puzzle-animal-baaa.jpg http://code.google.com/something/puzzle-animal-baab.jpg ...
Teil B – Bilderpuzzle herunterladen
Vervollständigen Sie die Funktion download_images(), die aus einer sortierten Liste von URLs und einem Verzeichnis besteht. Laden Sie das Bild von jeder URL in das angegebene Verzeichnis herunter und erstellen Sie bei Bedarf zuerst das Verzeichnis (siehe Modul „os“ zum Erstellen eines Verzeichnisses und „urllib.urlretrieve()“ zum Herunterladen einer URL). Benennen Sie die lokalen Bilddateien mit einem einfachen Schema wie "img0", "img1", "img2" usw. Sie können einen kleinen Text wie „Wird abgerufen...“ ausdrucken. Status-Ausgabezeile beim Herunterladen der Bilder, da dies langsam sein kann und es ist schön, einen Hinweis darauf zu haben, dass das Programm funktioniert. Jedes Bild ist ein kleines vertikales Segment aus dem Originalbild. Wie ordne ich die Segmente zusammen, um das Original zu reproduzieren? Mit ein wenig HTML lässt sich dieses Problem gut lösen. HTML-Kenntnisse sind nicht erforderlich.
Mit der Funktion download_images() sollte im Verzeichnis außerdem die Datei „index.html“ mit einem *img*-Tag erstellt werden, um jede lokale Bilddatei anzuzeigen. Die img-Tags sollten alle in einer Zeile ohne Trennzeichen stehen. Auf diese Weise zeigt der Browser alle Segmente nahtlos zusammen an. Sie benötigen dazu keine HTML-Kenntnisse. erstellen Sie einfach eine index.html-Datei, die wie folgt aussieht:
<html> <body> <img src="img0"><img src="img1"><img src="img2">... </body> </html>
So sollte es aussehen, wenn du das Tierpuzzle herunterladen kannst:
$ ./logpuzzle.py --todir animaldir animal_code.google.com $ ls animaldir img0 img1 img2 img3 img4 img5 img6 img7 img8 img9 index.html
Wenn alles funktioniert, sollte beim Öffnen von "index.html" in einem Browser das ursprüngliche Tierbild zu sehen sein. Welches Tier ist auf dem Bild zu sehen?
Teil C – Entschlüsseln von Bildausschnitten
Das zweite Rätsel beinhaltet das Bild eines sehr berühmten Ortes. Dazu muss zuerst eine eigene Sortierung festgelegt werden. Beim ersten Rätsel können die URLs alphabetisch sortiert werden, damit die Bilder richtig sortiert werden. Bei der Sortierung wird die gesamte URL verwendet. Endet die URL jedoch mit dem Muster „-wordchars-wordchars.jpg“, z.B. „http://beispiel.de/foo/puzzle/bar-abab-baaa.jpg“, dann sollte die URL durch das zweite Wort beim Sortieren dargestellt werden (z.B. „baaa“). Deshalb sollten die URLs nach dem zweiten Wort sortiert werden, indem eine Liste von URLs, die mit dem Muster wort-word.jpg enden, sortiert werden.
Erweitern Sie Ihren Code, um solche URLs ordnungsgemäß zu bestellen. Dann sollten Sie das zweite Rätsel „place_code.google.com“ decodieren können, in dem ein berühmter Ort zu sehen ist. Welcher Ort wird angezeigt?
CC-Quellenangabe: Die in diesem Rätsel verwendeten Bilder wurden von ihren Rechteinhabern unter der Creative-Commons-Lizenz „Namensnennung 2.5“ zur Verfügung gestellt. Dadurch werden Remixe der Inhalte wie dieses großzügig gefördert. Das Tierbild stammt vom Nutzer „Zappowbang“ bei Flickr und das Bild des Orts stammt von der booleschen Aufteilung bei Flickr.