当前位置: 首页 > 后端技术 > Node.js

你可能不信,这次甲方是只猫

时间:2023-04-03 19:09:51 Node.js

背景双11期间,为了给主人囤猫砂和猫罐头,一直在刷豆瓣爱猫群的驱动帖,一边刷一边玩cod16,结果是错过了很多豪车,游戏KD也掉了不少。后来痛定思痛,把猫送了,耽误了我的金枪。我决定用整个小工具来愚弄师傅,让他意识到我要做的其实很简单。我写了一个爬虫,定期爬取有关键词的帖子,然后邮件通知我。虽说是随便玩玩,但接触一下实际工作中没怎么接触过的东西好不好?作为一个纯前端,当然是用到了node,使用puppeteer、nodemailer、node-schedule来实现代码的核心功能部分。为了方便查看,我提出了重点部分。其实就是几个工具的快速入门部分,难度基本没有。到底是为了忽悠入门学习?不合理的地方,大佬们喷的很猛,爬虫部分我受得了';constsleep=time=>newPromise(resolve=>{setTimeout(resolve,time);});//puppeteer文档地址:https://github.com/puppeteer/puppeteer/blob/v2.0.0/docs/api.md#pagegotourl-optionsconstqueryInfos=async()=>{constbrowser=awaitpuppeteer.launch({});constpage=awaitbrowser.newPage();page.goto(url,{waitUntil:'networkidle2',});awaitsleep(5000);//确保爬到某处,时间可以缩短constresult=awaitpage.evaluate(()=>{//eslint-disable-next-lineno-undefconst$=window.$;//我比较关心的关键字可以考虑扩展实现类似只匹配猫砂不匹配猫砂盒的东西,所以这里不会扩展constkeywords=/can|lunchbox|peak|desire|go|sand/;constpostList=$('.td-subjecta');constlinks=[];if(postList.length>0){postList.each((i,e)=>{consttitle=$(e).text();constlink=$(e).attr('href');constid=链接.match(/\d+/g).toString();if(keywords.test(title)){links.push({id,title,link,keywords:title.match(keywords),});}});}返回链接;});浏览器.close();returnresult;};邮件通知constnodemailer=require('nodemailer');constsmtpTransport=require('nodemailer-smtp-transport');consturl='https://www.douban.com/group/search?group=656297&cat=1013&q=Drive';constqqTransport=nodemailer.createTransport(smtpTransport({service:'QQ',auth:{user:'123@qq.com',//发件人地址pass:'',//授权码},}));constsendMail=function(num,content){qqTransport.sendMail({from:'123@qq.com',to:'456@qq.com',subject:`${num}辆新车上路`,html:content,},function(err,res){if(err){return;}console.log('发送成功',res);});};asyncqueryCarsList(){constlist=awaitgetInfos();让总计=0;让carList='';//注意一个sync/await更适合for(leti=0,len=list.length;i${title}

`;总计++;constinfo=newthis.ctx.model.Cars({...car,});信息.保存();}}if(total>0){sendMail(total,carList);}}asyncqueryById(id){returnthis.ctx.model.Cars.find({id});}定时任务的基本函数setInterval应该也能完成,但是为了后面的扩展,也就罢了这里试试node-scheduleconstschedule=require('node-schedule');就可以了constqueryTask=()=>{//每半小时执行一次schedule.scheduleJob('*30****',queryCarsList);}//queryTask.cancel()//取消任务部署部署就不说了。我打算把eggjs+pm2扔到我的服务器上。我最好在本地运行它。毕竟我的工作是重中之重,最近也不需要为它存东西。改进测试考虑到如果要一直维护的话,这个数据量还是有很多地方可以做的。有必要引入数据库吗?其他选择?驾车贴的时效性比较高,要不要定期重置数据?有了新车,是不是直接爬取内容,然后根据内容判断是不是你关心的信息?您想要整个仪表板页面吗?您是否考虑尝试使用WebSocket进行仪表板页面测试?....数球,对于一只猫来说,搞笑我好开心?哦,都在这里了?具体功能总结起来不难,但是好像有很多可以摸的东西,需要一点时间做好很费时间,随便铺一下,需求无限,慢慢补。对了,无理取闹的地方大佬们喷的很猛,忍不住附上恶毒甲方的照片: