製做教程

前言:最近想學習node.js,忽然在網上看到基於node的爬蟲製做教程,因此簡單學習了一下,把這篇文章分享給一樣初學node.js的朋友。javascript

目標:爬取 http://tweixin.yueyishujia.com/webapp/build/html/ 網站的全部門店髮型師的基本信息。html

思路:訪問上述網站,經過chrome瀏覽器的network對網頁內容分析,找到獲取各個門店髮型師的接口,對參數及返回數據進行分析,遍歷全部門店的全部發型師,直到遍歷完畢,同事將信息存儲到本地。java

 

步驟一安裝node.jsnode

下載並安裝node,此步驟比較簡單就不詳細解釋了,有問題的能夠直接問一下度娘。jquery

 

步驟二創建工程git

1)打開dos命令條,cd進入想要建立項目的路徑(我將此項目直接放在了E盤,如下皆以此路徑爲例);github

2)mkdir node (建立一個文件夾用來存放項目,我這裏取名爲node);web

3)cd 進入名爲node的文件夾,並執行npm init初始化工程(期間會讓填寫一些信息,我是直接回車的);chrome

 

步驟三建立爬取到的數據存放的文件夾npm

1)建立data文件夾用來存放髮型師基本信息;

2)建立image文件夾用來存儲髮型師頭像圖片;

  此時工程下文件以下:

  

 

步驟四安裝第三方依賴包(fs是內置模塊,不須要單獨安裝)

1)npm install cheerio –save

2)npm install superagent –save

3)npm install async –save

4)npm install request –save

分別簡單解釋一下上面安裝的依賴包:

cheerio:是nodejs的抓取頁面模塊,爲服務器特別定製的,快速、靈活、實施的jQuery核心實現,則可以對請求結果進行解析,解析方式和jQuery的解析方式幾乎徹底相同;

superagent:可以實現主動發起get/post/delete等請求;

async:async模塊是爲了解決嵌套金字塔,和異步流程控制而生,因爲nodejs是異步編程模型,有一些在同步編程中很容易作到的事情,如今卻變得很麻煩。Async的流程控制就是爲了簡化這些操做;

request:有了這個模塊,http請求變的超簡單,Request使用簡單,同時支持https和重定向;

 

步驟五編寫爬蟲程序代碼

打開hz.js,編寫代碼:

 

var superagent = require('superagent'); 
var cheerio = require('cheerio');
var async = require('async');
var fs = require('fs');
var request = require('request');
var page=1; //獲取髮型師處有分頁功能,因此用該變量控制分頁
var num = 0;//爬取到的信息總條數
var storeid = 1;//門店ID
console.log('爬蟲程序開始運行......');

function fetchPage(x) {     //封裝函數
    startRequest(x); 
}
function startRequest(x) {

    superagent
        .post('http://tweixin.yueyishujia.com/v2/store/designer.json')
        .send({ 
            // 請求的表單信息Form data
            page : x, 
            storeid : storeid
        })
           // Http請求的Header信息
       .set('Accept', 'application/json, text/javascript, */*; q=0.01')
       .set('Content-Type','application/x-www-form-urlencoded; charset=UTF-8')
       .end(function(err, res){          
            // 請求返回後的處理
            // 將response中返回的結果轉換成JSON對象
            if(err){
                console.log(err);
            }else{
                var designJson = JSON.parse(res.text);
                var deslist =  designJson.data.designerlist;
                if(deslist.length > 0){
                    num += deslist.length;
                    // 併發遍歷deslist對象
                    async.mapLimit(deslist, 5, 
                        function (hair, callback) {
                        // 對每一個對象的處理邏輯
                             console.log('...正在抓取數據ID:'+hair.id+'----髮型師:'+hair.name);
                             saveImg(hair,callback);
                        }, 
                        function (err, result) {
                            console.log('...累計抓取的信息數→→' + num);
                        }
                    );
                    page++;
                    fetchPage(page);
                }else{
                    if(page == 1){
                        console.log('...爬蟲程序運行結束~~~~~~~');
                        console.log('...本次共爬取數據'+num+'條...');
                        return;
                    }
                    storeid += 1;
                    page = 1;
                    fetchPage(page);
                }
            }
        });
} 
fetchPage(page);
function saveImg(hair,callback){
    // 存儲圖片
    var img_filename = hair.store.name+'-'+hair.name + '.png';

    var img_src = 'http://photo.yueyishujia.com:8112' + hair.avatar; //獲取圖片的url

    //採用request模塊,向服務器發起一次請求,獲取圖片資源
    request.head(img_src,function(err,res,body){
        if(err){
            console.log(err);
        }else{
                request(img_src).pipe(fs.createWriteStream('./image/' + img_filename));     //經過流的方式,把圖片寫到本地/image目錄下,並用髮型師的姓名和所屬門店做爲圖片的名稱。
                console.log('...存儲id='+hair.id+'相關圖片成功!');
        }
    });
    // 存儲照片相關信息
    var html = '姓名:'+hair.name+'<br>職業:'+hair.jobtype+'<br>職業等級:'+hair.jobtitle+'<br>簡介:'+hair.simpleinfo+'<br>個性簽名:'+hair.info+'<br>剪髮價格:'+hair.cutmoney+'元<br>店名:'+hair.store.name+'<br>地址:'+hair.store.location+'<br>聯繫方式:'+hair.telephone+'<br>頭像:<img src='+img_src+' style="width:200px;height:200px;">';
    fs.appendFile('./data/' +hair.store.name+'-'+ hair.name + '.html', html, 'utf-8', function (err) {
        if (err) {
            console.log(err);
        }
    });
    callback(null, hair);
}

 

 

步驟六運行爬蟲程序

輸入node hz.js命令運行爬蟲程序,效果圖以下:

運行成功後,髮型師基本信息以html文件的形式存儲在data文件夾中,髮型師頭像圖片存儲在image文件夾下:

 

 

 

後記:到此一款基於node.js製做的簡單爬蟲就大功告成了,因爲我也是初學者,好多地方也不是很理解,但好在是本身完成了,不足之處敬請諒解。

   代碼下載地址:https://github.com/yanglei0323/nodeCrawler

相關文章
相關標籤/搜索