# spider **Repository Path**: catchcode/spider ## Basic Information - **Project Name**: spider - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-08-08 - **Last Updated**: 2021-08-08 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 它是谁?它能做什么? 它是一款对`puppeteer`进行封装的框架,它不是很完美。 他能简化对`puppeteer`的操作,你只用提供`css`选择器和编写存储逻辑即可 。 如果可以,你完全可以使用`puppeteer`,因为它能做的事,`puppeteer`都能做,只是繁琐点了而已。 **它只适合小型、简单的项目** # 上手成本 用短暂的时间浏览样例文件,他们在`.\src\extract`下的文件,当然,也包括入口文件`.\src\index.ts`(5分钟) 用短暂的时间运行爬虫,观察它是怎么运行的(5分钟) 配置文件在 `.env` 里(5分钟) [建议]阅读装饰器源码,它们在`.\src\Decorators`目录下(10分钟) [建议]阅读提取器源码,它们在`src\class\Extractor.ts`目录下(10分钟) [可选]阅读源码(1小时) [增强]阅读`puppeteer`中文文档:https://zhaoqize.github.io/puppeteer-api-zh_CN/ # 如何使用? **必要的条件** * 安装谷歌浏览器,且配置好`.env`文件中的`chrome_executablePath`属性 * 安装`node`环境 1. 运行根目录下的`安装npm依赖.bat`文件。 2. 在 `./src/index.ts` 内部编写代码,创建 `spider` 对象 > 问:要创建多少 spider 对象? > 答:一个`web`页面对应一个`spider`对象。 3. 为每个`spider`编写提取器(`Extractor`) > 提取器可以从页面提取我们需要的数据。 4. 编写数据保存业务。 > 请将逻辑写在 `saveDataHook(extractor: Extractor): Promise { }` 方法下。 5. 运行更目录下的`运行爬虫.bat`文件 # 框架做了什么事? ## 创建 Spider 对象的流程 1. 创建爬虫对象 ```ts Spider.create(urls,n); //n 是页面的数量 ``` 2. 等待页面初始化 ```ts await spider.pageController.initPage(n); ``` 3. 初始化任务 ```ts urls.forEach(e => spider.createTask(e)); ``` 4. 开始执行任务 ```ts spider.service(); // 上面函数主要做了这件事 while (true) { // 只有等待任务 或者 等待页面的时候允许堵塞。!!! const task = await this.taskController.waitNextTask() as Task; const pageItem = await this.pageController.waitSparePage(); // ..... ExtractorClass.create(page, this, task); // handle 是在这一步被执行的,一些钩子函数也在这里被调用。 // ..... } ``` ## Extractor 的流程(提取器) 1. 继承父类 ```ts class Extract1 extends Extractor { } ``` 2. 操作 page ```ts @$("head > title") title: string = ""; // Extractor1 的类属性 ``` 3. 装饰器内部给当前类添加静态属性`handles` ```ts // obj:装饰器修饰的类的原型 const handles = Object.getOwnPropertyDescriptor(obj.constructor, "handles")?.value as Function[] handles.push(handle) ``` 4. 被添加到 Spider ```ts // 此时 spider 已经初始化完毕,page 页面已就绪 spider.use(Extract1); ``` 5. 当 `spider` 有任务时,会创建 Extract1 对象,并调用相关钩子函数