使用基本的 Python 模块,可以编写脚本来与 Web 站点交互,但是如果没有必要的话,那么您就不希望这样做。Python 2.x 中的模块 urllib 和 urllib2,以及 Python 3.0 中的统一的 urllib.* 子包,可以在 URL 的末尾获取资源。然而,当您希望与 Web 页面中找到的内容进行某种比较复杂的交互时,您需要使用 mechanize 库。
在自动化 Web scrap 或用户与 Web 站点的交互模拟中,最大的困难之一就是服务器使用 cookies 跟踪会话进度。显然,cookies 是 HTTP 头部的一部分,在 urllib 打开资源时会自然显示出来。而且,标准模块 Cookie(Python 3 中的 http.cookie)和 cookielib(Python 3 中的 http.cookiejar)有助于在比原始的文本处理更高的层次上处理这些头部。即使如此,在这个层次上执行处理也非常的繁琐。mechanize 库将这种处理提升到一个更高程度的抽象并使您的脚本 — 或交互性 Python shell — 表现出非常类似实际 Web 浏览器的行为。
Python的mechanize 受到Perl的WWW:Mechanize 的启发,后者具有类似的一组功能。当然,作为长期的 Python 支持者,我认为 mechanize 更健壮,它看上去似乎继承了两种语言的通用模式。
mechanize 的一个亲密伙伴是同样出色的 Beautiful Soup 库。这是一个非常神奇的 “粗糙的解析器”,用于解析实际 Web 页面中包含的有效 HTML。您不需要 将 Beautiful Soup 用于 mechanize,反之亦然,但是多半情况下,当您与 “实际存在的 Web” 交互时,您将希望同时使用这两种工具。
一个实际示例
我曾在多个编程项目中使用过 mechanize。最近一个项目是从一个流行的 Web 站点中收集匹配某种条件的名称的列表。该站点提供了一些搜索工具,但是没有提供任何正式的 API 来执行此类搜索。虽然访问者可能能够更明确地猜出我过去在做什么,但我将修改给出的代码的细节,以避免暴露有关被 scrap 的站点或我的客户机的过多信息。一般情况下,我给出的代码对于类似任务是通用的。
入门工具
在实际开发Web scrap/分析代码的过程中,我发现以交互式方式查看、处理和分析 Web 页面的内容以了解相关 Web 页面实际发生的操作是非常重要的功能。通常,站点中的一些页面是由查询动态生成(但是具有一致的模式),或是根据非常严格的模板预先生成。
完成这种交互式体验的一种重要方法就是在 Python shell 内使用 mechanize 本身,特别是在一个增强的 shell 内,比如 IPython。通过这种方式,您可以在编写执行希望用于生产中的交互的最终脚本之前,请求各种已链接的资源、提交表单、维护或操作站点 cookies,等等。
然而,我发现我与 Web 站点的许多实验性质的交互在实际的现代 Web 浏览器中得到了更好的执行。方便地呈现页面可以使您更加快速地了解给定页面或表单中正在发生的事情。问题在于,呈现页面仅仅完成了事情的一半,可能还不到一半。获得 “页面源代码” 会让您更进一步。要真正理解给定 Web 页面或与 Web 服务器的一系列交互的背后的原理,需要了解更多。
要了解这些内容,我常常使用 Firebug或面向 Firefox的Web Developer 插件(或最新 Safari 版本中的内置的可选 Develop 菜单,但是所针对的目标人群不同)。所有这些工具都可以执行诸如显示表单字段、显示密码、检查页面的 DOM、查看或运行 Javascript、观察 Ajax 通信等操作。比较这些工具的优劣需要另外撰写一篇文章,但是如果您要进行面向 Web 的编程的话,那么必须熟悉这些工具。
不管使用哪一种工具来对准备实现自动化交互的 Web 站点做实验,您都需要花比编写简洁的 mechanize 代码(用于执行您的任务)更多的时间来了解站点实际发生的行为。
搜索结果 scraper
考虑到上面提到的项目的意图,我将把包含 100 行代码的脚本分为两个功能: