簡單的網頁小爬蟲

來源:互聯網
上載者:User

標籤:


var http = require(‘http‘);
var Promise = require(‘bluebird‘); // 第三方 Promises 模組
var cheerio = require(‘cheerio‘);  // 爬蟲分析模組
var BufferHelper = require(‘bufferhelper‘); // buffer 組裝模組
var iconv = require(‘iconv-lite‘); // 字元轉碼模組

var baseUrl = ‘http://www.imooc.com/learn/‘;
var courseIds = [348, 637, 259, 75, 197]; //要爬取的課程ID
var pagesArr = []; //爬取到的HTML頁面集合

// 批量爬取課程頁面
courseIds.forEach(function (cid) {
    pagesArr.push(grabPageAsync((baseUrl + cid)));
});

// 非同步爬取頁面HTML
function grabPageAsync(url) {
    return new Promise(function (resolve, reject) {
        console.log(‘正在爬取 ‘ + url);

        http.get(url, function (res) {
            var bufferHelper = new BufferHelper();

            res.on(‘data‘, function (chunk) {
                bufferHelper.concat(chunk);
            });

            res.on(‘end‘, function () {
                console.log(‘爬取 ‘ + url + ‘ 成功‘);

                var fullBuffer = bufferHelper.toBuffer();
                var utf8Buffer = iconv.decode(fullBuffer, ‘UTF-8‘);
                var html = utf8Buffer.toString()
                resolve(html);
            });
        }).on(‘error‘, function (e) {
            // 爬取成功
            reject(e);

            console.log(‘爬取 ‘ + url + ‘ 失敗‘);
        });
    });
}

// 提取課程資訊並列印
Promise
    .all(pagesArr)
    .then(function (pages) {
        var coursesData = [];

        pages.forEach(function (html) {
            // 提取課程資訊
            var courses = filterChapters(html);
            coursesData.push(courses);
        });
        // 列印課程資訊
        printCourseInfo(coursesData);
    });

// 提取課程資訊
function filterChapters(html) {
    var $ = cheerio.load(html);
    var $chapters = $(‘.chapter‘);
    var title = $(‘.hd .l‘).text();
    var number = parseInt($($(".meta-value strong")[3]).text().trim(), 10);
    var courseData = {
        title: title,
        number: number,
        videos: []
    };

    var $chapter;
    var chapterTitle;
    var chapterData = {};
    var $videos;
    var $video;
    var videoTitle;
    var id;

    $chapters.each(function () {
        $chapter = $(this);
        chapterTitle = $chapter.find(‘strong‘).text();
        chapterData = {
            chapterTitle: chapterTitle,
            videos: []
        };
        $videos = $chapter.find(‘.video‘).children(‘li‘);
        $videos.each(function () {
            $video = $(this).find(‘.studyvideo‘);
            videoTitle = $video.text();
            id = $video.attr(‘href‘).split(‘video/‘)[1];
            chapterData.videos.push({
                title: videoTitle,
                id: id
            })
        });
        courseData.videos.push(chapterData);
    });
    return courseData;
}

// 列印課程資訊
function printCourseInfo(coursesData) {
    if(Object.prototype.toString.call(coursesData) == ‘[object Array]‘ && coursesData.length > 0){

        coursesData.forEach(function (courseData) {
            console.log(‘\n\n【‘ + courseData.number + ‘】人學過《‘ + courseData.title + ‘》‘);
            console.log(‘----------------------------------------------‘);

            courseData.videos.forEach(function (item) {
                console.log(‘\n‘ + item.chapterTitle);

                item.videos.forEach(function (video) {
                    console.log(‘ ‘ + video.title.trim());
                })
            });
        });
    }else{
        console.log(‘暫無課程資訊‘);
    }
}

簡單的網頁小爬蟲

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.