最近由于业务需要监控一些数据,虽然市面上有很多优秀的爬虫框架,但是我仍然打算从头开始实现一套完整的爬虫框架。
在技术选型上,我没有选择春天来搭建项目,而是选择了更轻量级的Vert.x。一方面感觉春天太重了,而Vert.x是一个基于JVM,轻量级,高性能的框架。它基于事件和异步,依托于全异步Java服务器网状的,并扩展了很多其他特性。
github地址:https://github.com/fengzhizi715/NetDiscovery
<强>一。爬虫框架的功能强>
爬虫框架包含爬虫引擎(SpiderEngine)和爬虫(蜘蛛).SpiderEngine可以管理多个蜘蛛。
<强>蜘蛛强>
1.1在蜘蛛中,主要包含几个组件:下载器,队列,解析器,管道以及代理池IP (proxypool),代理池是一个单独的项目,我前段时间写的,在使用爬虫框架时经常需要切换代理IP,所以把它引入进来。
proxypool地址:https://github.com/fengzhizi715/ProxyPool
其余四个组件都是接口,在爬虫框架中内置了一些实现,例如内置了多个下载器(下载)包括vertx的webclient, http客户端,okhttp3、硒实现的下载器。开发者可以根据自身情况来选择使用或者自己开发全新的下载器。
下载器下载的方法会返回一个Maybe
包com.cv4j.netdiscovery.core.downloader; 进口com.cv4j.netdiscovery.core.domain.Request; 进口com.cv4j.netdiscovery.core.domain.Response; 进口io.reactivex.Maybe;/* * *由托尼> downloader.download(请求) .observeOn (Schedulers.io ()) . map(新Function<响应,Page> () { @Override 公共页面应用(响应响应){抛出异常 页面页面=new (); 页面。setHtml(新Html (response.getContent ())); page.setRequest(请求); page.setUrl (request.getUrl ()); page.setStatusCode (response.getStatusCode ()); 返回页面; } }) . map(新Function<页面,Page> () { @Override 公共页面申请页面(页面){抛出异常 如果(解析器!=null) { parser.process(页面); } 返回页面; } }) . map(新Function<页面,Page> () { @Override 公共页面申请页面(页面){抛出异常 如果(Preconditions.isNotBlank(管道)){ pipelines.stream () .forEach(管道→pipeline.process (page.getResultItems ())); } 返回页面; } }) .subscribe(新的Consumer() { @Override 公共空间接受页面(页面){抛出异常 log.info (page.getUrl ()); 如果(request.getAfterRequest () !=null) { request.getAfterRequest () .process(页面); } } },新的Consumer () { @Override 公共空间接受(Throwable Throwable){抛出异常 log.error (throwable.getMessage ()); } }); >之前 在这里使用RxJava 2可以让整个爬虫框架看起来更加响应式:)
<强> 1.2 SpiderEngine 强>
SpiderEngine可以包含多个蜘蛛,可以通过addSpider (), createSpider()来将爬虫添加到SpiderEngine和创建新的蜘蛛并添加到SpiderEngine。
在SpiderEngine中,如果调用了httpd(港口)方法,还可以监控SpiderEngine中各个蜘蛛。
1.2.1获取某个爬虫的状态
http://localhost{港口}/netdiscovery/蜘蛛/{spiderName}
类型:
1.2.2获取SpiderEngine中所有爬虫的状态
http://localhost{港口}/netdiscovery/蜘蛛/
类型:
1.2.3修改某个爬虫的状态
http://localhost{港口}/netdiscovery/蜘蛛/{spiderName}/状态
类型:文章
参数说明:
{ “状态”:2//让爬虫暂停 }
状态 作用 2 让爬虫暂停 3. 让爬虫从暂停中恢复 4 让爬虫停止
基于绿色。2 x和RxJava构建通用的爬虫框架的示例