写了个用来提醒我小说更新了的程序。。。
发布于 9 年前 作者 dlyt 5120 次浏览 来自 分享

前言

在社区偶然翻到狼叔的一个爬虫帖子,突发灵感便想写了这个程序,刚开始用的node-crawler,感觉不太顺手,就没有用。

逻辑比较简单就是爬一下更新时间做一下比较,在加个发邮箱和短信的功能。

git地址

每隔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('没有更新')
 }
 })
 })
}
7 回复

运行中发现问题,数组最后没有清空内存会越占越多。

fetchArray.splice(0,fetchArray.length)
updateTimes.splice(0,updateTimes.length)

我当年用纯jq写了个贴吧提醒的插件... baidu_tips

@fronteason ?? 有发送邮件和短信的功能

这是我写的 http://up.xiaoxx.me/ ,和你的类似 添加一个监视页面 http://up.xiaoxx.me/?u=http://cnodejs.org/ 点击元素添加监控对象 别把我的删了。

@mabu233 可以,我准备做个app当客户端

@dlyt 不知道谁把我的删了。。。。。。

@mabu233 很尴尬,不知道谁这么坏。

回到顶部

AltStyle によって変換されたページ (->オリジナル) /