java 抓取文库,Java爬虫框架.doc

6894c33e9ea850e48a01b600503581d3.gifJava爬虫框架.doc

一、 架构图那里搜网络爬虫框架主要针对电子商务网站进行数据爬取,分析,存储,索引。爬虫:爬虫负责爬取,解析,处理电子商务网站的网页的内容数据库:存储商品信息索引:商品的全文搜索索引Task 队列:需要爬取的网页列表Visited 表:已经爬取过的网页列表爬虫监控平台:web 平台可以启动,停止爬虫,管理爬虫,task 队列,visited 表。二、 爬虫1. 流程1) Scheduler 启动爬虫器, TaskMaster 初始化 taskQueue2) Workers 从 TaskQueue 中获取任务3) Worker 线程调用 Fetcher 爬取 Task 中描述的网页4) Worker 线程将爬取到的网页交给 Parser 解析5) Parser 解析出来的数据送交 Handler 处理,抽取网页 Link 和处理网页内容6) VisitedTableManager 判断从 URLExtractor 抽取出来的链接是否已经被爬取过,如果没有提交到 TaskQueue 中2. SchedulerScheduler 负责启动爬虫器,调用 TaskMaster 初始化 TaskQueue,同时创建一个monitor 线程,负责控制程序的退出。何时退出?当 TaskQueue 为空,并且 Workers 中的所有线程都处于空闲状态。而这种形势在指定10 分钟内没有发生任何变化。就认为所有网页已经全部爬完。程序退出。3. Task Master任务管理器,负责管理任务队列。任务管理器抽象了任务队列的实现。l 在简单应用中,我们可以使用内存的任务管理器l 在分布式平台,有多个爬虫机器的情况下我们需要集中的任务队列在现阶段,我们用 SQLLite 作为任务队列的实现。可供替代的还有 Redis。任务管理器的处理流程:l 任务管理器初始化任务队列,任务队列的初始化根据不同的配置可能不同。增量式的情况下,根据指定的 URL List 初始化。而全文爬取的情况下只预先初始化某个或几个电子商务网站的首页。l 任务管理器创建 monitor 线程,控制整个程序的退出l 任务管理器调度任务,如果任务队列是持久化的,负责从任务队列服务器 load 任务。需要考虑预取。l 任务管理器还负责验证任务的有效性验证,爬虫监控平台可以将任务队列中的某些任务设为失效?4. WorkersWorker 线程池,每个线程都会执行整个爬取的流程。可以考虑用多个线程池,分割异步化整个流程。提高线程的利用率。5. FetcherFetcher 负责直接爬取电子商务网站的网页。用 HTTP Client 实现。HTTP core 4 以上已经有 NIO 的功能, 用 NIO 实现。Fetcher 可以配置需不需要保存 HTML 文件6. ParserParser 解析 Fetcher 获取的网页,一般的网页可能不是完好格式化的( XHTML 是完美格式化的),这样就不能利用 XML 的类库处理。我们需要一款比较好的 HTML 解析器,可以修复这些非完好格式化的网页。熟悉的第三方工具有 TagSoup,nekohtml,htmlparser 三款。tagsoup 和 nekohtml可以将 HTML 用 SAX 事件流处理,节省了内存。已知的第三方框架又使用了哪款作为他们的解析器呢?l Nutch:正式支持的有 tagsoup,nekohtml ,二者通过配置选择l Droids:用的是 nekohtml,Tikal Tika:tagsoup据称,tagsoup 的可靠性要比 nekohtml 好,nekohtml 的性能比 tagsoup 好。nekohtml 不管是在可靠性还是性能上都比 htmlparser 好。具体结论我们还需要进一步测试。我们还支持 regex,dom 结构的 html 解析器。在使用中我们可以结合使用。进一步,我们需要研究文档比较器,同时需要我们保存爬取过的网站的 HTML.可以通过语义指纹或者 simhash 来实现。在处理海量数据的时候才需要用上。如果两个 HTML 被认为是相同的,就不会再解析和处理。7. HandlerHandler 是对 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 中。三、 Task 队列Task 队列存储了需要被爬取的任务。任务之间是有关联的。我们可以保存和管理这个任务关系。这个关系也是 URL 之间的关系。保存下来,有助于后台形成 Web 图,分析数据。Task 队列在分布式爬虫集群中,需要使用集中的服务器存放。一些轻量级的数据库或者支持列表的 NoSql 都可以用来存储。可选方案:l 用 SQLLite 存储:需要不停地插入删除,不知性能如何。l 用 Redis 存储四、 Visited 表Visited 表存储了已经被爬的网站。每次爬取都需要构建。l SQLLite 存储:需要动态创建表,需要不停地查询,插入,还需要后台定期地清理,不知性能如何。l Mysql 内存表 hash indexl Redis: Key value,设过期时间l Memcached: key value, value 为 bloomfilter 的值针对目前的数据量,可以采用 SQLLite五、 爬虫监控管理平台l 启动,停止爬虫,监控各爬虫状态l 监控,管理 task 队列,visited 表l 配置爬虫l 对爬虫爬取的数据进行管理。在并发情况下,很难保证不重复爬取相同的商品。在爬取完后,可以通过爬虫监控管理平台进行手动排重。一、 模块1. SchedulerScheduler 负责启动爬虫,停止爬虫,监控爬虫的状态。Scheduler 在调度爬虫时,借助于 Quartz,设置爬虫在某个时刻启动。同一个名字的爬虫是 stateful 的。Task:初始化任务。Trigger: 触发器,描述何时触发爬虫。开放 Scheduler 远程 API,可以通过爬虫配置管理平台管理和监控爬虫。2. Task MasterTaskMaster:管理 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,底层用的是 java NIO.4. WorkerWorker 负责 Task 的具体执行,从爬取到处理的整个流程. TaskMaster 将 Worker 提交到线程池中,有线程池调度并发执行。Worker:整个爬取的执行流程HTMLWorker:处理 HTML 网页的爬取WorkerThreadPool:线程池,供 Worker 执行使用WorkerProcessor:监听器。在 worker 执行前,执行后调用。可以做一些日志,错误处理等等。5. ParserParser 将爬虫爬取的内容解析为规范的数据格式,提取有用的信息,便于系统进一步处理。Parser:将传入的 content 解析成 Data,或者利用传入的 handler 可以一边 parse 一边调用 handler 处理。Data:Parser 解析后的数据结构Content:Fetcher 到的 ContentRegexParser:对传入的字符串进行正则匹配,提取想要的字符串。SaxParser:主要是通过回调方式实现DomParser:将 XML 转成 Document 返回HTMLParser:组合模式,可以综合使用 RegexParser,DomParser 等完成任务。ParseContext:传给 Parser 的上下文环境。可供扩展使用。6. FilterFilter 可以对解析好的新 Task,进行过滤。7. HandlerHandler 对解析好的内容进行进一步处理,异步化处理和爬取解析。处理主要是将爬取的数据入库和索引。一、 Task 队列Task 队列,存放还没有被处理的新任务。二、 Visited 表Visited 表的判断其实是 TaskFilter 的一种,只是 TaskFilter 用了 VisitedTable 来存储已经爬取过的任务。VisitedTaskFilter:判断 Task 是否已经被处理过VisitedTable:存储已经被爬取过的任务

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值