nodeJS做一個簡單的爬蟲

weixin_33872660發表於2018-03-30

nodeJS(準確的說是express+request+cheerio)做一個簡單的爬蟲,爬取豆瓣電影的電影圖片,電影描述。

預設認為已安裝node環境。
  建立資料夾projectName在資料夾下命令列執行npm init,一路回車,或者自定義資訊初始化專案;成功後執行npm install express request cheerio -S安裝依賴;成功後在目錄下建立index.js,建立資料夾data(用來存放爬取下來的電影描述)和image(用來存放電影圖片);接下來就開始寫爬取邏輯了,程式碼如下:

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); //主程式開始執行

專案根目錄下DOC命令node index.js執行程式,完成後可在dataimage下檢視爬取下來的內容啦。

這個只是簡單的爬取電影資訊的程式,需要其他功能,需要在邏輯中進行改動。(程式碼是我抄的,如作者不同意,請聯絡我,我修改!)

相關文章