对自由职业者来说,从开源项目中学习技术很重要。
这个学习开源项目的系列笔记,为个人记录,仅供参考,利益无关。
我试用后自己做的笔记
需要用户自行定义的类:
状态性的——实体类:代表爬虫抓取后的数据,继承引擎定义的实体基类,在字段上写注解指定路径(cssSelector或JSON路径),以指定该字段与响应内容(HTML或JSON)的哪部分对应
行为性的——后续处理器类:Pipeline,使用[实体对象],实现业务逻辑
引擎的关键类:
状态性的——请求队列:Scheduler,装着请求对象的队列
请求类:Request,代表一个应该进行的请求,存放在请求队列中,多个爬虫对象并发地从队列中取得请求对象,根据之发起HTTP请求
响应类:Response,将爬虫对象发起HTTP请求后获得的结果,封装成响应对象,由Render转换成实体对象
行为性的——引擎类:Engine,总的配置和入口
爬虫类:Spider,一个引擎可以有多个爬虫对象并发工作,每个爬虫对象有一个单独的线程,爬虫的线程主循环中,从请求队列中获得请求对象,交给下载器
下载器:Downloader,用于根据一个请求对象,发起一次HTTP请求,将HTTP响应封装成响应对象
转换器:Render,用于将响应对象转换成用户定义的实体类的对象,实现方式是通过反射读取实体类的字段上的注解并处理
总体流程:1. 引擎初始化,启动
2. 每个爬虫对象线程的主循环中,获得请求对象,由下载器进行下载
3. 下载器,使用请求对象,发起HTTP请求,把HTTP响应封装成响应对象
4. 转换器,使用响应对象,及实体类上的注解信息,将响应对象渲染成有业务意义的实体对象
5. 后续处理器类,使用实体对象,完成业务
组件化:1. 每个关键步骤,都提取成一个特定的组件
2. 组件们形成流水线,前面的组件的输出就是后面的组件的输入
3. 每个组件可以有多个实现类,具体使用哪个实现类,根据实际情况判断(面向接口编程的基本目的)
4. 一个引擎对应多个爬虫,每个爬虫有自己的线程,全局的状态存在引擎对象的字段中,该字段是线程安全的,以便爬虫们并发使用,不致出错