Crawdb、linkdb
是 web link 目录,存放 url 及 url 的互联关系,作为爬行与重新爬行的依据。
segments
是主目录,存放抓回来的网页。页面内容有 bytes[] 的 raw content 和 parsed text 的形式。nutch 以广度优先的原则来爬行,因此每爬完一轮会生成一个 segment 目录。
index
是 lucene 的索引目录,是 indexes 目录里所有 index 合并后的完整索引,注意索引文件只对页面内容进行索引,没有进行存储,因此查询时要去访问 segments 目录才能获得页面内容。
(一):流程综述:
【1】:inject start urls
注入抓取 URL。因为 Nutch 的抓取程序是要抓取网页,而定位到某个网页需要制定一个 URL, 所以 Nutch 按照广度遍历策略进行抓取,会根据一开始指定的 URL, 也可以是一个 URLS 集合,以此基础进行抓取工作。
【2】:generate segment
生成 segment。Nutch 抓取程序需要抓取到很多的页面,那么具体是哪些页面的?当然,在互联网上是通过 URL 来定位的。这一步骤主要是对上一步提交的 URL 集合进行分析,确定抓取任务的详细信息。
【3】fetch list
分析提交的 URL 集合之后,建立一个抓取任务列表。在以后的抓取工作中就可以根据预处理的此列表进行工作了。
【4】:www
这是通过访问万维网 (www),实现抓取工作。
【5】:fetch content
开始根据前面生成的抓取任务列表中指定的 URL 对应的页面,这时候开始抓取工作了。
【6】:fetched content
需要将抓取到的这些页面文件存放到指定的位置,这些页面文件可以是经过简单预处理以后而被存储到文件系统中,也可以是原生的网页文件,以备后继流程基于这些文件来进一步处理,比如分词,建立索引。
content parser
内容解析器。抓取到的页面文件被提交到这里,实现对页面文件的处理,包括页面文件的分析和处理。
【7】:parse content
当然,我们抓取的数据是结构和内容非常复杂的数据,而我们感兴趣的主要是文件的内容,因为基于关键字检索的搜索引擎的实现,都是根据文本内容来实现的。
【8】:parsed text & data
通过 content parser 解析器,最终获取到的就是文本内容和其它一些可能需要用到的数据。有了这些可以识别的文本内容和数据,就可以基于此来建立索引库,而且需要将本次抓取任务的详细信息登录到 crawlDB,为下次抓取任务提供有用的信息 (比如:避免重复抓取相同的 URL 指定的页面)。
因此接下来分为两个方向:一个是索引,一个是更新 crawlDB 并继续执行抓取任务:
【9】:indexing
这是一个索引的过程,对分析处理完成并提交的文本及其数据建立索引,通过索引文件就可以实现信息的检索功能了。建立索引过程中,由于是基于 Lucene 的,所以用到了 Analyzer 分析器,对预处理的文件进行分析、过滤、分词等等,最后将写入到索引库,供搜索程序工作使用。
【10】:update crawlDB with new extracted urls
根据网页分析处理获取到的信息,更新 crawlDB(爬行数据库),并根据提取到的抓取任务已经注入的 URLs 循环执行抓取任务。
(二):Nutch 工作流程总结
上面的流程已经分析地非常透彻了,参考一些资料做个总结吧。通过下面总结的工作流程,理清思路,很有帮助的,如下所示,Nutch 的工作流程描述:
抓取程序工作流程
(1.) 建立初始 URL 集
(2.) 将 URL 集注入 crawldb 数据库 —inject
这一步骤,上面的图中没有涉及到。既然需要维护一个 crawlDB,那么在任何时候只要与抓取任务有关的而且是有用的信息都会被写入 crawlDB 的
(3.) 根据 crawldb 数据库创建抓取列表 —generate
(4.) 执行抓取,获取网页信息 —fetch
(5.) 更新数据库,把获取到的页面信息存入数据库中 —updatedb
(6.) 重复进行 3~5 的步骤,直到预先设定的抓取深度。— 这个循环过程被称为“产生 / 抓取 / 更新”循环
(7.) 根据 sengments 的内容更新 linkdb 数据库 —invertlinks
(8.) 建立索引 —index
搜索程序工作流程
(1.) 用户通过用户接口进行查询操作
(2.) 将用户查询转化为 lucene 查询
(3.) 从索引库中提取满足用户检索需求的结果集
(4.) 返回结果
顶一个先吧