网络爬虫框架开发笔记
1、网络爬虫与框架
1.1. 网络爬虫
首先,我们得明白网络爬虫是个什么玩意,它主要就是模仿终端用户,对网页进行爬取和分析,根据使用者的意愿从爬取下载的网页中提取出相关链接、筛选出可用的内容(词条),并对这些词条作存储、分析、统计等操作。
1.2. 网络爬虫框架
既然我们要做一个网络爬虫的框架,我们就得来了解网络爬虫框架的功用,请看下面流程:
输入(首个网络地址请求)-》网页下载器-》分析器-》条目处理管道-》输出
根据上面的爬取流程分析,我们得出了以下几个核心关键词:
1.2.1. 网页下载器
下载与给定网络地址相对应的网页内容。因为,我们做的是框架,因此对于用户的输入请求,我们会尽可能的预留出的定制接口,让使用者可以根据自己的需求,参照接口自定义自己的“请求”组装方法。注意:用户有可能会偷懒的,所以我们也得创建一个默认的接口实现。
1.2.2 分析器
对下载的网页内容进行分析,并从中帅选出可用的网页内容(即数据条目dataitem)和需要访问的网页链接。同样,为了使得爬虫框架灵活可用,在被用于分析和筛选网页内容的规则和策略方面,我们也得提供灵活的定制接口,因为只有使用者才知道自己真正想要的是什么。请看如下定义:
type ParseResponse func(httpResp *http.Response, respDepth uint32)([]base.Data, []error)
1.2.3. 条目处理管道
接受作为输入的条目,并对其执行一系列的处理步骤。这里对数据的处理【存储、分析、统计等】才是用户的真正需求,因此我们也得给使用者预留出定制接口。请看如下定义:
type ProcessItem func(item base.Item)(result base.Item, err error)
注意:无论是分析器还是条目处理管道,我们都在使用者真正有需要的地方预留出了定制接口,也就是说我们在开发的服务是给第三方使用,而我们又不知道使用方的真正需求的时候,就可像这样给使用者预留出定制接口,这也是golang开发过程中常使用到的一种技术手段
整体流程图如下:
2、详细设计
2.1. 基本数据结构
我们在开发项目的过程中,首先就得明确,整个项目要用到什么类型数据,那些是公用的,那些是私有的。现在我们来定义爬虫框架的数据结构:
2.1.1. 请求Request
type Request struct {
httpReq *http.Request //http请求的指针值
depth uint32 //请求的深度
}
2.1.2. 响应Request
type Request struct {
httpReq *http.Request
depth uint32
}
2.1.3. 条目Item
type Item map[string] interface{}
以上三种数据类型贯穿我们的整个项目,是构成整个爬虫框架的基石,为了能够用一个类型从整体上标识这三个基本的数据类型,便于管理,我们定义如下接口类型:
/**
* 接口的命名规范 只有一个函数以er结尾,两个WriterReader,三个及以上用结构体民命方式
*/
type Data interface {
Validate() bool
}
2.1.4. 错误Error
const (
DownloaderError ErrorType = "Downloader Eoor"
AnalyzerError ErrorType = "Analyzer Error"
ItemProcessorError ErrorType = "Item Processor Error"
)
type ErrorType string
type ErrorTypeer interface {
Type() ErrorType
Error() string
}
type CrawlerError struct {
errType ErrorType
errMsg string
fullErrMsg string
}
2.2. 接口定义
2.2.1. 网页下载器
2.2.2. 分析器
2.2.3. 条目处理管道
2.2.4. 调度器
2.2.5. 中间件接口概述
2.2.6. 通道管理器
2.2.7. 实体池
2.3. 中间件的实现
2.4. 处理模块的实现
2.5. 调度器的实现
2.6. 使用案例
4、详细设计
有疑问加站长微信联系(非本文作者)