Node.js學習 爬蟲下載豆瓣電影top250圖片

利用node.js實現爬蟲,而且爬取豆瓣電影top250的列表和圖片。html

1 什麼是node.jsnode

簡單的說 Node.js 就是運行在服務端的 JavaScript。
Node.js 是一個基於Chrome JavaScript 運行時創建的一個平臺。
Node.js是一個事件驅動I/O服務端JavaScript環境,基於Google的V8引擎jquery

 

2 什麼是爬蟲npm

(又被稱爲網頁蜘蛛,網絡機器人,在FOAF社區中間,更常常的稱爲網頁追逐者),是一種按照必定的規則,自動地抓取萬維網信息的程序或者腳本。json

 

3 準備網絡

  須要引入的包有cheerio和request,直接使用npm install命令在工程目錄下安裝便可。函數

  其中cheerio是相似jquery的包,cheerio是nodejs的抓取頁面模塊,用於解析DOM的。網站

  而Request —— 讓 Node.js http請求變得超簡單。ui

 

  新建data目錄和img目錄,data目錄下面存放電影信息,img目錄存放圖片。這兩個目錄一樣能夠用fs模塊的內置函數生成。this

 

4 源碼

var http = require('https');
// 豆瓣網站添加了https,因此用http模塊就抓不到數據了,把http模塊換成https模塊,而且不得指定80端口,這裏無需指定端口,https模塊會默認使用443端口。
var fs = require('fs');
var path = require('path');

var cheerio = require('cheerio');
// 使用npm install cheerio --save 來安裝 加入--sava參數,項目對於此包的依賴就會寫入package.json中
// 這裏不須要全局安裝,因此不須要-g參數
var request = require('request');

var movies = [];
// 爬蟲的URL信息
//
var num=0;
function getData(startNum) {
    var opt = {
        hostname: 'movie.douban.com',
        path: '/top250?start=' + startNum + '&filter=',
        // port : 80,
        headers: {
            'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.117 Safari/537.36'
        }
    };


    http.get(opt, function(res) {
        var html = '';

        res.setEncoding('utf-8');

        res.on('data', function(chunk) {
            html += chunk;
        });

        res.on('end', function() {
                // 真正的處理在這裏

                var $ = cheerio.load(html);

                $('.item').each(function() {
                    var info = $(".bd p", this).text().replace(/\s+/g, "");
                    var actor = $(".bd p", this).text();
                    var temp,temp2;
                    info.replace(/([\u2E80-\u9FFF\:\·]+)/, function(match, $1, $2) {
                        temp = $1;
                        temp2 = $2;
                    });

                    var movie = {
                        title: $('.title', this).eq(0).text(),
                        director: temp,
                        actor: temp2,
                        year: /\d+/g.exec(info).toString(),
                        star: $('.info .star .rating_num', this).text(),
                        quote: $(".quote .inq", this).text(),
                        picURL: $('.pic img', this).attr('src')
                    };
                    movies.push(movie);
                    saveImg('img/',movie.picURL,movie.title);
                });
                // console.log(movies);
                if(num<=25)
                    getData(num+=5);

            })
            // 還能夠是txt
            // 調用10次,每次
        saveData('data/data.json', movies);

    }).on('error', function(err) {
        console.log(err);
    })
}

getData(0);

/**
 * [saveData description]
 * @param  {[type]} path   [保存數據的文件夾]
 * @param  {[type]} movies [數據]
 * @return {[type]}        [description]
 */
function saveData(path, movies) {
    fs.writeFile(path, JSON.stringify(movies), function(err) {
        if (err) {
            return console.log(err);
        }else {

            console.log("Data saved");
        }
    })
}

// 保存圖片函數
function saveImg(imgDir, url,title) {
    http.get(url, function(res) {
        var data = '';
        res.setEncoding('binary');
        res.on('data', function(chunk) {
            data += chunk;
        });
        res.on('end', function() {
            //  path.basename(url)
            fs.writeFile(imgDir + title + '.jpg', data, 'binary', function(err) {
                if (err) {
                    return console.log(err);
                }
                console.log('image downloaded', title + '.jpg');
            });
        })
    }).on('error', function(err) {
        console.log(err);
    })
}
相關文章
相關標籤/搜索