Koa2 + Puppeteer打造『爬虫系统』总结8

一.所需技术

(1).koa2

用于搭建项目

(2).puppeteer

爬虫库

(3).nanoid

用于生成随机字符串

(4).qiniu

用于将资源文件上传至七牛图床

(5).sequelize

用于操作数据库结构

二.项目搭建大致流程

1.通过koa2初始化项目

2.写入基础的爬虫代码,爬取信息

3.启动子进程运行爬虫脚本

4.封装爬虫程序

5.配置七牛且上传图片资源

6.通过sequelize连接mysql

7.创建表模型,同步模型,数据入表

三.项目层级架构

Koa2 + Puppeteer打造『爬虫系统』总结8_第1张图片

https://www.processon.com/view/5f3e37c11e085306e1694c7b

四.项目大致使用方式

当一切配置完毕后如果需要新爬取页面需要经过以下步骤

1.在crawler文件夹下建立新的得页面爬虫文件(最难得一步,需要根据样式进行细心得爬取)

2.在route文件夹里得路由文件夹中怎加路由,以便能输入路径访问到控制器中指定得方法

3.在控制器controller文件夹中文件中得新增方法中配置Path指向第一步得爬虫文件,且上传七牛图床

4.在modules中新建模型文件

5.入口导入,且node db/sync.js同步模型

6.在service中新建数据添加方法

7.在控制器controller文件夹中文件中得新增方法中引入service,上传数据库

8.输入路由地址进行数据添加

五.项目心得体会

项目配置项杂七杂八,方法众多,不做详细记忆,只需要记得下面这一句话

这个爬虫项目是使用koa2进行搭建得,使用了puppteer爬虫库进行爬取,在爬取得过程中通过sequelize进行数据库模型搭建,用qiniu云做图片资源得上传存储,如果需要爬取信息只需要将对应类名进行配置爬取,再通过类名去创建数据库模型数据入表,最后进行七牛云得存储

六.关键技术点

koa2项目怎么创建

安装koa-generator

npm install -g koa-generator

koa2创建项目

koa2 crawler

安装koa对应依赖

打开对应文件

npm install

安装爬虫库

npm i puppeteer -S

爬虫是怎么爬取数据的

const router = require('koa-router')(),
      pt = require('puppeteer');

router.get('/', async (ctx, next) => {
  const bs = await pt.launch(),
        url = 'https://msiwei.ke.qq.com/#category=-1&tab=1',
        pg = await bs.newPage();
  await pg.goto(url,{
    timeout:30*1000,
    waitUtil:'networkidle2'
  })
  const result = await pg.evaluate(()=>{
    const $ = window.$,
          $item = $('.agency-big-banner-ul .agency-big-banner-li');
    let data = [];
    $item.each((index,item)=>{
      const $el = $(item),
            $elLink = $el.find('.js-banner-btnqq');
      const dataItem = {
        cid: $elLink.attr('data-id'),
        href: $elLink.prop('href'),
        imgUrl:$elLink.find('img').prop('src'),
        title:$elLink.prop('title')
      }
      data.push(dataItem)      
    })      
   return data;
  }) 
  console.log(result)
  await bs.close;     
})


module.exports = router

1.引入koa-router和puppeteer

2.在router.get的路由下写数据爬取方法

3.首先通过pt.launch()创建客户端,在通过客户端.newPage()创建新页面

4.通过新页面.goto跳转到指定爬取页面,此时要设置 waitUtil:'networkidle2'这样就会在页面加载后,同时没有两个以上的网路请求时进行爬取

5.接下来通过新页面.evaluate函数种进行爬取

6.在evaluate函数中通过jq把想要获取的信息保存在data种

7.最后通过新页面.close来关闭页面

8.访问数据路由进行爬取

爬虫是怎么建立子进程的

1.新建一个爬虫文件

2.其中自执行函数种写入爬取代码

3.通过node的Process.send向子进程发送结果信息

4.通过process.exit再关闭子进程

5.在路由中引入child_process

6.通过cp.fork来建立子进程

7.通过on来监听子进程退出和子进程返回信息以及子进程错误的信息

怎么给路由增加前缀

通过router.prefix()增加

七牛是如何将图片资源上传至七牛图床的

1.安装nanoid 和 qiniu

npm i nanoid qiniu  -S

2.配置好ak sk 以及 buket通过七牛函数创建出的连接.fetch进行发送,如果成功则返回nanoid交给数据库进行存取

 qiniuUpload(options){
        const mac = new Qiniu.auth.digest.Mac(options.ak,options.sk),
              conf = new Qiniu.conf.Config(),
              client = new Qiniu.rs.BucketManager(mac,conf),
              key = nanoId()+options.ext;
        return new Promise((resolve,reject)=>{
            client.fetch(options.url,options.bucket,key,(error,ret,info)=>{
                if(error){
                    reject(error);
                }else{
                    if(info.statusCode === 200){
                        resolve({key})
                    }else{
                        reject(info)
                    }
                }
            })
        })      
    }

sequelize是怎么使用的

1.首先先安装sequelize和mysql2依赖

npm i mysql2 sequelize -S

2.配置文件中写数据库的最大连接数账号密码等

3.引入sequlilize依赖于mysql配置,通过new Sequelize建立连接

4.创建表模型(数据类型也是通过sequelize.STRING等设定的),通过sequelize实例化对象.difine(表名称,{表字段名称:{配置}})来进行设定

comment:备注

type:数据类型

allowNull:是否为空

unique:是否唯一

defaultValue:默认值

const Sequelize = require('sequelize'),
      seq = require('../connection/mysql_connect'),
      {STRING,INT} = require('../../config/db_type_config');
const Slider = seq.define('slider',{
    cid:{
        comment:'course id',
        type: INT(25),
        allowNull:false,
        unique:true
    },
    href:{
        comment:'course detail page link',
        type: STRING,
        allowNull:false,
    },
    imgUrl:{
        comment:'course image url',
        type: STRING,
        allowNull:false,
    },
    title:{
        comment:'course name',
        type: STRING,
        allowNull:false,
    },
    imgKey:{
        comment:'course image name',
        type: STRING,
        allowNull:false,
    },
    status:{
        comment:'course status',
        type: INT,
        defaultValue: 1,
        allowNull:false
    }
    
})      
module.exports = Slider;

5.通过实例化对象.authenticate.then来监听数据库是否连接,实例化对象.sync来设置同步方法,force:true意思是强制替换重名数据表

const seq = require('./connection/mysql_connect');
require ('./models');
seq.authenticate().then(()=>{
    console.log('MySql server is connected completely');
}).catch((error)=>{
    console.log('MySql server is failed to be connected Error:'+error);
})
seq.sync({
    force:true
}).then(()=>{
    console.log('The table has been synchronised into database successful')
    process.exit();
})

6.在index.js出口文件中引入表模型,执行node do/sync.js执行同步表模型

7.通过seq.define创建出的表模型.findOne进行数据库检索

const SliderModel = require('../do/models/slider');
const Slider = require('../do/models/slider');
class SliderService{
    async addSliderData(data){
        const cid = data.cid;
        const result = await SliderModel.findOne({
            where:{cid}
        })
        if(result){
            return await SliderModel.update(data,{
                where:{cid}
            })
        }else{
            return await Slider.create(data)
        }
        
    }
}
module.exports = new SliderService();

findOne检索一条数据  findAll检索所有书  create()创建数据 update()修改数据 destory()删除数据

有返回值则操作成功

你可能感兴趣的:(实战项目,node.js,javascript,爬虫)