9.2 功能需求和分析

通过阅读上一节,读者应该可以大致了解到我们所说的网络爬虫框架的功用。概括来讲,网络爬虫框架会反复地执行如下步骤直至触碰到停止条件。

  • “网页下载器”下载与给定网络地址对应的网页内容。其中,在被用于获取网页内容的“请求”的组装方面,网络爬虫框架应该为使用者尽量预留出定制接口。使用者可以使用这些接口自定义“请求”的组装方法。

  • “分析器”分析下载到的网页内容,并从中筛选出可用的内容(以下称为“条目”)和需要访问的网页的链接(也就是该网页的网络地址)。其中,在被用于分析和筛选网页内容的规则和策略方面,应该由网络爬虫框架提供灵活的定制接口。换句话说,由于只有使用者自己才知道他们真正想要的是什么,所以应该允许他们对这些规则和策略进行深入的定制。而网络爬虫框架仅需要规定好定制的方式即可。

  • “分析器”(也可能是使用者自定义的程序)把筛选出的“条目”发送给“条目处理管道”。同时,它会把发现的新的网络地址和其他一些信息组装成新的请求,然后把这些请求发送给“网页下载器”。在此步骤中,我们应该过滤掉一些不符合要求的网络地址,比如忽略超出有效网络地址边界或重复的网络地址。

读者可能已经注意到,在这几个步骤的描述中,我们使用引号突出展示了几个名词,即网页下载器、请求、分析器、条目和条目处理管道。其中,请求和条目都代表了某类数据,而其他3个名词则代表了处理数据的子程序(或称处理模块)。它们与在前面已经提到过的网页内容(或称对请求的响应)共同描述出了对应于单一网络地址的数据的流转方式。具体如下:

  1. 输入 -> 网页下载器 -> 分析器 -> 条目处理管道 -> 输出
  2. | | | | |
  3. | 请求 响应(网页内容) 条目 最终的数据
  4. 首个网络地址

我们在前面说过,分析器除了会从网页内容中筛选出若干个条目之外,还会提取出一些新的请求。这就意味着,我们向网络爬虫输入的一个初始的网络地址往往会使得多个网页(一般是同一个网站中的不同网页)的内容被下载、筛选和处理。因此,网络爬虫程序在完整地执行一个爬取任务的过程中,其中数据的流转应该如图9-1所示。

从图9-1中我们可以清晰地看到每一个处理模块能够接受的输入和可以产生的输出。实际上,我们将要编写的网络爬虫框架就会以此为依据而形成几个相对独立的组件。当然,为了维护这些组件的运行和协作的有效性,该框架中还会存在其他一些子程序。关于这方面,我们在后面的小节中会陆续予以说明。

{%}

图 9-1 起始于首次请求的数据流程图

在这里,我们需要再次强调一下网络爬虫框架与网络爬虫实现的区别。作为一个框架,该程序应该在每个处理模块中给予使用者尽量多的定制方法,而不去涉及各个处理步骤的实现细节。另外,框架应该更多地考虑使用者自定义的处理步骤在被执行过程中可能发生的各种情况和问题,并注意对这些问题的处理方式。这样才能在做到在易于扩展的同时保证框架的稳定性。这方面的思考和策略会体现在该网络爬虫框架的各个阶段的设计和编码实现之中。

好了,下面我们就会根据以上对功能需求和特性方面的分析来对这一程序进行总体设计。