Java爬虫框架

、        架构图

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

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

数据库:存储商品信息web

索引:商品的全文搜索索引sql

Task队列:须要爬取的网页列表数据库

Visited表:已经爬取过的网页列表服务器

爬虫监控平台:web平台能够启动,中止爬虫,管理爬虫,task队列,visited表。网络

2、        爬虫

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.      Task Master

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

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

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

在现阶段,咱们用SQLLite做为任务队列的实现。可供替代的还有Redis。

任务管理器的处理流程:

l        任务管理器初始化任务队列,任务队列的初始化根据不一样的配置可能不一样。增量式的状况下,根据指定的URL List初始化。而全文爬取的状况下只预先初始化某个或几个电子商务网站的首页。

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

l        任务管理器调度任务,若是任务队列是持久化的,负责从任务队列服务器load任务。须要考虑预取。

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

4.      Workers

Worker线程池,每一个线程都会执行整个爬取的流程。能够考虑用多个线程池,分割异步化整个流程。提升线程的利用率。

5.      Fetcher

Fetcher负责直接爬取电子商务网站的网页。用HTTP Client实现。HTTP core 4以上已经有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):对于SAX event处理,咱们须要将handler适配成sax的content handler。做为parser的回调方法。不一样事件解析出来的内容能够存储在HandlingContext中。最后由Parser一块儿返回。

主动方式:须要解析整个HTML,选取本身须要的内容。对Parser提取的内容进行处理。XML须要解析成DOM结构。方便使用,可使用Xpath,nodefilter等,但耗内存。

ContentHandler:它还包含组件ContentFilter。过滤content。

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

8.      VisitedTableManager

访问表管理器,管理访问过的URLs。提取统一接口,抽象底层实现。若是URL被爬取过,就不会被添加到TaskQueue中。

3、        Task队列

Task队列存储了须要被爬取的任务。任务之间是有关联的。咱们能够保存和管理这个任务关系。这个关系也是URL之间的关系。保存下来,有助于后台造成Web图,分析数据。

Task队列在分布式爬虫集群中,须要使用集中的服务器存放。一些轻量级的数据库或者支持列表的NoSql均可以用来存储。可选方案:

l          用SQLLite存储:须要不停地插入删除,不知性能如何。

l          用Redis存储

4、        Visited表

Visited表存储了已经被爬的网站。每次爬取都须要构建。

l          SQLLite存储:须要动态建立表,须要不停地查询,插入,还须要后台按期地清理,不知性能如何。

l          Mysql 内存表 hash index

l          Redis: Key value,设过时时间

l          Memcached: key value, value为bloomfilter的值

针对目前的数据量,能够采用SQLLite

5、        爬虫监控管理平台

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

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

l          配置爬虫

l          对爬虫爬取的数据进行管理。在并发状况下,很难保证不重复爬取相同的商品。在爬取完后,能够经过爬虫监控管理平台进行手动排重。

了解更多详情请登陆超人学院网站http://www.crxy.cn或者每周日晚八点半相约免费公开课https://ke.qq.com/course/53102#term_id=100145289  具体详情请联系QQ2435014406

相关文章
相关标签/搜索