最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于node.js制作簡單爬蟲教程

 更新時間:2017年06月29日 14:23:22   作者:靜心慢跑  
這篇文章主要為大家詳細介紹了基于node.js制作簡單爬蟲的教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下

前言:最近想學習node.js,突然在網(wǎng)上看到基于node的爬蟲制作教程,所以簡單學習了一下,把這篇文章分享給同樣初學node.js的朋友。

目標:爬取 http://tweixin.yueyishujia.com/webapp/build/html/ 網(wǎng)站的所有門店發(fā)型師的基本信息。

思路:訪問上述網(wǎng)站,通過chrome瀏覽器的network對網(wǎng)頁內(nèi)容分析,找到獲取各個門店發(fā)型師的接口,對參數(shù)及返回數(shù)據(jù)進行分析,遍歷所有門店的所有發(fā)型師,直到遍歷完畢,同事將信息存儲到本地。

步驟一:安裝node.js

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

步驟二:建立工程

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

2)mkdir node (創(chuàng)建一個文件夾用來存放項目,我這里取名為node);

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

步驟三:創(chuàng)建爬取到的數(shù)據(jù)存放的文件夾

1)創(chuàng)建data文件夾用來存放發(fā)型師基本信息;

2)創(chuàng)建image文件夾用來存儲發(fā)型師頭像圖片;

  此時工程下文件如下: 

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

1)npm install cheerio –save

2)npm install superagent –save

3)npm install async –save

4)npm install request –save

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

cheerio:是nodejs的抓取頁面模塊,為服務器特別定制的,快速、靈活、實施的jQuery核心實現(xiàn),則能夠?qū)φ埱蠼Y果進行解析,解析方式和jQuery的解析方式幾乎完全相同;

superagent:能夠?qū)崿F(xiàn)主動發(fā)起get/post/delete等請求;

async:async模塊是為了解決嵌套金字塔,和異步流程控制而生,由于nodejs是異步編程模型,有一些在同步編程中很容易做到的事情,現(xiàn)在卻變得很麻煩。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; //獲取發(fā)型師處有分頁功能,所以用該變量控制分頁
var num = 0;//爬取到的信息總條數(shù)
var storeid = 1;//門店ID
console.log('爬蟲程序開始運行......');

function fetchPage(x) {   //封裝函數(shù)
  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;
          // 并發(fā)遍歷deslist對象
          async.mapLimit(deslist, 5, 
            function (hair, callback) {
            // 對每個對象的處理邏輯
               console.log('...正在抓取數(shù)據(jù)ID:'+hair.id+'----發(fā)型師:'+hair.name);
               saveImg(hair,callback);
            }, 
            function (err, result) {
              console.log('...累計抓取的信息數(shù)→→' + num);
            }
          );
          page++;
          fetchPage(page);
        }else{
          if(page == 1){
            console.log('...爬蟲程序運行結束~~~~~~~');
            console.log('...本次共爬取數(shù)據(jù)'+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模塊,向服務器發(fā)起一次請求,獲取圖片資源
  request.head(img_src,function(err,res,body){
    if(err){
      console.log(err);
    }else{
        request(img_src).pipe(fs.createWriteStream('./image/' + img_filename));   //通過流的方式,把圖片寫到本地/image目錄下,并用發(fā)型師的姓名和所屬門店作為圖片的名稱。
        console.log('...存儲id='+hair.id+'相關圖片成功!');
    }
  });
  // 存儲照片相關信息
  var html = '姓名:'+hair.name+'<br>職業(yè):'+hair.jobtype+'<br>職業(yè)等級:'+hair.jobtitle+'<br>簡介:'+hair.simpleinfo+'<br>個性簽名:'+hair.info+'<br>剪發(fā)價格:'+hair.cutmoney+'元<br>店名:'+hair.store.name+'<br>地址:'+hair.store.location+'<br>聯(lián)系方式:'+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命令運行爬蟲程序,效果圖如下:

運行成功后,發(fā)型師基本信息以html文件的形式存儲在data文件夾中,發(fā)型師頭像圖片存儲在image文件夾下:

 后記:到此一款基于node.js制作的簡單爬蟲就大功告成了,由于我也是初學者,好多地方也不是很理解,但好在是自己完成了,不足之處敬請諒解。

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

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • npm?install報錯unable?to?resolve?dependency?tree的解決辦法

    npm?install報錯unable?to?resolve?dependency?tree的解決辦法

    在開發(fā)過程中經(jīng)常會使用npm安裝依賴包來加速開發(fā),但是在執(zhí)行npm install命令時,有時會遇到各種錯誤,下面這篇文章主要給大家介紹了關于npm?install報錯unable?to?resolve?dependency?tree的解決辦法,需要的朋友可以參考下
    2023-05-05
  • Node.js模塊全局安裝路徑配置方法

    Node.js模塊全局安裝路徑配置方法

    今天小編就為大家分享一篇Node.js模塊全局安裝路徑配置方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • 使用VS開發(fā) Node.js指南

    使用VS開發(fā) Node.js指南

    這篇文章主要介紹了使用VS開發(fā) Node.js的方法,主要是使用NTVS(Node.js Toolsfor Visual Studio)來實現(xiàn),有需要的小伙伴參考下
    2015-01-01
  • mac下安裝node.js的詳細步驟

    mac下安裝node.js的詳細步驟

    Node.js本質(zhì)上是一個JavaScript運行時環(huán)境,它提供了在服務器端運行JavaScript代碼的能力,這篇文章主要給大家介紹了關于mac下安裝node.js的詳細步驟,需要的朋友可以參考下
    2023-10-10
  • Node.js 中使用 async 函數(shù)的方法

    Node.js 中使用 async 函數(shù)的方法

    async是一個流程控制工具包,提供了直接而強大的異步功能?;贘avascript為Node.js設計,同時也可以直接在瀏覽器中使用。
    2017-11-11
  • nodejs實現(xiàn)HTTPS發(fā)起POST請求

    nodejs實現(xiàn)HTTPS發(fā)起POST請求

    這篇文章主要介紹了nodejs實現(xiàn)HTTPS發(fā)起POST請求的實例代碼,非常的簡單實用,有需要的小伙伴可以參考下。
    2015-04-04
  • 淺談Node.js 中間件模式

    淺談Node.js 中間件模式

    中間件在 Node.js 中被廣泛使用,它泛指一種特定的設計模式、一系列的處理單元、過濾器和處理程序,以函數(shù)的形式存在,這篇文章主要介紹了淺談Node.js 中間件模式,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-06-06
  • nodejs?express實現(xiàn)中間件

    nodejs?express實現(xiàn)中間件

    這篇文章主要為大家介紹了nodejs?express實現(xiàn)中間件實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • Nodejs sublime text 3安裝與配置

    Nodejs sublime text 3安裝與配置

    Sublime Text是一個輕量、簡潔、高效、跨平臺的編輯器,方便的配色以及兼容vim快捷鍵等各種優(yōu)點博得了很多前端開發(fā)人員的喜愛!Sublime Text這款程序員必備代碼編輯器,幾乎每位程序員提到Sublime Text都是贊不絕口!它體積小巧,無需安裝,綠色便攜
    2014-06-06
  • 關于express與koa的使用對比詳解

    關于express與koa的使用對比詳解

    很多人都在問到底該用Koa還是express,所以下面這篇文章就來給大家再次的對比了關于express與koa的相關資料,通過對比大家可以更好的進行選擇,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面隨著小編來一起學習學習吧。
    2018-01-01

最新評論

屯门区| 瑞安市| 武宁县| 鄂托克旗| 尼玛县| 容城县| 鹿邑县| 龙南县| 海伦市| 明光市| 彩票| 甘孜县| 孝感市| 正蓝旗| 台湾省| 武鸣县| 闸北区| 尖扎县| 天全县| 利辛县| 黑水县| 屏东市| 右玉县| 利辛县| 澎湖县| 图们市| 蒲江县| 舒城县| 大竹县| 崇礼县| 顺昌县| 临清市| 中西区| 舟山市| 轮台县| 长阳| 如东县| 四平市| 武平县| 尤溪县| 延吉市|