在 Log Puzzle 练习中,您将使用 Python 代码解决两个谜题。本练习使用 urllib 模块,如 Python 实用程序部分中所示。本练习的文件位于“logpuzzle”中目录(如果尚未下载,请参阅设置,下载 google-python-exercises.zip)。将您的代码添加到“logpuzzle.py”中文件。
一张动物图片已被拆分成许多条窄的垂直条纹图片。条纹图片在互联网上的某个地方,每张图片都有自己的网址。这些网址隐藏在网络服务器日志文件中。您的任务是找到网址并下载所有条纹图片,以重新创建原始图片。
切片网址隐藏在 Apache 日志文件中(开源 apache Web 服务器是互联网上使用最广泛的服务器)。每个日志文件都来自某个服务器,而所需的切片网址隐藏在日志中。日志文件会像下面这样对它的来源服务器进行编码:android_code.google.com 日志文件来自 code.google.com 服务器(正式来讲,服务器名称是第一个下划线后的名称)。Animal_code.google.com 日志文件包含“动物”的相关数据图片。虽然日志文件中的数据具有真正的 Apache Web 服务器的语法,但是谜题所需要的数据之外的数据是来自真实日志文件的随机数据。
日志文件中的一行代码如下所示(这正是 Apache 日志文件的样子):
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"
前几个数字是发出请求的浏览器的地址。最有趣的部分是“GET path HTTP”显示服务器收到的网络请求的路径。路径本身从不包含空格,并以空格与 GET 和 HTTP 分隔(正则表达式建议:\S(大写 S)匹配任何非空格字符)。在日志中找到字符串“puzzle”所在的行出现在路径中,从而忽略日志中的其他许多行。
A 部分 - 指向网址的日志文件
完成从日志文件中提取谜题网址的 read_urls(filename) 函数。查找所有“谜题”记录文件中的路径网址。将每个网址的路径与文件名中的服务器名称合并,形成一个完整网址,例如:"http://www.example.com/path/puzzle/from/inside/file".过滤掉多次出现的网址。read_urls() 函数应返回完整网址列表,按字母顺序排序且不重复。如果按字母顺序排列网址,则会按从左到右的正确顺序生成图片切片,以重新创建原始的动物图片。在最简单的情况下,main() 应该只输出网址,每行一个。
$ ./logpuzzle.py animal_code.google.com http://code.google.com/something/puzzle-animal-baaa.jpg http://code.google.com/something/puzzle-animal-baab.jpg ...
B 部分 - 下载图片拼图
完成 download_images() 函数,该函数接受经过排序的网址列表和目录。将每个网址中的图片下载到指定目录中,如有必要,请先创建目录(请参阅“os”模块创建目录,参阅“urllib.urlretrieve()”下载网址)。使用“img0”、“img1”、“img2”等简单架构命名本地图片文件。您可能希望输出一小段“正在检索...”状态输出行。每张图片都是原始图片的一部分。如何将这些切片组合在一起以重新创建原始视频?只需少量 HTML 即可很好地解决此问题(无需具备 HTML 方面的知识)。
download_images() 函数还应在目录中创建带有 *img* 标记的 index.html 文件,以显示每个本地图片文件。img 标记应全部显示在同一行中,不可分隔。这样,浏览器就可以无缝地显示所有 Slice。您无需掌握 HTML 即可执行此操作;只需创建一个如下所示的 index.html 文件:
<html> <body> <img src="img0"><img src="img1"><img src="img2">... </body> </html>
当您下载动物谜题后,界面应如下所示:
$ ./logpuzzle.py --todir animaldir animal_code.google.com $ ls animaldir img0 img1 img2 img3 img4 img5 img6 img7 img8 img9 index.html
一切正常后,在浏览器中打开 index.html 应该会显示原始的动物图片。图片中的动物是什么?
C 部分 - 图片切片解扰
第二个谜题涉及一幅非常著名的地方的图片,但这取决于某些自定义排序方式。对于第一个谜题,可以按字母顺序对网址进行排序,以便正确排列图片。排序将使用整个网址。不过,如果网址以“--wordchars-wordchars.jpg”格式结尾,例如:"http://example.com/foo/puzzle/bar-abab-baaa.jpg",那么该网址应由排序中的第二个字词表示(例如“baaa”)。因此,对每个以 word-word.jpg 格式结尾的网址列表进行排序时,应按第二个字词对网址进行排序。
扩展您的代码以正确排序此类网址,然后您应该能够解码显示著名地点的第二个 place_code.google.com 谜题。显示什么地点?
知识共享署名:此谜题中使用的图片是由其所有者根据知识共享署名 2.5 许可提供的,该许可非常鼓励混剪本内容中的内容。动物图片来自 flickr 的用户 zappowbang,而地点图片来自 flickr 的用户 布尔值分块。