起因
平常查看菜单都需要去内部的平台查看,但是突发奇想能不能定时把菜单发送到群里呢,想来肯定是可以滴,所以我就准备实战一下。
实现过程
直接coding肯定是不行滴,还是需要一下所需工具,正所谓磨刀不误砍柴工嘛,首先创建一个文件
mkdir menu-info
接下来进行初始化(此处我用的yarn)
yarn init
接下来安装我们所需要的插件superagent、moment、node-schedule、chreeio(本次未用)
yarn add superagent moment node-schedule
简单介绍一下几个插件:
-
superagent:superagent是一个轻量级、灵活的、易读的、低学习曲线的客户端请求代理模块,主要用来发送请求,也可以用其他模块代替,看自己需求了。
-
moment:就是一个javascript时间处理库,很好用,虽然此处引入有点浪费,但是为了省事还是直接引用了:)
-
node-schedule:这是一个定时模块,功能也很强大,可以用来指定时间执行任务,很方便。
-
chreeio:chreeio是一个对jquery核心的一个实现,其语法也是与jquery大致相同,用过jquery的童鞋应该能很快上手,主要是用来处理那些ssr返回的dom结构,便于拿到数据,但是本次返回的是接口数据,所以没有用到此模块。
好了,以上这些模块基本就满足一个小爬虫的需要了,接下了进行简单实现。
首先在根目录下创建一个index.js文件:
touch index.js
然后我们要找到目标站点的目标请求,观察它返回的数据类型,然后进行分析,看我们具体需要什么插件,如何爬取,最后在编写爬虫。经过一顿操作,我发现我目标的菜单请求需要带参数请求,然后返回简单的数据信息,所以我直接通过superagent模拟请求,然后处理数据即可。所以接下来在index.js中分别引入我们的几个必要模块:
const fs = require('fs')
const moment = require('moment')
const superagent = require('superagent')
const schedule = require("node-schedule");
然后我们进行模拟请求,进查看发现我们的菜单需要三个参数,一个是类型用来区分早中晚餐,一个是时间,最后一个是取餐地址。所以简单明了我们直接用superagent进行带参请求(地址说的当然是真的[Doge]):
const date = moment().format('YYYY-MM-DD')
const base = 'https://wozuishuai.haha/api/get?type=' + type + '&date=' + date + '&plase='
superagent.get(base).end(function (err, data) {
console.log(data)
//dosomething
})
因为是get请求,此处我直接采用拼接字符串的形式,然后我们命令行进行如下命令:
node index.js
执行以后发现,完蛋,被拦截了,因为这条请求没有身份信息,所以被拦截到登录部分,发现问题我们来进行处理,接口是通过cookie进行辨别身份的,所以最简单直接的办法就是把我的cookie信息携带上就好,所以赶紧试了试:
const cookies = 'gaga=hahahahhahahahahahahh'
superagent.get(base).set("Cookie", cookies)
.end(function (err, data) {
console.log(data)
//dosomething
})
...
此时在一看,没有问题,已经正常请求到数据了,接下来根据数据在进行一顿操作,循环拼接字符串......balabala,
const list = JSON.parse(data.text).result.list
var menuInfo = '菜单:'
list.forEach(ele => {
menuInfo.push({
title:ele.name,
type:ele.type
})
});
fs.writeFileSync('./menu.json',menuInfo) //写入menu.json
至此为止基本就已经结束了,剩下的就是通过node-schedule创建定时任务了,
//定时每天的11:30:00进行触发
schedule.scheduleJob('00 30 11 * * *', function () {
//dosomething
})
好了,到此为止基本就已经完成啦,以后每天吃饭前都能收到温馨的菜单提醒,不用在为吃啥而发愁了:)
推荐一篇文章,node基础,很全面:
「万字整理 」这里有一份Node.js入门指南和实践,请注意查收
Time is fair, because it gives everyone 24 hours.