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

Nodejs微信公众号开发——9.爬取网站素材并定期推送消息

时间:2023-04-03 20:25:48 Node.js

上一篇:nodejs微信公众号开发——8.举例说明。本节内容可能与微信公众号开发本身关系不大,仅是我这个小项目涉及的内容。知识点包括nodejs爬虫和时序模块。(项目github地址:https://github.com/Panfen/wem...)1.nodejs网络爬虫Crawler是自动获取网页内容的有效工具。虽然很多爬虫程序都是用Python开发的,但是使用nodejs也是一个不错的选择。我们针对抓取飘花电影网站,抓取最近三天上线的电影,获取电影名称、电影海报图片、电影详情页网页链接、ftp下载链接等属性。融入微信推送的内容。2.爬虫的基本操作2.1使用request模块获取网页内容request是一个简化HTTP请求操作的模块。它功能强大且易于使用。它使用GET方法获取URL的内容:varrequest=require('request');varURL='http://www.piaohua.com/';request.get(URL,function(err,res,body){if(!err&&res.statusCode==200){//输出网页内容console.log(body);}else{console.log('抓取网站失败!');}});当然我们也使用http模块获取数据:varrequest=require('request');varURL='http://www.piaohua.com/';http.get(URL,function(res){varhtml='';res.on('data',function(data){html+=data;});res.on('end',function(){console.log(html);//输出网页页面内容});}).on('error',function(){console.log('抓取网站失败!');});结果是一样的,发现使用request确实更简洁。2.2使用cheerio模块提出网页数据我们通过request得到的是一堆网页代码,而我们真正想要的数据就包含在这堆代码中。cheerio是jQueryCore的一个子集,它在jQueryCore中实现了独立于浏览器的DOM操作API。可以使用与jQuery相同的语法来操作元素。varcheerio=require('cheerio');...if(!err&&res.statusCode==200){var$=cheerio.load(body);varmovieList=$('#iml1').children("ul").first().find('li');varmyMovieList=[];movieList.each(function(item){vartime=$(this).find('spanfont').html()?$(this).find('spanfont').html():$(this).find('span').html();//过滤最近三天的电影if((newDate()-newDate(time))<259200000){vardom=$(this).find('a').first();varlink=URL+$(dom).attr('href');varimg=$(dom).find('img').attr('src');varname=$(dom).find('img').attr('alt').substr(22).replace('','');varmovie={name:name,img:img,链接:link,ti??me:time,}myMovieList.push(电影);};});console.log(myMovieList);}到这里我们成功获取了最近三天的电影对象数组。信息包括电影名称、封面图片、详情链接和在线时间,以及我们的预期要求还缺少一个属性:ftp下载链接ftp下载链接在详情页,需要进一步爬取。if((newDate()-newDate(time))<259200000){vardom=$(this).find('a').first();varlink=URL+$(dom).attr('href');varimg=$(dom).find('img').attr('src');varname=$(dom).find('img').attr('alt').substr(22).replace('','');getftpLink(link,function(ftp){varmovie={name:name,img:img,link:link,ti??me:time,ftp:unescape(ftp.replace(/;/g,'').replace(/&#x/g,"%u"))//Unicode转中文}myMovieList.push(movie);});};getftpLink函数用于根据详情页链接获取下载ftp:200){var$=cheerio.load(body);varftp=$('#showinfo').find('tabletbodytrtda').html();callback(ftp);}});}是有那么棒吗?拿到ftp,直接用迅雷下载就可以了。3.爬虫定时运行3.1使用cron模块定时执行任务varcronJob=require('cron').CronJob;varjob=newcronJob('f1f2f3f4f5f6',function(){//dosomething});f1f2f3f4f5f6用于控制时间选项,其中f1代表秒,f2代表分钟,f3代表小时,f4代表月份中的日期,f5代表月份,f6代表次数一周的天空。各部分取值含义如下(以f1为例):当值为*时,表示每秒执行一次;当值为a-b时,表示从第ath秒到第b秒执行一次;当值为When*/n时,表示每n秒执行一次;当值为a-b/n时,表示从第ath秒到第b秒每n秒执行一次;varcronJob=require('cron').CronJob;varjob=newcronJob('003011***',function(){request.get(URL,function(err,res,body){...});});这里的意思是每天中午11点30分执行一次爬虫操作,获取推送图文的素材。