热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Java爬虫框架(一)架构设计

一、        架构图

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


Java爬虫框架(一)--架构设计
 

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

数据库:存储商品信息

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

Task队列:需要爬取的网页列表

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

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

二、        爬虫

1.      流程

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

2)       WorkersTaskQueue中获取任务

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

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

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

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


Java爬虫框架(一)--架构设计
 

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解析器,可以修复这些非完好格式化的网页。

熟悉的第三方工具有TagSoupnekohtmlhtmlparser三款。tagsoupnekohtml可以将HTMLSAX事件流处理,节省了内存。

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

l        Nutch:正式支持的有tagsoupnekohtml,二者通过配置选择

l        Droids:用的是nekohtmlTika

l        Tikatagsoup

据称,tagsoup的可靠性要比nekohtml好,nekohtml的性能比tagsoup好。nekohtml不管是在可靠性还是性能上都比htmlparser好。具体结论我们还需要进一步测试。

我们还支持regexdom结构的html解析器。在使用中我们可以结合使用。

进一步,我们需要研究文档比较器,同时需要我们保存爬取过的网站的HTML.可以通过语义指纹或者simhash来实现。在处理海量数据的时候才需要用上。如果两个HTML被认为是相同的,就不会再解析和处理。

7.      Handler

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

回调方式(visitor):对于SAX event处理,我们需要将handler适配成saxcontent handler。作为parser的回调方法。不同事件解析出来的内容可以存储在HandlingContext中。最后由Parser一起返回。

主动方式:需要解析整个HTML,选取自己需要的内容。对Parser提取的内容进行处理。XML需要解析成DOM结构。方便使用,可以使用Xpathnodefilter等,但耗内存。

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

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

8.      VisitedTableManager

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

三、        Task队列

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

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

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

l          Redis存储

四、        Visited

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

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

l          Mysql 内存表 hash index

l          Redis: Key value,设过期时间

l          Memcached: key value, valuebloomfilter的值

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

五、        爬虫监控管理平台

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

l          监控,管理task队列,visited

l          配置爬虫

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

 


推荐阅读
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • 本文整理了315道Python基础题目及答案,帮助读者检验学习成果。文章介绍了学习Python的途径、Python与其他编程语言的对比、解释型和编译型编程语言的简述、Python解释器的种类和特点、位和字节的关系、以及至少5个PEP8规范。对于想要检验自己学习成果的读者,这些题目将是一个不错的选择。请注意,答案在视频中,本文不提供答案。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了在Android开发中使用软引用和弱引用的应用。如果一个对象只具有软引用,那么只有在内存不够的情况下才会被回收,可以用来实现内存敏感的高速缓存;而如果一个对象只具有弱引用,不管内存是否足够,都会被垃圾回收器回收。软引用和弱引用还可以与引用队列联合使用,当被引用的对象被回收时,会将引用加入到关联的引用队列中。软引用和弱引用的根本区别在于生命周期的长短,弱引用的对象可能随时被回收,而软引用的对象只有在内存不够时才会被回收。 ... [详细]
  • 用Vue实现的Demo商品管理效果图及实现代码
    本文介绍了一个使用Vue实现的Demo商品管理的效果图及实现代码。 ... [详细]
  • express工程中的json调用方法
    本文介绍了在express工程中如何调用json数据,包括建立app.js文件、创建数据接口以及获取全部数据和typeid为1的数据的方法。 ... [详细]
  • 大数据Hadoop生态(20)MapReduce框架原理OutputFormat的开发笔记
    本文介绍了大数据Hadoop生态(20)MapReduce框架原理OutputFormat的开发笔记,包括outputFormat接口实现类、自定义outputFormat步骤和案例。案例中将包含nty的日志输出到nty.log文件,其他日志输出到other.log文件。同时提供了一些相关网址供参考。 ... [详细]
  • 本文介绍了DataTables插件的官方网站以及其基本特点和使用方法,包括分页处理、数据过滤、数据排序、数据类型检测、列宽度自动适应、CSS定制样式、隐藏列等功能。同时还介绍了其易用性、可扩展性和灵活性,以及国际化和动态创建表格的功能。此外,还提供了参数初始化和延迟加载的示例代码。 ... [详细]
author-avatar
破背包
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有