用于搭建项目
爬虫库
用于生成随机字符串
用于将资源文件上传至七牛图床
用于操作数据库结构
1.通过koa2初始化项目
2.写入基础的爬虫代码,爬取信息
3.启动子进程运行爬虫脚本
4.封装爬虫程序
5.配置七牛且上传图片资源
6.通过sequelize连接mysql
7.创建表模型,同步模型,数据入表
当一切配置完毕后如果需要新爬取页面需要经过以下步骤
1.在crawler文件夹下建立新的得页面爬虫文件(最难得一步,需要根据样式进行细心得爬取)
2.在route文件夹里得路由文件夹中怎加路由,以便能输入路径访问到控制器中指定得方法
3.在控制器controller文件夹中文件中得新增方法中配置Path指向第一步得爬虫文件,且上传七牛图床
4.在modules中新建模型文件
5.入口导入,且node db/sync.js同步模型
6.在service中新建数据添加方法
7.在控制器controller文件夹中文件中得新增方法中引入service,上传数据库
8.输入路由地址进行数据添加
项目配置项杂七杂八,方法众多,不做详细记忆,只需要记得下面这一句话
这个爬虫项目是使用koa2进行搭建得,使用了puppteer爬虫库进行爬取,在爬取得过程中通过sequelize进行数据库模型搭建,用qiniu云做图片资源得上传存储,如果需要爬取信息只需要将对应类名进行配置爬取,再通过类名去创建数据库模型数据入表,最后进行七牛云得存储
安装koa-generator
npm install -g koa-generator
koa2创建项目
koa2 crawler
打开对应文件
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)
}
}
})
})
}
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()删除数据
有返回值则操作成功