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

前言

在社区偶然翻到狼叔的一个爬虫帖子,突发灵感便想写了这个程序,刚开始用的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 很尴尬,不知道谁这么坏。

回到顶部