Board logo

标题: 一个 Java 搜索引擎的实现--网络爬虫(1) [打印本页]

作者: look_w    时间: 2018-9-7 21:11     标题: 一个 Java 搜索引擎的实现--网络爬虫(1)

自己动手写一个搜索引擎,想想这有多 cool:在界面上输入关键词,点击搜索,得到自己想要的结果;那么它还可以做什么呢?也许是自己的网站需要一个站内搜索功能,抑或是对于硬盘中文档的搜索 —— 最重要的是,是不是觉得众多 IT 公司都在向你招手呢?如果你心动了,那么,Let's Go!
这里首先要说明使用 Java 语言而不是 C/C++ 等其它语言的原因,因为 Java 中提供了对于网络编程众多的基础包和类,比如 URL 类、InetAddress 类、正则表达式,这为我们的搜索引擎实现提供了良好的基础,使我们可以专注于搜索引擎本身的实现,而不需要因为这些基础类的实现而分心。
这个分三部分的系列将逐步说明如何设计和实现一个搜索引擎。在第一部分中,您将首先学习搜索引擎的工作原理,同时了解其体系结构,之后将讲解如何实现搜索引擎的第一部分,网络爬虫模块,即完成网页搜集功能。在系列的第二部分中,将介绍预处理模块,即如何处理收集来的网页,整理、分词以及索引的建立都在这部分之中。在系列的第三部分中,将介绍信息查询服务的实现,主要是查询界面的建立、查询结果的返回以及快照的实现。
dySE 的整体结构在开始学习搜索引擎的模块实现之前,您需要了解 dySE 的整体结构以及数据传输的流程。事实上,搜索引擎的三个部分是相互独立的,三个部分分别工作,主要的关系体现在前一部分得到的数据结果为后一部分提供原始数据。三者的关系如下图所示:
图 1. 搜索引擎三段式工作流程在介绍搜索引擎的整体结构之前,我们借鉴《计算机网络——自顶向下的方法描述因特网特色》一书的叙事方法,从普通用户使用搜索引擎的角度来介绍搜索引擎的具体工作流程。
自顶向下的方法描述搜索引擎执行过程:
在有了上述的分析之后,我们可以得到搜索引擎的整体结构如下图:
图 2. 搜索引擎整体结构爬虫从 Internet 中爬取众多的网页作为原始网页库存储于本地,然后网页分析器抽取网页中的主题内容交给分词器进行分词,得到的结果用索引器建立正排和倒排索引,这样就得到了索引数据库,用户查询时,在通过分词器切割输入的查询词组并通过检索器在索引数据库中进行查询,得到的结果返回给用户。
无论搜索引擎的规模大小,其主要结构都是由这几部分构成的,并没有大的差别,搜索引擎的好坏主要是决定于各部分的内部实现。
有了上述的对与搜索引擎的整体了解,我们来学习 dySE 中爬虫模块的具体设计和实现。
Spider 的设计网页收集的过程如同图的遍历,其中网页就作为图中的节点,而网页中的超链接则作为图中的边,通过某网页的超链接 得到其他网页的地址,从而可以进一步的进行网页收集;图的遍历分为广度优先和深度优先两种方法,网页的收集过程也是如此。综上,Spider 收集网页的过程如下:从初始 URL 集合获得目标网页地址,通过网络连接接收网页数据,将获得的网页数据添加到网页库中并且分析该网页中的其他 URL 链接,放入未访问 URL 集合用于网页收集。下图表示了这个过程:
图 3. Spider 工作流程




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0