20.10 练习

20-1.urllib模块及文件。

请修改friends3.py脚本,把名字和相应的朋友数量存储在一个两列的磁盘文本文件中,以后每次运行脚本都添加名字。附加题:增加一些代码把这种文件的内容转储到Web浏览器里(以HTML格式)。附加题:增加一个链接,用以清空文件中的所有名字。

20-2.urllib模块。编写一个程序,它接收一个用户输入的URL(可以是一个Web页面或一个FTP文件,例如,http://python.org或ftp://ftp.python.org/pub/python/README),然后下载它并以相同的文件名(如果你的系统不支持也可以把它改成和原文件相似的名字)存储到电脑上。Web页面(HTTP)应保存成。htm或。html文件,而FTP文件应保持其扩展名。

20-3.urllib模块。重写例11.4的grabWeb.py脚本,它会下载一个Web页面,并显示生成的HTML文件的第一个和最后一个非空白行,你应使用urlopen()来代替urlretrieve()来直接处理数据(这样就不必先下载所有文件再处理它了)。

20-4.URL和正则表达式。你的浏览器也许会保存你最喜欢的Web站点的URL,并把它们保存成”书签”里的一个HTML文件(Mozilla衍生浏览器)或是”收藏夹”中的一组URL文件(IE)。找出你浏览器记录”热门链接”的方法,并找出其所在和存储方式。不去更改任何文件,剔除对应Web站点(如果给定了的话)的URL和名字,生成一个以名字和链接作为输出的双列列表,并把这些数据保存到硬盘文件中。截取站点名和URL,确保每一行的输出不超过80个字符。

20-5.URL、urllib模块、异常、已编码正则表达式。作为对上一个问题的延伸,给你的脚本增加代码来测试你所喜欢的链接。记录无效链接(及其名字),包括无效的Web站点和已经被删除的Web页面。只输出并在磁盘中保存依然有效的链接。

20-6.错误检测。friends3.py脚本在没有选择任意一个单选按钮指定好友的数目时会返回一个错误提示。在更新CGI脚本时如果没有输入名字(例如空字符或空白)也会返回一个错误。附加题:目前为止我们探讨的仅是服务器端的错误检测。研究JavaScript编程,并通过创建JavaScript代码来同时检测错误,以确保这些错误在到达服务器前被终止,这样便实现了客户端错误检测。下面的问题20-7~问题20-10涉及Web服务器的访问日志文件和正则表达式。Web服务器(及其管理员)通常需要保存访问日志文件(一般是主Web的server文件夹里的logs/access_log)来跟踪文件请求。一段时间之后,这些逐渐变大的文件需要被保存或删节。为什么不能仅保存有用的信息而删除这些文件来节省磁盘空间呢?通过下面的习题,你会练习正则表达式和如何使用它们进行归档及分析Web服务器数据。

20-7.计算日志文件中有多少种请求(GET vs POST)。

20-8.计算成功下载的页面/数据:显示所有返回值为200 (OK(没有错误发生))的链接,以及每个链接被访问的次数。

20-9.计算错误:显示所有产生错误的链接(返回值为400或500)以及每个链接被访问的次数。

20-10.跟踪IP地址:对每个IP地址’输出每个页面/数据下载情况的列表,以及这些链接被访问的次数。

20-11.简单CGI。为Web站点创建”评论”或”反馈”页面。由表单获得用户反馈,在脚本中处理数据,最后返回一个”感谢”页面。

20-12.简单CGI。创建一个Web客户簿。接受用户输入的名字、电子邮件地址、日志,并将其保存到文件中(自定义格式)。类似上一个题,返回一个”感谢你对本页的填写”页面。同时再给用户提供一个查看客户簿的链接。

20-13.Web浏览器Cookie和Web站点注册。更改你对习题20-4的答案。你现在可以使用用户名-密码信息来注册Web站点,而不必只用简单的基于文本的菜单系统。附加题:想办法让自己熟悉Web浏览器cookie,并在最后登录成功后将会话保持4个小时。

20-14.Web客户端。移植例20.1的Web爬虫脚本crawler.py,使用HTMLParser模块或BeautifulSoup解析系统。

20-15.错误处理。当一个CGI脚本崩溃时会发生什么?如何用cgitb模块提供帮助?

20-16.CGI、文件升级及Zip文件。创建一个不仅能保存文件到服务器磁盘,而且能智能解压Zip文件(或其他压缩档)到同名子文件夹的CGI应用程序。

20-17.Zope、Plone、TurboGears及Django。研究每一个复杂的Web开发平台并分别创建一个简单的应用程序。

20-18.Web数据库应用程序。思考对你Web数据库应用程序支持的数据库构架。对于多用户的应用程序,你需要支持每个用户对数据库的全部内容的访问,但每个人可能分别输入。一个例子就是你家人及亲属的”地址簿”。每个成员成功登录后,显示出来的页面应该有几个选项”添加条目”、”查看我的条目”、”更新条目”、”移动或删除条目”以及”查看所有条目”。

20-19.电子商务引擎。使用你在习题13-11中建立的类,增加一些产品清单建立一个电子商务Web站点。确保你的应用程序支持多个用户,机器每个用户的注册功能。

20-20.字典及cgi模块相关。正如你所知道的,cgi.FieldStorage()方法返回一个字典类对象,包括提交的CGI变量的键值对。你可以使用这个对象的keys()和has_key()方法。在Python1.5中,get()方法被添加到字典中,用它可以返回给定键的值,当键不存在时返回一个默认值。FieldStorage对象却没有这个方法。让我们依照用户手册的形式:

20.10 练习 - 图1

为cgi.py中类的定义添加一个类似的get()方法(你可以把它重命名为mycgi.py或其他你喜欢的名字),以便能像下面这样操作:

20.10 练习 - 图2

…也可以用一行实现,这样就更像字典的形式了:

20.10 练习 - 图3

20-21.高级Web客户端。在20.7小节中的myhttpd.py代码只能读取HTML文件并将其返回到客户端。添加对以”.txt”结束的普通的文本的支持。确保返回正确的”text/plain” de MIME类。附加题:添加对以”.jpg”及”.jpeg”结束的JPEG文件的支持,并返回”image/jpeg”的MIME类型。

20-22.高级Web客户端。作为crawl.py的输入的URL必须是以”http://”协议指示符开头,高层的URL必须包含一个反斜线,例如:http://www.prenhallprofessional.com/。加强crawl.py的功能,允许用户只输入主机名(没有协议部分[确保是HTTP]),反斜线是可选的。例如:www.prenhallprofessional.com应该是可接受的输入形式。

20-23.高级Web客户端。更改20.3小节中的crawl.py脚本,让它也下载”ftp:”型的链接。所有的“mailto:”都会被crawl.py忽略。增加代码确保它也忽略”telnet:”、”news:”、”gopher:”和”about:”型的链接。

20-24.高级Web客户端。20.3小节中的crawl.py脚本仅从相同站点内的Web页面中找到链接,下载了。html文件,却不处理/保存图片这类对页面同样有意义的”文件”。对于那些允许URL缺少末端斜线(/)的服务器,这个脚本也不能处理。给crawl.py增添两个类来解决这些问题。

一个是urllib.FancyURLOpener类的子类My404UrlOpener,它仅包含一个方法,http_error_404(),用该方法来判断收到的404错误中是不是包含缺少末端斜线的URL。如果有,它就添加斜线并重新请求(仅一次)。如果仍然失败,才返回一个真正的404错误。你必须用该类的一个实例来设置urllib._urlopener,这样urllib才能使用它。

创建另一个类LinklmageParser,它派生自htmllib.HTMLParser。这个类应有一个构造器用来调用基类的构造器,并且初始化一个列表用来保存从Web页面中解析出的图片文件。应重写handle_image()方法,把图片文件名添加到图片列表中(这样就不会像现在的基类方法那样丢弃它们了)。