第一個nodejs爬蟲:爬取豆瓣電影圖片

第一個nodejs爬蟲:爬取豆瓣電影圖片存入本地:html

首先在命令行下 npm install request cheerio express -save;node

代碼:jquery

var http = require('https'); //使用https模塊
var fs = require('fs');//文件讀寫
var cheerio = require('cheerio');//jquery寫法獲取所得頁面dom元素
var request = require('request');//發送request請求
var i = 0;
var url = "https://movie.douban.com/subject/1889243/?from=subject-page";
//初始url 
function fetchPage(x) { //封裝一層函數,方便遞歸調用
    startRequest(x);
}

function startRequest(x) {
    //採用http模塊向服務器發起一次get請求      
    http.get(x, function(res) { //get到x網址,成功執行回調函數
        var html = ''; //用來存儲請求網頁的整個html內容
        res.setEncoding('utf-8'); //防止中文亂碼
        //監聽data事件,每次取一塊數據
        res.on('data', function(chunk) {
            html += chunk;
        });
        //監聽end事件,若是整個網頁內容的html都獲取完畢,就執行回調函數
        res.on('end', function() {
            var $ = cheerio.load(html); //採用cheerio模塊解析html
            var news_item = {
                //獲取電影的標題
                title: $('.related-info h2 i').text().trim(),
                //i是用來判斷獲取頁數
                i: i = i + 1,

            };

            console.log(news_item); //打印新聞信息
            var news_title = $('.related-info h2 i').text().trim();

            savedContent($, news_title); //存儲每篇文章的內容及文章標題

            savedImg($, news_title); //存儲每篇文章的圖片及圖片標題

            //下一篇電影的url
            nextLink = $(".recommendations-bd dl:last-child dd a").attr('href');
            if(i <= 10) { //爬取10頁
                fetchPage(nextLink);
            }
        });

    }).on('error', function(err) { //http模塊的on data,on end ,on error事件
        console.log(err);
    });

}
//存儲標題函數
function savedContent($, news_title) {
    $('#link-report span').each(function(index, item) {
        var x = $(this).text();
        x = x + '\n';
        //將新聞文本內容一段一段添加到/data文件夾下,並用新聞的標題來命名文件
        fs.appendFile('./data/' + news_title + '.txt', x, 'utf-8', function(err) {
            if(err) {
                console.log(err);
            }
        });
    })
}
//該函數的做用:在本地存儲所爬取到的圖片資源
function savedImg($, news_title) {
    $('#mainpic img').each(function(index, item) {
        var img_title = $('#content h1 span').text().trim(); //獲取圖片的標題
        if(img_title.length > 35 || img_title == "") { //圖片標題太長
            img_title = "Null";
        }
        var img_filename = img_title + '.jpg';
        var img_src = $(this).attr('src'); //獲取圖片的url

        //採用request模塊,向服務器發起一次請求,獲取圖片資源
        request.head(img_src, function(err, res, body) {
            if(err) {
                console.log(err);
            }
        });
        request(img_src).pipe(fs.createWriteStream('./image/' + news_title + '---' + img_filename));
        //經過流的方式,把圖片寫到本地/image目錄下,並用標題和圖片的標題做爲圖片的名稱。
    })
}
fetchPage(url); //主程序開始運行
相關文章
相關標籤/搜索