node爬虫小应用

397 阅读4分钟

最近在学习公司大佬封装的一套架子,发现node在其中起到了不可或缺的作用,现在基本上前端的自动化都离不开node的支持,所以这几天回看了一部分node知识,先从一个有趣的小爬虫说起吧~

起因

平常查看菜单都需要去内部的平台查看,但是突发奇想能不能定时把菜单发送到群里呢,想来肯定是可以滴,所以我就准备实战一下。

实现过程

直接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.