前言
在社区偶然翻到狼叔的一个爬虫帖子,突发灵感便想写了这个程序,刚开始用的node-crawler,感觉不太顺手,就没有用。
逻辑比较简单就是爬一下更新时间做一下比较,在加个发邮箱和短信的功能。
每隔5分钟跑一下
const fetchArray = []
const rule = new schedule.RecurrenceRule()
rule.minute = [0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55]
schedule.scheduleJob(rule, function () {
Novel.find(function(err, novel) {
if (err) console.log(err)
if (novel) {
novel.forEach(function(item) {
fetchArray.push(getHtmlAsync(item.id, item.url))
})
Promise
.all(fetchArray)
.then(function(results) {
const updateTimes = []
results.forEach(function(html) {
const id = getId(html)
const updateTime = getUpdateTime(html)
updateTimes.push(id + updateTime)
})
isUpdate(updateTimes)
})
}
})
})
爬一下页面
function getHtmlAsync(id, url) {
return new Promise(function(resolve, reject) {
console.log('正在爬取' + url)
http.get(url, function(res) {
var html = ''
res.on('data', function(data) {
html += data
})
res.on('end', function () {
resolve(id + html)
})
}).on('error', function(e) {
reject(e)
console.log('爬取出错');
})
})
}
取出更新时间
function getUpdateTime(html) {
const $ = cheerio.load(html)
const _updatetime = parseInt($('.tomeBean td').last().attr('updatetime'))
return _updatetime
}
比较一下,然后发邮件
function isUpdate(updateTimes) {
updateTimes.forEach(function(item) {
const id = getId(item)
Novel.findOne({_id: id}, function(err, novel) {
const updateTime = parseInt(item.substring(24))
if (novel.updateTime === '') {
novel.updateTime = updateTime
novel.save(function(err) {
if (err) console.log(err)
})
}
if (updateTime > parseInt(novel.updateTime)) {
Subscribe.findUserByNovelId(novel.id, function(err, results) {
if (err) console.log(err)
results.forEach(function(item) {
transporter.sendMail(novel.name, item.userID.email)
//sms.send(novel.name, item.userID.phoneNumber)
})
})
novel.updateTime = updateTime
novel.save(function(err) {
if (err) console.log(err)
})
console.log('更新了')
}
else {
console.log('没有更新')
}
})
})
}