nodejs微信公衆號開發——9.爬取網站素材定時推送消息

上一篇文章:nodejs微信公衆號開發——8.羣發消息,介紹了高級羣發接口的實現,並經過一個簡單例子加以說明。本節的內容可能和微信公衆號開發自己關係不大,只是我小項目中涉及到的內容,知識點包含nodejs爬蟲和定時模塊。(項目github地:https://github.com/Panfen/wem... )html

1. nodejs網絡爬蟲

爬蟲是自動獲取網頁內容的一個有效工具。雖然爬蟲程序用Python開發的比較多,用nodejs也是一種不錯的選擇。咱們以爬取飄花電影網爲目標,爬取最近三天上線的電影,獲取其電影名稱電影海報圖片電影詳情頁網頁連接ftp下載連接的屬性。整合成微信推送的內容。node

2.爬蟲基本操做

2.1 使用request模塊來獲取網頁內容

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

2.2 使用cheerio模塊來提出網頁數據

經過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能夠直接用迅雷下載啦。瀏覽器

3. 爬蟲定時操做

3.1 使用cron模塊來定時執行任務

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爲例):微信

  • 當值爲 * 時,表示每秒執行一次;
  • 當值爲a-b時,表示從第a到第b秒這段時間內執行一次;
  • 當值爲*/n時,表示每隔n秒執行一次;
  • 當值爲a-b/n時,表示從第a到第b秒這段時間內每隔n秒執行一次;
var cronJob = require('cron').CronJob;

var job = new cronJob('00 30 11 * * *',function(){
     request.get(URL,function(err,res,body){
         ...
     });
});

這裏表示的是天天中午11:30執行一次爬蟲操做,獲取推送圖文的素材。

相關文章
相關標籤/搜索