一、介绍
这是一个用go语言实现的网络爬虫框架,本框架的核心在于可定制和可扩展,用户可以根据自己的需要定制各个模块,同时,也给出了一个实现demo供参考。Go语言的初学者也可以通过这个项目熟悉go语言的各种特性,尤其是并发编程。
二、项目框架介绍
该网络爬虫主要由五个部分组成:调度器、中间件、下载器、分析器、条目处理器。下面分别介绍每部分的功能。
- 调度器:对整个爬虫框架进行调度,所有消息都要经过调度器,因此同时肩负着缓存和产生系统信息概要的功能。主要包括辅助工具、系统信息概要、缓存、调度主体四个部分;
- 中间件:承上启下,辅助调度器调度整个系统,主要包括ID生成器、抽象池、停止信号、通道管理;
- 下载器:接受输入请求,转化为http请求,下载相应的网页,供分析器分析。设计为多线程,可以同时下载多个页面,并且通过实现一个抽象池来管理线程数量;
- 分析器:接受作为输入的相应,并且还原为HTTP相应,同时分析生成网页中新的HTTP请求(网页中链接)以及要进一步分析的条目。设计为多线程,可以同时处理多个相应,并且通过实现一个抽象池来管理线程数量;
- 条目处理管道:包括多个条目处理器,接受分析器传递的条目,最后给出处理结果。可以根据自己的需要定制分析方式,后文中将给出一个条目处理管道demo。
三、数据流
输入首次请求的网站之后,下载响应网站形成响应数据传送给分析器,分析器分离其中的链接和要处理的条目,链接形成下一层请求给调度器缓存起来,条目发送给条目处理管道进一步处理,最后给出最终处理结果。
四、各模块接口设计
1、调度器
(1)调度器主体
主要用于启动和停止整个系统,并且从中获取一些系统运行的状态。
type Scheduler interface {
// 开启调度器。
// 调用该方法会使调度器创建和初始化各个组件。在此之后,调度器会激活爬取流程的执行。
// 参数channelArgs代表通道参数的容器。
// 参数poolBaseArgs代表池基本参数的容器。
// 参数crawlDepth代表了需要被爬取的网页的最大深度值。深度大于此值的网页会被忽略。
// 参数httpClientGenerator代表的是被用来生成HTTP客户端的函数。
// 参数respParsers的值应为分析器所需的被用来解析HTTP响应的函数的序列。
// 参数itemProcessors的值应为需要被置入条目处理管道中的条目处理器的序列。
// 参数firstHttpReq即代表首次请求。调度器会以此为起始点开始执行爬取流程。
Start(channelArgs base.ChannelArgs,poolBaseArgs base.PoolBaseArgs,crawlDepth uint32,httpClientGenerator GenHttpClient,respParsers []anlz.ParseResponse,itemProcessors []ipl.ProcessItem,firstHttpReq *http.Request) (err error)
// 调用该方法会停止调度器的运行。所有处理模块执行的流程都会被中止。
Stop() bool
// 判断调度器是否正在运行。
Running() bool
// 获得错误通道。调度器以及各个处理模块运行过程中出现的所有错误都会被发送到该通道。