Java爬虫框架.docx

上传人:b****8 文档编号:9589673 上传时间:2023-02-05 格式:DOCX 页数:13 大小:202.36KB
下载 相关 举报
Java爬虫框架.docx_第1页
第1页 / 共13页
Java爬虫框架.docx_第2页
第2页 / 共13页
Java爬虫框架.docx_第3页
第3页 / 共13页
Java爬虫框架.docx_第4页
第4页 / 共13页
Java爬虫框架.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

Java爬虫框架.docx

《Java爬虫框架.docx》由会员分享,可在线阅读,更多相关《Java爬虫框架.docx(13页珍藏版)》请在冰豆网上搜索。

Java爬虫框架.docx

Java爬虫框架

一、        架构图

那里搜网络爬虫框架主要针对电子商务网站进行数据爬取,分析,存储,索引。

 

爬虫:

爬虫负责爬取,解析,处理电子商务网站的网页的内容

数据库:

存储商品信息

索引:

商品的全文搜索索引

Task队列:

需要爬取的网页列表

Visited表:

已经爬取过的网页列表

爬虫监控平台:

web平台可以启动,停止爬虫,管理爬虫,task队列,visited表。

二、        爬虫

1.      流程

1)       Scheduler启动爬虫器,TaskMaster初始化taskQueue

2)       Workers从TaskQueue中获取任务

3)       Worker线程调用Fetcher爬取Task中描述的网页

4)       Worker线程将爬取到的网页交给Parser解析

5)       Parser解析出来的数据送交Handler处理,抽取网页Link和处理网页内容

6)       VisitedTableManager判断从URLExtractor抽取出来的链接是否已经被爬取过,如果没有提交到TaskQueue中

 

2.      Scheduler

Scheduler负责启动爬虫器,调用TaskMaster初始化TaskQueue,同时创建一个monitor线程,负责控制程序的退出。

何时退出?

当TaskQueue为空,并且Workers中的所有线程都处于空闲状态。

而这种形势在指定10分钟内没有发生任何变化。

就认为所有网页已经全部爬完。

程序退出。

3.      TaskMaster

任务管理器,负责管理任务队列。

任务管理器抽象了任务队列的实现。

l        在简单应用中,我们可以使用内存的任务管理器

l        在分布式平台,有多个爬虫机器的情况下我们需要集中的任务队列

在现阶段,我们用SQLLite作为任务队列的实现。

可供替代的还有Redis。

任务管理器的处理流程:

l        任务管理器初始化任务队列,任务队列的初始化根据不同的配置可能不同。

增量式的情况下,根据指定的URLList初始化。

而全文爬取的情况下只预先初始化某个或几个电子商务网站的首页。

l        任务管理器创建monitor线程,控制整个程序的退出

l        任务管理器调度任务,如果任务队列是持久化的,负责从任务队列服务器load任务。

需要考虑预取。

l        任务管理器还负责验证任务的有效性验证,爬虫监控平台可以将任务队列中的某些任务设为失效?

4.      Workers

Worker线程池,每个线程都会执行整个爬取的流程。

可以考虑用多个线程池,分割异步化整个流程。

提高线程的利用率。

5.      Fetcher

Fetcher负责直接爬取电子商务网站的网页。

用HTTPClient实现。

HTTPcore4以上已经有NIO的功能, 用NIO实现。

Fetcher可以配置需不需要保存HTML文件

6.      Parser

Parser解析Fetcher获取的网页,一般的网页可能不是完好格式化的(XHTML是完美格式化的),这样就不能利用XML的类库处理。

我们需要一款比较好的HTML解析器,可以修复这些非完好格式化的网页。

熟悉的第三方工具有TagSoup,nekohtml,htmlparser三款。

tagsoup和nekohtml可以将HTML用SAX事件流处理,节省了内存。

已知的第三方框架又使用了哪款作为他们的解析器呢?

l        Nutch:

正式支持的有tagsoup,nekohtml,二者通过配置选择

l        Droids:

用的是nekohtml,Tika

l        Tika:

tagsoup

据称,tagsoup的可靠性要比nekohtml好,nekohtml的性能比tagsoup好。

nekohtml不管是在可靠性还是性能上都比htmlparser好。

具体结论我们还需要进一步测试。

我们还支持regex,dom结构的html解析器。

在使用中我们可以结合使用。

进一步,我们需要研究文档比较器,同时需要我们保存爬取过的网站的HTML.可以通过语义指纹或者simhash来实现。

在处理海量数据的时候才需要用上。

如果两个HTML被认为是相同的,就不会再解析和处理。

7.      Handler

Handler是对Parser解析出来的内容做处理。

回调方式(visitor):

对于SAXevent处理,我们需要将handler适配成sax的contenthandler。

作为parser的回调方法。

不同事件解析出来的内容可以存储在HandlingContext中。

最后由Parser一起返回。

主动方式:

需要解析整个HTML,选取自己需要的内容。

对Parser提取的内容进行处理。

XML需要解析成DOM结构。

方便使用,可以使用Xpath,nodefilter等,但耗内存。

ContentHandler:

它还包含组件ContentFilter。

过滤content。

URLExtractor负责从网页中提取符合格式的URL,将URL构建成Task,并提交到Taskqueue中。

8.      VisitedTableManager

访问表管理器,管理访问过的URLs。

提取统一接口,抽象底层实现。

如果URL被爬取过,就不会被添加到TaskQueue中。

三、        Task队列

Task队列存储了需要被爬取的任务。

任务之间是有关联的。

我们可以保存和管理这个任务关系。

这个关系也是URL之间的关系。

保存下来,有助于后台形成Web图,分析数据。

Task队列在分布式爬虫集群中,需要使用集中的服务器存放。

一些轻量级的数据库或者支持列表的NoSql都可以用来存储。

可选方案:

l          用SQLLite存储:

需要不停地插入删除,不知性能如何。

l          用Redis存储

四、        Visited表

Visited表存储了已经被爬的网站。

每次爬取都需要构建。

l          SQLLite存储:

需要动态创建表,需要不停地查询,插入,还需要后台定期地清理,不知性能如何。

l          Mysql 内存表 hashindex

l          Redis:

Keyvalue,设过期时间

l          Memcached:

keyvalue,value为bloomfilter的值

针对目前的数据量,可以采用SQLLite

五、        爬虫监控管理平台

l          启动,停止爬虫,监控各爬虫状态

l          监控,管理task队列,visited表

l          配置爬虫

l          对爬虫爬取的数据进行管理。

在并发情况下,很难保证不重复爬取相同的商品。

在爬取完后,可以通过爬虫监控管理平台进行手动排重。

一、        模块

1.      Scheduler

Scheduler负责启动爬虫,停止爬虫,监控爬虫的状态。

 

Scheduler在调度爬虫时,借助于Quartz,设置爬虫在某个时刻启动。

同一个名字的爬虫是stateful的。

Task:

初始化任务。

Trigger:

 触发器,描述何时触发爬虫。

开放Scheduler远程API,可以通过爬虫配置管理平台管理和监控爬虫。

2.      TaskMaster

 

TaskMaster:

管理Task的执行过程,提交Task给WorkerThreadPool执行。

TaskController:

独立线程,控制何时停止TaskMaster,DelayController和它自己

ExecutionState:

描述TaskMaster当前状态

TaskQueue:

存放未爬取的所有Task。

可以是基于内存的,也可以是持久化的。

不同的实现。

DelayTaskQueue:

有些网站,如果连续访问,会禁止爬取,遇到这种情况,我们会暂时停止对该网页的爬取,我们需要一个DelayTaskQueue存放被延迟的Task。

DelayController:

独立线程,不停的检测DelayTaskQueue中的Task是否过了限制期,过了限制期,移入到TaskQueue中等待爬取

Task:

描述一个爬取任务。

HTMLTask:

网页爬取任务

DBTask:

DB爬取任务

DelayPolicy:

定义Task的延迟策略,比如对同一个域名的网站,采取每隔5秒钟的爬取一次的方案。

如果发现遭到限制,对同一个域名的网站,采取停歇10分钟的策略。

考虑到对将来对数据爬虫的支持,抽象了统一接口。

数据库对Task,Fetcher,parser,Handler,Worker都有自己的实现。

3.      Fetcher

网页的直接爬取者。

根据传入的Task,爬取对方的网页。

 

WebFetcher爬取的网页直接作为输入流传回。

HTTPClientFetcher:

用HTTPClient4.0实现的WebFetcher,底层用的是javaNIO.

4.      Worker

Worker负责Task的具体执行,从爬取到处理的整个流程.TaskMaster将Worker提交到线程池中,有线程池调度并发执行。

 

Worker:

整个爬取的执行流程

HTMLWorker:

处理HTML网页的爬取

WorkerThreadPool:

线程池,供Worker执行使用

WorkerProcessor:

监听器。

在worker执行前,执行后调用。

可以做一些日志,错误处理等等。

5.      Parser

Parser将爬虫爬取的内容解析为规范的数据格式,提取有用的信息,便于系统进一步处理。

 

Parser:

将传入的content解析成Data,或者利用传入的handler可以一边parse一边调用handler处理。

Data:

Parser解析后的数据结构

Content:

Fetcher到的Content

RegexParser:

对传入的字符串进行正则匹配,提取想要的字符串。

SaxParser:

主要是通过回调方式实现

DomParser:

将XML转成Document返回

HTMLParser:

组合模式,可以综合使用RegexParser,DomParser等完成任务。

ParseContext:

传给Parser的上下文环境。

可供扩展使用。

6.      Filter

Filter可以对解析好的新Task,进行过滤。

 

7.      Handler

Handler对解析好的内容进行进一步处理,异步化处理和爬取解析。

处理主要是将爬取的数据入库和索引。

 

一、        Task队列

Task队列,存放还没有被处理的新任务。

 

二、        Visited表

Visited表的判断其实是TaskFilter的一种,只是TaskFilter用了VisitedTable来存储已经爬取过的任务。

 

VisitedTaskFilter:

判断Task是否已经被处理过

VisitedTable:

存储已经被爬取过的任务

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 文学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1