网站首页 > 开源技术 正文
上次讲到系统架构和设计功能,下面继续
3 系统功能实现和关键技术分析
3.1 网址采集管理
种子url的选取至关重要,选择专题性的种子网站是保证爬虫爬取信息有效性的必要条件,同时需要考虑到种子网站所在页面解析出的新的URL和主题的相关性。信息过滤模块采用了关键词过滤机制。原创微信公众号:卧龙会IT技术。以便于提取每个页面解析出的新的种子URL以及该种子URL链接到的新内容,然后根据主题的关键字自动构造正则表达式进行新的爬取过程。
如何设置关键字,以便于动态生成新的种子URL?例如,针对通信与信息系统领域——3G/4G移动通信专题,配置时选择如下关键字:3G、4G、移动通信、WCDMA、TD-SCDMA、CDMA2000、WIMAX、LTE、标准、信息产业、通信、运营、3G应用、无线网络进行专题特征表述,同时作为过滤时判断主题相关性的依据。
基于互联网的数据一般是海量的,所以进行分页抓取才能保证信息的完整度,在配置页面进行是否分页,分页参数的规则配置,有利于多页爬取信息。
3.2 内容采集管理
通过自定义内容采集规则可以对不同网站实现不同内容的抓取,从而获得最真实、最有效的数据,并且能够节省大量存储空间。内容采集规则常用的形式包括:xpath、正则表达式。xpath 是一种结构化网页元素选择器,支持列表和单节点数据获取,他的好处可以支持规整网页数据抓取;
正则表达式通过自定义规则,可以匹配和过滤更多形式的内容和数据,从而弥补了xpath的不足。通过两者配合使用,可以定制出非常灵活强大的爬取规则,同时在更新和维护上更加的简便。
内容采集管理页面如下图所示,使用列表形式展示内容采集规则,用户可以方便的进行规则的增加、删除、编辑等操作。通过点击内容采集管理页面中的【添加】按钮可以添加新的内容采集规则,用户可以选择该规则适用的网址、采集规则内容、采集规则类型、分属的任务组。
通过关联任务组,使得内容采集规则可以精细到每一个网站,并且可以为同一个抓取网站指定多条内容抓取规则。由此实现内容抓取规则的高配置性和高扩展性,为数据采集提供清晰、高效的规则支持,有利实现低耦合,高内聚的系统架构。
3.3 数据处理
数据处理是数据采集的重要环节,通过对采集到的数据进行必要的处理,才能得到更便于表达和利用的数据。数据处理界面的设计如下图,用户可以使用数据处理规则,实现对数据的处理。
每个规则有自己的一套独立的语法,与插件机制联通,通过开发不同的数据处理插件,实现系统丰富的数据处理功能。通过点击【添加】按钮,用户可以添加已有数据处理规则,包括:标签过滤,内容替换,自动摘要,自动分词,自动下载等等。通过指定规则优先级、规则类型、参数、内容、任务组,用户可以自定义数据处理的执行顺序,从而保证了过程化的数据处理逻辑,充分展示了系统的高配置性和灵活性。
3.4 数据发布
数据处理后的需要进行保存和对外发布,为最终的数据用户提供数据来源。制定数据的存储方案时,充分考虑了系统的可拓展性和对应用的透明性,我们将数据存储模块抽象出来,通过配置数据连接字串,使得多种数据库接入变成一个简单的配置字符串。数据发布样式如下所示,通过点击【添加】按钮,用户可以添加数据库连接字串,策略名称和该策略的优先级。
3.5 多任务多线程采集
多线程数据采集可以充分利用多核CPU的优势,使得单机数据采集的效率得到大幅度的提高。在多任务模式下,系统能够执行载不同机器上执行不同的数据采集任务,极大的提高了大数据采集的能力。
基于此,系统底层采用Hadoop集群这种分布式处理框架,通过分布式资源调度器和用户配置的规则,可以实现大规模集群协作采集数据。本方案的多任务多线程采集页面设计如下图所示,每一条配置规则包含如下字段:服务器名称、线程池、IP、端口、周期、间隔、任务组、触发时间和常用操作。
用户通过点击页面中的【添加】按钮,可以指定采集线程数量,IP和端口,运行周期,运行间隔和触发时间。同时可以对规则划分不同的组,使得多条规则作用于同一个爬取任务中,实现采集策略的多样性。另外用户注意合理的规划爬虫执行的间隔,以一种友好的方式爬取目标网站,避免目标网站负载过重而瘫痪。
3.6 HTTP二级代理服务器
为了保护网站自身的安全,被采集网站通常会采用反爬虫策略限制爬虫的爬取,因此需要使用二级代理服务器来规避网站的反爬虫限制。HTTP二级代理服务器管理界面如下图所示,用户可以对代理规则进行启动、停止、删除等操作。同时系统会自动对每一个IP进行超时检测,保证代理的延时在可控范围内,保证数据采集工具的高效性不受影响。
3.7 计划任务管理器
通过配置计划任务,可以实现系统任务的自动运行以便于提高效率,同时可以减少人为失误的可能性。crontab 是linux系统用来设置周期性执行程序的指令。可以设置每隔一段时间执行一次程序。例如通过编写一个cronfile定时处理文件即可,每隔20分钟,执行一个备份操作:
*/20 * * * * /usr/bin/backup
程序会在0分,20分,40分的时候启动一个/usr/bin/backup进程。
crontab的优点是可以指定确切的时间点启动程序,可以准确控制每次执行的间隔(两次开始执行程序的时间间隔)。用户通过任务组管理界面,对每个定时计划任务都可以实现更新和删除操作,使得用户无需复杂的配置即可实现对计划任务的高效配置。
3.8 任务运行日志管理
系统的日志管理系统采用Flume的方案。Flume 是一个分布式、可靠、和高可用的海量日志采集、聚合和传输的系统。支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种数据接受方(比如文本、HDFS、Hbase等)的能力 。
Flume的核心是把数据从数据源收集过来,再送到目的地。为了保证输送一定成功,在送到目的地之前,会先缓存数据,待数据真正到达目的地后,删除自己缓存的数据。Flume运行的核心是Agent。它是一个完整的数据收集工具,含有三个核心组件,分别是source、channel、sink。通过这些组件,Event可以从一个地方流向另一个地方。
Flume使用事务性的方式保证传送Event整个过程的可靠性。Sink必须在Event被存入Channel后,或者,已经被传达到下一站agent里,又或者,已经被存入外部数据目的地之后,才能把Event从Channel中remove掉。这样数据流里的event无论是在一个agent里还是多个agent之间流转,都能保证可靠,因为以上的事务保证了event会被成功存储起来。
原创微信公众号:卧龙会IT技术。
而Channel的多种实现在可恢复性上有不同的保证。也保证了event不同程度的可靠性。日志管理界面通过列表形式展示系统中的日志,用户可以点击查看详情得到日志详情。
3.9 插件扩展
Nutch自带的插件系统使得用户可以对数据采集的各个环节进行干预,Nutch插件具有以下优点:
1:可扩展性
通过plugin,nutch允许任何人扩展它的功能,而我们要做的只是对给定的接口做简单的实现,举个例子:MSWordParser这个插件是用来分析wordwendang的,它就是一个对parser这个接口的实现
2:灵活性
因为每个人都可以根据自己的需求而写自己的plugin,这样plugin就会有一个很强大的资源库。这样对与应用nutch程序员来说,他可以在自己的搜索引擎上安装符合自己需求的插件,而这些插件就在nutch的plugins中。这对于正在应用nutch的开发者来说应该是一个巨大的福音,因为你有了更多的关于内容抽取的算法来选择,很容易就增加了pdf的分析。
3:可维护性
每个开发者只要关注自己的问题。对于内核的开发者在为引擎内核扩展的同时,为a plug添加一个描述它的接口就可以了。一个plugin的开发者只要关注这个plugin所要实现的功能,而不需要知道整个系统是怎么工作的。它们仅仅需要知道的是plugin和plug之间交换的数据类型。这使得内核更加简单,更容易维护。
插件管理界面设计如下图所示,用户只需要添加插件对应的位置,系统即可自动加载,同时用户可以对已加载的插件进行管理,移除不必要的插件,保证系统的高效运行。
3.10 内容分析管理
内容分析界面设计如下图所示,通过指定关键字,数据采集系统可以自动根据关键字并利用文本的相似度分析、模糊匹配等技术,实现抓取内容的专题分类,优良事件分类,相似度评价。同时用户可以通过界面上的操作按钮轻松实现关键字的管理。
3.11 人工干预
采集到的数据会被存放在数据库,通过人工干预可以提高数据的准确性。人工干预界面设计如下图所示,用户可以查看每项爬取的内容,在新的页面中可以编辑,修改和更新。
3.12 中文分词和插件的开发实现
中文分词模块在系统中与信息查询模块、信息索引模块密切相关,如图4所示:
(1)对抓取到本地的网页资源进行索引前,信息索引模块会调用中文分词模块进行分词,分词之后的索引字段写入Lucene库。
(2)在用户发出查询请求后,信息查询模块也会调用中文分词模块对用户提交的请求进行解析和切分,然后转化为符合Lucene 检索接口标准的查询字段,在索引库中进行查询比较,返回相应的文档集合。
(3)中文分词模块按照词典中存在的词条对输入进行机械切分和匹配,若在词典中找到某个字符串,则匹配成功,即识别出一个词。记录该词的位置并返回该词的词典索引。
(4)词典管理模块主要实现对词典中词条数目的统计、词条的动态增加和删除功能。
本系统中文分词模块的设计采用基于字符串匹配的分词方法,最重要的组成部分就是词典。中文分词模块通用词典和电子计算机通信专业词典如图5所示:
计算机通信专业词典
从性能方面,本系统所采用的分词器是一款用Java编写的基于词典的中文分词器,可与Lucene一起使用来构建搜索引擎系统。目前,该中文分词器的最新版本是1.1.7,采用分词标准,能应用在百万级以上的大型搜索引擎系统中。
从实现方式上,经过对Nutch插件机制和Nutch分词机制的研究分析,为了提高系统的灵活性,Nutch数据采集系统在引入基于中文词典分词器的基础上实现了独立的中文分词插件NWHSSAnalyzer,代替Nutch默认的NutchDocumentAnalyzer按字分词方式。
当某个插件需要被加载时,Nutch会加载所有插件的相关接口到缓存,此后每个插件需要实例的时候,根据相关接口和相关接口实现实例在缓存内的记录,实现一个实例并返回。
(1)当第一次需要得到 NutchAnalyzer的一个子类的实例时,下面代码用来获得所有的实例(AnalyzerFactory.java中调用):
AnalyzerFactory factory =(AnalyzerFactory)conf.getObject(AnalyzerFactory.class.getName);
(2)如果为空,则试图从插件仓库中得到该插件的扩展点:
ExtensionPoint point = PluginRepository.get(conf).getExtensionPoint(NutchAnalyzer.X_POINT_ID);
在 PluginRepository.get(conf),返回插件仓库,如果仓库为空,会初始化所有插件:其中 NutchAnalyzer类是Nutch中扩展分析文本的扩展点,所有用于解析文本的插件都要实现这个扩展点。
(3)获得所有NutchAnalyzer的子类描述。
Extension extensions = point.getExtensions;
(4)循环获得每个插件的两个参数,fieldName和rawFieldNames,生成每个Filter插件实例。 至此,所有实现NutchAnalyzer的子类实例均被加载。
下面是以插件方式封装后的NWHSSAnalyzer中文分词插件的plugin.xml文档片段注释:
<plugin id="analysis-zh" <="" p="" style="box-sizing: border-box;">
name="NWHSSAnalyzer Plug-in"
version="1.0.0"
provider-name="bupt.dlib.czr">
name="NWHSSAnalyzer"
point="org.apache.nutch.analysis.zh. NWHSSAnalyzer ">
class="org.apache.nutch.analysis.NutchAnalyzer">
用Luke索引查看工具查看Lucene索引结果,中文分词前后索引结果的对照情况如图6所示:
其中,左边为分词前的存储结构,右边是经过中文分词模块处理后的索引存储结构。可以看到分词切分效果符合汉语语义,对专业性词汇切分效果也较好。
3.13 检索结果层次化自动聚类实现
聚类形式大体上可归纳为三种:目录结构、层次聚类结构和树状及网状结构。目录结构即将聚类类目简单罗列;层次聚类采用“自下而上”的方式将聚类结果再进行聚类,直到满足“类内最大相似,类间最大差异”的聚类目的;树状和网状结构是将聚类结果进行一系列的控制和优化处理,将类目间的关系揭示出来,通过类目列表的形式来展示搜索结果。
本文采用的 Carrot2是一个开源项目,用于解决搜索结果层次化聚类。它能够自动把搜索结果组织成一些专题分类。取样实验的聚类结果如图7所示:
聚类的关键词是cdma,聚类的文档数是120个,文档类型是Lucene索引文档,采用的聚类算法是Lingo聚类算法,形成32个聚类结果。实验表明该聚类能够较好地依据网页所包含的相应关键词作为类目名称,类目名称可以反映此类目下所包含资源的主题,并体现了类目间的逻辑关系。
可视化技术在聚类结果展示方面发挥了巨大的作用,消除了传统列表形式不够“易用”的缺陷,使用户能够更方便地理解和使用聚类结果,形象地展示聚类结果,如图8所示。一块区域代表一个类目,区域中样本点的多少代表类目下结果的多少,面积愈大表明结果愈多,反之愈少。类目的远近代表类目间关系的紧密程度,愈近则表示类目间关系越密切,进而形成聚类组。
依据网页所包含的相应关键词作为类目名称,体现类目间的逻辑关系,在原有搜索结果基础上再次聚类以满足用户的个性化需求,并使类目之间建立一定的逻辑关系,类目名称能够反映此类目下所含资源的主题。通过聚类, 达到减轻用户负担、快速定位所需搜索结果的目的。
3.14 系统集成应用和Webservice服务接口实现
系统服务接口模块提供数据服务接口和检索服务接口两种服务方式。这两种方式分别体现了数据的集成和资源的集成思想。这里主要分析数据服务和检索服务接口的设计思想和功能模块之间的关系。
(1)数据服务接口:主要提供数据层的服务,包括对象数据和元数据。服务对象主要是本地资源库系统和OAI中心仓储系统。
(2)检索服务接口:主要提供资源层的服务,资源类型是网页资源,服务对象是统一检索系统,如图9所示:
本地资源库系统从面向最终用户服务的层面统一管理各种电子资源,包括网页资源、学位论文、期刊论文、音频、多媒体资源等,结合用户需求提供不同权限的个性化服务。网络资源是其中不可或缺的重要资源类型,Nutch数据采集系统主要作为网页资源的提供者为本地资源库系统提供数据源,既包括元数据信息,也包括对象数据。
OAI中心仓储系统从面向机构间大批量数据交互的层面作为系统保存和管理数字资源的中心,统一管理和存储数字资源。Nutch数据采集系统可以为仓储系统提供网页资源的元数据和对象数据。经过本地资源库系统,由该系统汇总各种类型的资源,按照元数据模板和对象数据格式进行加工标引,审核后统一发布。
统一检索系统是一个跨库检索平台,屏蔽不同的检索资源为用户提供一个统一的检索界面和检索结果。统一检索子系统拥有多个商业资源和本地资源,Nutch数据采集系统可以作为一种本地资源为统一检索系统集成。
根据Webservice服务创建、发布、调用的规范,在本地建立一个支持检索服务的Web Service 服务端,只需要从客户端接收相应的参数,包括:资源类型(Resource_name=website)、检索类型(Meta_name)、检索表达式(QueryString)这三个参数,然后触发本地的一次检索,把检索结果集按照客户端的要求封装成XML格式的数据,返回给客户端,这样就完成了一次Web Service服务的完整调用。原创微信公众号:卧龙会IT技术。
系统服务接口具有良好的扩展性,只要符合Webservice标准和参数调用规范的客户端都可以调用该服务进行本地专题网络资源的检索,极大地提高了系统之间交换的灵活性和资源的共享性。
4 结 语
通过对主题搜索引擎技术原理和应用的研究,对目前具有代表性的开源网络抓取软件进行了比较分析,最终选择在Nutch基础之上进行多种扩展和改进。
在引入搜索引擎基本架构模型,即抓取器、索引器、查询器的基础上,根据数据采集系统集成应用的实用化要求,设计开发了信息过滤模块、基于计算机通信领域专业词典的中文分词模块、GUI信息定制模块、词典和关键词管理模块等。
采用正则表达式过滤、Lucene全文索引、Plugin插件开发等技术实现,保证采集和获取过程中资源的专题性、系统的可管理性和易用性,并对搜索结果的层次化自动聚类进行了深入研究。此外,设计开发了专题知识库信息加工标引模块和基于Webservice的检索服务模块来为系统的集成应用提供服务接口,实现了数据的集成和资源的集成,为用户提供全面而专业的服务。
文|原创:阡陌网络
微信公众号:卧龙会IT技术
微博:@卧龙会IT技术
大神直播免费公益课等着你!
------本文由卧龙会团队成员阡陌网络原创,请勿抄袭。转载联系卧龙会进行授权,否则追究法律责任。欢迎微信分享原文到朋友圈,微信群!
猜你喜欢
- 2024-10-08 了解大数据技术栈中常见的概念,这都不知道,怎么能行
- 2024-10-08 改变世界的10大程序员,成就无人能及,网友:还好!大家都有头发
- 2024-10-08 Nutch-Hadoop-MongoDB搭建分布式爬虫
- 2024-06-30 大数据之Hadoop是什么?Hadoop起源?
- 2024-06-30 对于大数据采集系统,主要分为这三类采集系统
- 2024-06-30 盘点一下程序员11年学了的技术,或许你就不愿意做程序员了
- 2024-06-30 一篇文章读懂大数据的黄色小象帮手
- 2024-06-30 Linux安装nutch1.9(Linux安装nginx)
- 2024-06-30 Web 爬虫 Apache Nutch 1.14 发布,MariaDB 10.1.30 发布
- 2024-06-30 数据采集-nutch爬虫框架(爬虫数据采集教程)
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- jdk (81)
- putty (66)
- rufus (78)
- 内网穿透 (89)
- okhttp (70)
- powertoys (74)
- windowsterminal (81)
- netcat (65)
- ghostscript (65)
- veracrypt (65)
- asp.netcore (70)
- wrk (67)
- aspose.words (80)
- itk (80)
- ajaxfileupload.js (66)
- sqlhelper (67)
- express.js (67)
- phpmailer (67)
- xjar (70)
- redisclient (78)
- wakeonlan (66)
- tinygo (85)
- startbbs (72)
- webftp (82)
- vsvim (79)
本文暂时没有评论,来添加一个吧(●'◡'●)