况昊
摘要:搜索引擎(Search Engine)是一个对互联网上的信息资源进行搜集整理的应用软件系统。它主要包括信息搜集、索引建立和信息检索三个部分。搜索引擎有很多类型,常见的有FTP搜索引擎和WEB搜索引擎。一般WEB搜索引擎较少处理FTP服务器上的数据。就信息规模而言,FTP服务器的信息量比WEB服务器小很多。因此FTP搜索引擎硬件投入和维护的费用也远远低于大型通用搜索引擎。针对在FTP服务器的搜索速度和效率问题,对现有FTP搜索引擎技术进行了分析和研究,重点详细介绍了爬虫模块和索引模块的设计与实现。
关键词:FTP;搜索引擎;网络爬虫;索引
中图分类号:TB 文献标识码:A doi:10.19311/j.cnki.1672-3198.2016.06.087
0引言
随着网络的发展,尤其是互联网的全球普及,使互联网上的信息急剧增长,很多个人和企业用户都建立对外开放的FTP服务器,提供了大量的信息供网民下载。如何从这信息的海洋中找到符合用户要求的有用信息,成为一个迫切需要解决的问题。对互联网上各个FTP站点上的资源进行整合汇总,以便快速、准确的了解到各个站点所提供的信息,显得十分必要。在各个FTP站点上的信息源有种类繁多,比如文本、图像、视频和声频文件等等。本设计针对FTP站点提供的信息资源进行爬取和分类,为后期建立索引的方便,对每个站点建立了一个经过初步处理的原始数据文件。
本系统主要是完成了对FTP站点信息的提取和分类,依据用户提供的站点列表、站点扫描范围以及扫描端口号进行扫描。其中对于爬虫模块来说最重要的两个步骤就是FTP站点信息的获取和对数据源的格式组织。
1 FTP搜索引擎爬虫模块介绍
1.1设计思路
任何FTP站点的建立都符合文件传输协议(File Transfer Protocol,FTP),由于FTP协议任务是从一台计算机将文件传输到另外一台计算机,它与这两台计算机所处的位置、连接方式、甚至是否使用相同的操作系统都没有关系。在使用FTP协议对话时,我们都可以使用FTP命令来传输文件。虽然在每种FTP服务器上支持的FTP命令有一些细微的差别,但它们所使用的基本命令结构是相同的,对于标准FTP命令也都支持。因此通过FTP命令获取FTP站点数据应该可行,而且拥有较好的兼容特性。本设计为FTP搜索引擎爬虫模块,所需要获取的数据有资源名称、类型、大小和最后修改时间。可以使用FTP服务器提供的标准命令满足此次设计的需求。
1.2设计步骤
1.2.1扫描站点
按照用户的设置,从众多潜在可访问站点中找出可访问的FTP站点。
1.2.2获取数据
利用FTP命令获取该FTP站点下的文件和目录,并分别记录各个目录下的文件和子目录。
1.2.3数据分类
读取分类号。按照数据类型的编号列表,对不同类型的文件数据标号。以便对数据进行分类。
1.2.4生成源文件
利用步骤(1.2.2)和(1.2.3)中获取的数据建立完整的数据源,并且按约定协议存在指定的目录下。
1.2.5生成站点列表
将可访问的站点存入站点列表中,便于下次扫描使用。
1.2.6建立索引文件
利用源文件建立索引数据库,方便数据的检索操作。
2 FTP搜索引擎概要设计
2.1工作原理
用户对在完成对FTP搜索引擎的爬虫模块配置文件的配置,便可执行爬虫程序。FTP搜索引擎的工作模式大概如下:
(1)爬虫程序会自动生成用户指定IP网段中包含的所有IP地址,对它们逐一进行扫描,已确认哪些站点提供了匿名的FTP服务。
(2)当程序成功登录某个FTP站点之后,程序会自动获取其各级目录下的文件和目录列表,并且会获取各个文件的大小、最后修改时间,最后程序会根据对照表对获取的各个文件进行分类。
(3)在所有操作完成之后,会生成该站点的目录和源文件。在扫描完用户配置的站点之后,扫描成功的站点会写入一个站点列表的文件,以便以后使用。
在索引模块中,会根据爬虫模块获取的数据,进行处理,建立索引数据库。
2.2工作流程图
工作流程如图1所示。
3 FTP搜索引爬虫模块详细设计
3.1设计目的
如今很多企业和个人都建立了自己的FTP站点,在各个FTP站点中包含有大量的资源,如何才能快速的在浩如烟海的资源中找到自己需要的资源,已经成为一个需要我们不得不解决的难题。要解决这一问题,需要我们建立一个有效的FTP搜索引擎,而实现搜索引擎的第一个问题就是如何获取各个站点提供的资源信息。本次设计的题目为FTP搜索引擎爬虫模块,其用途就是搜集各个FTP站点的数据信息,并且组织成一个特定的数据格式,索引模块得去这组数据之后,利用再次处理这些数据,建立索引数据库。
3.2功能模块设计
3.2.1网段扫描
设计思路。
经过查阅资料,由于FTP搜索引擎与WWW搜索引擎最大的区别就在于FTP站点内没有与WWW页面相对应的超链接,因而FTP搜索引擎的站点获得策略就不能模仿搜索引擎业非常时兴的超链分析技术。在本次FTP搜索引擎爬虫模块的设计里,我采用了IP扫描技术和手工添加技术的中和。一方面,程序一开始会读取系统的配置文件,获知本次扫描的网段范围,在对配置文件进行数据效验通过之后,程序会调用相应模块生成该网段中所有的等待访问的IP地址。另一方面,程序本身维护有一个IP站点列表,该列表中会保存用户手工配置的以及上一次扫描成功的IP站点性息,该IP列表中包含有提供FTP服务站点的IP地址和端口号。
3.2.2获取数据
(1)设计思路。
这一部分的实现虽然比较复杂,但是设计思路却较为简单,首先需要向目标站点发送数据请求。FTP站点会根据请求回传的数据,若请求有误,则会回传错误信息。
(2)获取文件列表。
设计思路:使用List命令获取文件和目录列表,根据回传的数据中包含有标志位,说明了该文件名表示的是目录还是文件。
在此处遇到了一个服务其兼容的问题,测试时发现FTP服务器返回的数据格式风格不同,如IIS和Serv-U,IIS返回的数据为Windows风格,而Serv-U返回的数据则是Linux风格,因此这里对于返回数据的处理不可能用同样的方法,具体解决方法请参见下文3.2.4服务器兼容中的描述。
(3)获取目录列表。
设计思路:使用List命令获取文件和目录列表,根据回传的数据中包含有标志位,说明了该文件名表示的是目录还是文件。
在此处遇到了一个服务其兼容的问题,测试时发现FTP服务器返回的数据格式风格不同,如IIS和Serv-U,IIS返回的数据为Windows风格,而Serv-U返回的数据则是Linux风格,因此这里对于返回数据的处理不可能用同样的方法,具体解决方法请参见下文3.2.4服务器兼容中的描述。
(4)获取文件大小。
设计思路:使用SIZE命令获取指定目录下指定文件的大小,根据回传的数据中包含有标志位,说明了该命令是否执行成功,若执行成功,则获取了文件的大小。
(5)文件分类。
设计思路:在配置文件中建立一个文件分类列表,由于文件的类型划分是根据文件的后缀名进行的,因此单独将文件的后缀名分离出来,对照文件分类表进行类型匹配。若匹配成功则返回类型编号,若失败,则返回一个默认编号。
3.2.3关于编码问题的解决
解决方法。
.net提供了Encoding的方法进行编码的转换,于是我尝试将传送数据的编码由ASCII转换为GB2312。因为ASCII编码不支持汉字,而GB2312支持汉字。结果最终发现当发送的字符转换为GB2312后,FTP服务器仍然不能正确解析,获取文件大小以及最后修改时间是仍然会发生错误。
之后又尝试将编码方式改为UTF8编码,结果仍然是不能解决汉字问题。如果FTP搜索引擎的爬虫部分不能有效的获取带有汉字的文件数据,那么它的实用性将大大的降低。经过几天尝试和查阅网上资料,发现编码问题应该是可以解决的,网上也有人提供了使用其它方式实现的支持汉字的FTP类。由于改动这个FTP类会对本程序造成较大的改动,所以我仍然决定在现有的基础上对程序进行修改。
经过努力,最后终于找到了修改的方法,代码的修改其实很简单,却很容易让人忽略,其方法为将代码Encoding ASCII=Encoding.ASCII改为Encoding AS-CCI=Encoding.Default。经此修改,虽然在有些服务器上仍会出现汉字的乱码,但是却能成功的使用这些获取的数据向FTP服务器发送请求。而且这些乱码也可在数据获取完成后使用转码的方式进行修正。
3.2.4服务器兼容
解决方法。
如何解决兼容性问题是程序开发中的一个难题,在本次设计开始之初,我就考虑过这个问题,尽量的使用了标准的命令来对服务器进行操作。然而虽然使用FTP命令后对服务器的操作实现了兼容,但是回传数据没有兼容。因此不得不对回传的字符串进行分析。
两个服务其回传的数据的差距是十分巨大的。但是经过观察,两组数据的相同点也有很多,比如各组数据在其中所占的字符数大致相同(文件名除外),这为我从中提取有效数据带来了很多便利。
另外,要区别这两组数据也并不困难。IIS回传数据的开头始终是日期,而Serv-U的开头始终是Linux风格的权限标识。利用这个特点,可以较为容易的将他们区别开来。
由于回传字符串的问题,对于这两种风格的字符串必须分别编写代码对它们进行解析。经过分析,各组数据都有一个共同的特点,就是其中的间隔数是相同的,利用这一点,可以从字符串的指定位置提取出需要的数据。
3.2.5生成数据文件
生成的数据源文件主要用于为后面的建立索引做准备。
设计思路。
这部分功能主要是将爬虫模块获取的文件按照指定的格式存为文件,以便为建立索引,方便检索。由于前期已经将实现将爬取的数据分目录暂时存在内存中。因此这部分的工作主要就是将内存中的数据按约定格式写入文件。
3.2.6生成站点列表
设计思路。
将连接成功的FTP站点保存在一个List
4 FTP搜索引擎索引模块详细设计
4.1格式化数据
设计思路:在得到倒排索引前,首先就要对原始数据进行特殊的处理。因为如果直接从原始数据得到索引,这样执行的效率会很低,而却实现起来也会比较困难。因此,提前执行一次数据处理,这样在后面建立文件索引时效率会有效的提高。
4.2汇总属性文件
设计思路:文件的10操作通常会耗费大量的时间,由于源文件分散在各个目录中,因此在读取时不可避免的会频繁的打开和关闭文件进行操作。因此我在这里将属性文件汇总,这样所有的有效数据都集中在了一个文件中,最大限度的减少了10操作的发生。
4.3双字母建立索引
设计思路:如何才能快速有效的从原始数据中找出用户需要的数据,这是索引部分索要解决的最大问题,经过查询资料,倒排索引是目前各大搜索引擎所常用的索引建立方式。在数据检索时,用户常采用关键字搜索的方式,因此,在建立索引时我们采用了同样的方式建立了索引数据库。
4.4索引数据库
搜索引擎是对大量的数据进行处理,因此用到数据库是必然的。数据库的重点功能在存储。查看资料发现某些搜索引擎是采用标准的数据库来存放索引数据,但是当数据量达到千万级的时候再执行SQL语句,速度将会变得很慢,特别是执行含有like的select语句时。比如一个采用MySQL存储的客户信息表数据记录达到500万行以上时,就算增加再多的索引,采用标准select语句执行查询时,所需时间至少也在2分钟以上,Oracle数据库虽然可以采用分区,或采用Ora-cle的内置函数来辅助查询,但时间也在1分钟以上。而使用文件系统来存储时,这样的查询耗时一般就是零点几秒。
4.5字符编码
由于ASCII编码并不支持汉字,因此不能选用其作为索引文件的编码。UTF-8的编码方式虽然应用广泛,但是其编码的方式较为特殊,因此最后我选用了GB2312的编码方式作为搜索引擎文件的统一编码。
5总结
此次论文的题目在此之前虽然有所了解,但是我却从来也没有深入的学习思考搜索引擎爬虫模块的实现方式,如何从浩如烟海的站点中找到提供FTP服务的站点,FTP站点如何匿名登录等等一系列的问题在此之前,都没有进行系统的了解。因此,在本次论文开始时,我也曾怀疑自己能否顺利的完成此次论文。毕竟平时一直认为网络爬虫的实现都是一些高手才能实现的,而我自己仅仅是一个在校的大学生。
然而通过网上查阅资料和查看老师提供的资料,渐渐发现网络爬虫其实并没有自己想象中那么神秘,经过自己的不断学习和摸索以及刘老师耐心的指导,FTP搜索引擎爬虫模块的框架渐渐在我的脑海中清晰起来,如何获取FTP站点地址,如何从FTP站点获取文件,如何实现Linux和Windows下FTP站点的兼容,甚至如何利用IIS和Serv-U配置一个自己的FTP站点,这些问题一个一个被解决。从最初的实现功能到后来的完善功能,在这个过程中自己不断的学习和成长,直到后来,发现一个基本的网络爬虫的实现其实并不困难,难的是如何让这个网络爬虫能够高效率并且稳定的工作。对于各个FTP服务器的兼容也是一个巨大的困难,这些在设计之初,都是被我忽略的细节。
总的来说,这次论文完成之后,不但学到了书本以外的知识,而且还增长了自己发现问题解决问题的能力,同时也提高了团队合作的意识,对以后的工作和生活将起很大的作用,对于所做任务网络爬虫的认识也有了很大的提高,已经做到了不再纠结于如何去实现它,而是在思考如何能够对其在有基本功能的基础上进行改进。