准备工作

github 源码

  1. 创建一个空目录,并初始化 yarn init -y
  2. 安装两个必要插件 yarn add request cheerio
  3. 安装处理时间的库 yarn add moment tip(可以不装,自己处理时间)
  4. 本地运行项目 node main.js
  5. 部署到服务器操作如下:
1
2
3
 npm install pm2 -g //安装全局依赖用来后台运行
pm2 start main //运行到后台
pm2 stop main //关闭指定进程
  1. 完整代码如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
//main.js
const request = require('request')
const https = require('https')
const cheerio = require('cheerio')
const fs = require('fs')
const schedule = require('node-schedule')
const moment = require('moment')
const domain = 'https://github.com/'
const userId = 'sakurasuki'
//写入日志
const genLogData = msg => `[${moment(new Date().getTime()).format('YYYY-MM-DD HH:mm:ss')}] ------ ${msg}\n`
const writeLog = msg => {
//创建可写流
const log = fs.createWriteStream(`../logs/${moment(new Date().getTime()).format('YYYY-MM-DD')}.txt`, { flags: 'a' })
//写入数据到流
log.write(genLogData(msg))
//关闭写入流,表明已没有数据要被写入可写流
log.end()
}
//获取页面信息
const loadPage = () => {
writeLog(`开始读取网页信息:${domain + userId}`)
request(domain + userId, (error, res, body) => {
if (error) {
writeLog(`loadPage异常捕获:${error.message}`)
return
}

$ = cheerio.load(body)
//获取到页面头像的dom图片地址
const avatar = $('.avatar.avatar-user.width-full.color-bg-default').attr('src')
if (avatar) saveImage(avatar, 'avatar.png')
else writeLog('没有找到所需图片')
})
}

//保存图片
const saveImage = (url, fileName) => {
const path = '../images/'
https.get(url, (req, res) => {
var imgData = ''
req.on('data', chunk => {
imgData += chunk
})
req.setEncoding('binary')
req.on('end', () => {
fs.writeFile(path + fileName, imgData, 'binary', err => {
if (err) {
writeLog(`保存失败:${err.message}`)
return
}
writeLog(`保存图片成功:${path + fileName}`)
})
})
})
}

//定时器规则
let rule = new schedule.RecurrenceRule()
rule.minute = 0 //每小时0分执行
rule.second = 0 //每分钟0秒执行

//启动任务
schedule.scheduleJob(rule, () => {
writeLog('定时任务启动')
loadPage()
})