architecture - monstercodings/websiphon GitHub Wiki

框架概念

组件介绍

  • 请求器

    // 顶级接口
    top.codings.websiphon.core.requester.WebRequester
    

    用于真正与网页交互的对象,发出请求、接收响应结果并将结果状态封装到请求对象WebRequest里的成员变量WebResponse

  • 爬虫

    // 顶级接口
    top.codings.websiphon.core.Crawler
    

    该接口只有三个职责:

    1. 启动爬虫;
    2. 推送需要爬取的任务;
    3. 关闭爬虫。

    另外还可利用该接口获取爬虫的id和对应的爬虫上下文CrawlerContext

  • 爬虫上下文

    // 顶级接口
    top.codings.websiphon.core.context.CrawlerContext
    

    该接口包含对应爬虫的所有资料, 并且可获取爬虫的内部组件,以及注册监听事件也是使用上下文进行的。

  • 操作句柄

    // 顶级接口
    top.codings.websiphon.factory.bean.WebHandler
    

    它只有一个职责,就是获取任务,经过请求之后返回响应对象并交由解析器做后续处理。

  • 解析器

    // 顶级接口
    top.codings.websiphon.core.parser.WebParser
    

    它负责注册各种处理器,并在获得请求返回结果之后按注册顺序调用处理器对结果进行处理。

  • 处理器

    // 顶级接口
    top.codings.websiphon.core.processor.WebProcessor
    

    实现该接口并注册到解析器里就可以对返回结果进行数据处理。

  • 管道
    目前管道有两种类型:

    1. 读写双向管道

      // 顶级接口
      top.codings.websiphon.core.pipeline.ReadWritePipeline
      
    2. 只写单向管道

      // 顶级接口
      top.codings.websiphon.core.pipeline.WritePipeline
      

    管道意味着解耦来源和去向,接入管道后爬虫并不关心它的任务从哪里来,处理结果输出到哪里去,这些均交由使用者自行定制信息源和数据池。

  • 事件

    1. 异步事件

      top.codings.websiphon.core.context.event.listener.WebAsyncEventListener
      
    2. 同步事件

      top.codings.websiphon.core.context.event.listener.WebSyncEventListener
      

    重写方法listen(E event)并且注册到爬虫上下文里就可以实现对应事件的监听。
    同步事件只能注册为同步事件,异步事件只能注册为异步事件。

    内置异步事件(基本均为异常回调事件):

    1. AllExceptionEvent
    2. WebExceptionEvent
    3. WebNetworkExceptionEvent
    4. WebParseExceptionEvent
    5. WebRejectedExecutionExceptionEvent

    内置同步事件:

    1. WebCrawlStartEvent 爬虫启动事件
    2. WebCrawlShutdownEvent 爬虫关闭事件(可用于清理资源、保存爬虫状态等)
    3. WebBeforeRequestEvent 爬虫真正发起网络请求前事件(若要阻止请求可使用抛出异常的方式中断流程)
    4. WebBeforeParseEvent 调用解析器之前事件
    5. WebAfterParseEvent 调用解析器之后事件
    6. WebLinksEvent 页面链接扩散事件
  • 插件

    // 顶级接口
    top.codings.websiphon.core.plugins.WebPlugin
    

    插件可用于替换爬虫的解析器、操作句柄,增强所有爬虫内部组件。
    ps:欢迎探索更多有趣的插件用法。

内置组件一览

  • 爬虫构建器

     top.codings.websiphon.core.support.CrawlerBuilder
    
     // 生成一个构建器
     public final static CrawlerBuilder create()
     // 添加请求器、管道、处理器、插件
     public CrawlerBuilder addLast(WebType type)
     // 添加同步事件的监听器
     public CrawlerBuilder addListener(WebSyncEventListener listener)
     // 添加异步事件的监听器
     public CrawlerBuilder addListener(WebAsyncEventListener listener)
     // 启用自定义的代理管理器
     public CrawlerBuilder enableProxy(ProxyManager manager)
     // 设置网络请求最大并发数
     public CrawlerBuilder setNetworkThread(int size)
     // 设置处理响应最大线程数
     public CrawlerBuilder setParseThread(int size)
     // 构建爬虫对象
     public Crawler build()
    
  • 网络请求器

    1. top.codings.websiphon.core.requester.NettyWebRequester 默认使用

      基于netty4打造,可使用Proxy代理的HTTP Client,专为该框架而设计,使用nio实现高性能和降低资源消耗的目的。 默认不做3xx响应的跳转,可通过显示构造请求器public NettyWebRequester(boolean redirect),入参redirect=true打开自动跳转功能

    2. top.codings.websiphon.core.requester.ApacheWebRequester

      基于apache的阻塞异步http client封装而来,具备高性能、低资源消耗的优点,但是目前在该请求器中尚未进行代理封装。 默认不做3xx响应的跳转,可通过显示构造请求器public ApacheWebRequester(boolean redirect),入参redirect=true打开自动跳转功能

    3. top.codings.websiphon.core.requester.Cdp4jWebRequester

      使用开源Chrome操作框架Cdp4j进行封装的浏览器级别的动态请求器,可用于爬取复杂动态渲染/异步加载数据类型的页面,入参chromePath表示Chrome驱动路径,headless表示是否使用无界面模式

  • 文件读写管道

    • top.codings.websiphon.core.pipeline.FilePipeline

       public FilePipeline(String filePath, String charset)
      

      filePath - 文件路径
      charset - 读取该文件的编码

  • 文档处理器

    如果要使用以下处理器,均要求任务对象是top.codings.websiphon.bean.WebRequestDoc或其子类。

    1. top.codings.websiphon.core.processor.support.DmicNewsExtractorProcessor
      基于DMIC算法实现正文内容自动提取的功能。
    2. top.codings.websiphon.core.processor.support.BasicDocTitleProcessor
      基于标签提取的方式自动提取文章标题。
    3. top.codings.websiphon.core.processor.support.BasicDocPubdateProcessor
      基于标签提取的方式自动提取文章发布时间。
    4. top.codings.websiphon.core.processor.support.BasicDocDenoiseProcessor
      基于预设标签的方式去除html中的噪音数据,放在BasicDocMarkScoreProcessor之前,提高打分准确性。
    5. top.codings.websiphon.core.processor.support.BasicDocMarkScoreProcessor
      基于计算词频的方式为每一个html标签打分,需要配合BasicDocContentProcessor根据分值提取正文文本。
    6. top.codings.websiphon.core.processor.support.BasicDocContentProcessor
      根据BasicDocMarkScoreProcessor计算出来的各标签分值,提取分值最大的标签作为正文文本。
    7. top.codings.websiphon.core.processor.support.BasicDocCommentsProcessor
      根据html标签的重复程度提取评论内容(准确度低)。

    注意 使用内置通用处理器的提取准确度并不是非常理想,对于精度要求不高的爬取任务,可以按需搭配使用各处理器,但是如果需要精确提取,则建议自行编写相应的文档处理器。

  • 同步事件

    1. top.codings.websiphon.core.context.event.sync.WebCrawlStartEvent
      爬虫启动事件
      爬虫启动之前会触发,事件处理完成后才会开始初始化爬虫。在爬虫的生命周期中,启动事件仅发生一次。
    2. top.codings.websiphon.core.context.event.sync.WebCrawlShutdownEvent
      爬虫终止事件
      在爬虫接收到停止指令后触发,事件处理完成后才会开始停止爬虫。在爬虫的生命周期中,停止事件仅发生一次。
    3. top.codings.websiphon.core.context.event.sync.WebBeforeRequestEvent
      网络请求前事件 爬取任务的网络请求发起前会触发该事件,若在该事件中想阻止请求的发生,只需要抛出WebException异常或其子类异常即可。在爬虫的生命周期中,如果监听了该事件,则每次请求前都会触发。
      注意 该事件的处理线程是network网络请求线程池里的线程。
    4. top.codings.websiphon.core.context.event.sync.WebBeforeParseEvent
      文档解析前事件
      爬虫获取请求响应后,在调用WebParser执行处理器前会触发该事件,若想阻止解析该文档,只需要抛出WebException异常或其子类异常即可。在爬虫的生命周期中,如果监听了该事件,则每次解析前都会触发。
      注意 该事件的处理线程是parse解析线程池里的线程。
    5. top.codings.websiphon.core.context.event.sync.WebAfterParseEvent
      文档解析后事件 解析器调用完处理器链之后会触发该事件。在爬虫的生命周期中,如果监听了该事件,则每次解析后都会触发。 注意 该事件的处理线程是parse解析线程池里的线程。
    6. top.codings.websiphon.core.context.event.sync.WebLinkEvent
      链接扩散事件 配置了ExtractUrlPlugin插件的情况下,当扩散出链接时会触发该事件。
      注意 该事件的处理线程是parse解析线程池里的线程。
  • 异步事件

    1. top.codings.websiphon.core.context.event.async.AllExceptionEvent
      所有未监听异常事件
      当监听了该异常时,一旦有其他未监听异常发生时,异常会冒泡至该事件处。
    2. top.codings.websiphon.core.context.event.async.WebExceptionEvent
      爬虫执行异常监听事件
      该异常事件是WebNetworkExceptionEvent/WebParseExceptionEvent/WebRejectedExecutionExceptionEvent的父类事件。
    3. top.codings.websiphon.core.context.event.async.WebNetworkExceptionEvent
      网络异常事件
      当发生连接失败/超时/响应码非2xx(若不允许3xx自动跳转)的情况时会触发该事件。
    4. top.codings.websiphon.core.context.event.async.WebParseExceptionEvent
      解析异常事件
      当解析器调用处理器链进行处理时发生异常,则会触发该事件。
    5. top.codings.websiphon.core.context.event.async.WebRejectedExecutionExceptionEvent
      任务拒绝事件
      当任务池饱和无法接收新任务时会触发该事件。
  • 爬虫上下文

    对爬虫进行干预或获取相关爬虫信息

     top.codings.websiphon.core.context.CrawlerContext
     // 获取爬虫启动时间
     public long getBeginAt()
     // 获取爬虫终止时间
     public long getEndAt()
     // 爬虫运行状态
     public boolean isRunning()
     // 网络请求最大并发数
     public int getNetworkThreadSize()
     // 解析最大并发数
     public int getParseThreadSize()
     // 推送同步事件
     public void postSyncEvent(WebSyncEvent event) throws WebException
     // 推送异步事件
     public void postAsyncEvent(WebAsyncEvent event)
     // 获取爬虫对象
     public Crawler getCrawler()
     // 获取QPS统计对象
     public RateResult getRateResult()
     // 获取爬虫名称
     public String getId()
     // 设置爬虫名称
     public CrawlerContext setId(String id)
     // 终止爬虫
     public void close()