上一篇文章:nodejs微信公众号开发——8.群发消息,介绍了高级群发接口的实现,并经过一个简单例子加以说明。本节的内容可能和微信公众号开发自己关系不大,只是我小项目中涉及到的内容,知识点包含nodejs爬虫和定时模块。(项目github地:https://github.com/Panfen/wem... )html
爬虫是自动获取网页内容的一个有效工具。虽然爬虫程序用Python
开发的比较多,用nodejs也是一种不错的选择。咱们以爬取飘花电影网为目标,爬取最近三天上线的电影,获取其电影名称
、电影海报图片
、电影详情页网页连接
、ftp下载连接
的属性。整合成微信推送的内容。node
request是一个简化HTTP请求操做的模块,功能强大且使用简单,经过GET方法来获取某个URL的内容:jquery
var request = require('request'); var URL = 'http://www.piaohua.com/'; request.get(URL,function(err,res,body){ if(!err && res.statusCode == 200){ //输出网页内容 console.log(body); }else{ console.log('failed to crawl the website!'); } });
固然,咱们也采用http
模块来获取数据:git
var request = require('request'); var URL = 'http://www.piaohua.com/'; http.get(URL,function(res){ var html = ''; res.on('data',function(data){ html += data; }); res.on('end',function(){ console.log(html); //输出网页内容 }); }).on('error',function(){ console.log('failed to crawl the website!'); });
所得结果也是同样的,对比发现使用request
的确更为简洁。github
经过request
获取到的是一堆网页代码,咱们真正想要的数据跻身于这堆代码中。cheerio
是一个jQuery Core的子集,其实现了jQuery Core中浏览器无关的DOM操做API。能够使用与jquery同样的语法来处理元素。web
var cheerio = require('cheerio'); ... if(!err && res.statusCode == 200){ var $ = cheerio.load(body); var movieList = $('#iml1').children("ul").first().find('li'); var myMovieList = []; movieList.each(function(item){ var time = $(this).find('span font').html() ? $(this).find('span font').html() : $(this).find('span').html(); //筛选最近三天的电影 if((new Date() - new Date(time)) < 259200000){ var dom = $(this).find('a').first(); var link = URL + $(dom).attr('href'); var img = $(dom).find('img').attr('src'); var name = $(dom).find('img').attr('alt').substr(22).replace('</font>',''); var movie = { name:name, img:img, link:link, time:time, } myMovieList.push(movie); }; }); console.log(myMovieList); }
这里咱们已经成功获取了最近三天电影的对象数组,信息包含了电影名称
、封面图片
、详情连接
和上线时间
,和咱们预期的要求还差了一个属性:ftp下载连接
。ftp下载连接
在详情页面里面,因此咱们须要进一步爬取信息。segmentfault
if((new Date() - new Date(time)) < 259200000){ var dom = $(this).find('a').first(); var link = URL + $(dom).attr('href'); var img = $(dom).find('img').attr('src'); var name = $(dom).find('img').attr('alt').substr(22).replace('</font>',''); getftpLink(link,function(ftp){ var movie = { name:name, img:img, link:link, time:time, ftp:unescape(ftp.replace(/;/g,'').replace(/&#x/g, "%u")) //Unicode转中文 } myMovieList.push(movie); }); };
getftpLink
函数用以根据详情页连接link获取下载ftp:数组
function getftpLink(link,callback){ request.get(link,function(err,res,body){ if(!err && res.statusCode == 200){ var $ = cheerio.load(body); var ftp = $('#showinfo').find('table tbody tr td a').html(); callback(ftp); } }); }
是否是很棒?拿到ftp能够直接用迅雷下载啦。浏览器
var cronJob = require('cron').CronJob; var job = new cronJob('f1 f2 f3 f4 f5 f6',function(){ //do something });
f1 f2 f3 f4 f5 f6
用以控制时间的选项,其中f1
表示秒钟,f2
表示分钟,f3
表示小时,f4
表示一个月中的第几日,f5
表示月份,f6
表示一个星期中的第几天。各部分的取值含义以下(以f1
为例):微信
var cronJob = require('cron').CronJob; var job = new cronJob('00 30 11 * * *',function(){ request.get(URL,function(err,res,body){ ... }); });
这里表示的是天天中午11:30执行一次爬虫操做,获取推送图文的素材。