上一篇文章: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執行一次爬蟲操做,獲取推送圖文的素材。