Nodejs爬蟲實戰(二)

1. 嘗試抓取數據

  1. 引入模塊httpfsfs爲文件操作模塊

  2. let 聲明的變量只在 let 命令所在的代碼塊內有效

    1. 在ES6之前沒有塊級概念,let在所在區域內有效,和c語言中的變量作用域相同。

    2. var變量,函數內聲明的變量作用域是局部的,外部就是全局的。

  3. request中包含很多信息,其中的hostname指域名,path指域名後的路徑。

  4. 抓取數據必然是要在request請求發送後進行,防止數據阻塞導致 函數提前執行拋異常出現,將操作放在回調函數中。

  5. 箭頭函數 (ES6語法)

    • 更簡短的函數

      ES3/5:

        elements.map(function(element) { 
          return element.length; 
        });
      

      ES6:

        elements.map((e) => {
          return e.length;
        });
        
        // 當只有一個參數時,可以省略括號
        elements.map(e => {
         return e.length;
        }); 
        
        // 當函數體只有一個 `return` 語句時,
        //可以省略 `return` 關鍵字和方法體的花括號
        elements.map(e => e.length);
      
    • 不綁定this

      this:面向對象的標誌

        //ES3/5
        //通過將this值分配給封閉的變量,可以解決this問題。
      
        function Person() {
          //構造函數定義`this`作爲自己的實例.
          this.age = 0;
        
          setInterval(function growUp() {
            // 非嚴格模式, growUp()定義`this`作爲全局對象, 
            // 與在 Person()構造函數中定義的 `this`並不相同.
            this.age++;
          }, 1000);
        }
      
      
        //ES6
        //箭頭函數不會創建自己的this,只從自己的作用域鏈的上一層繼承this。
      
        function Person(){
          this.age = 0;
        
          setInterval(() => {
            this.age++; // |this| 正確地指向 p 實例
          }, 1000);
        }
      
        var p = new Person();
      
  6. 取數據,通過on將data做buffer操作,將讀取的結果依此push到數組arr中,通過end回調寫文件fs.writeFile,寫文件成功打印success

     var arr =[];
     res.on('data',buffer=>{
     	arr.push(buffer)
     });
     res.on('end',()=>{
     	fs.writeFile('1.jpg',b,()=>{
     		console.log('success')
     	})
     });
    
  7. 結果發現照片打不開,爲什麼呢?

  8. 這裏存在一個轉換的問題,它必須將我們讀取到的data轉換爲二進制流,(將一個.jpg拖進文本編輯器會自動解析爲二進制文本)

  9. buffer對象已經提供了concat方法幫我們轉換爲二進制流。

    let b = Buffer.concat(arr);

  10. 別忘了最後的end()

    ####### 完整代碼

    const http = require('http');
    const fs = require('fs');
    
    let req = http.request({
    	'hostname':'img.alicdn.com',
    	'path':'/tps/i4/TB1_1BLMXXXXXb3XXXXlkjU.VXX-346-200.jpg_350x1000q90.jpg_.webp'
    },res=>{
    	var arr =[];
    	res.on('data',buffer=>{
    		arr.push(buffer)
    	});
    
    	res.on('end',()=>{
    		let b = Buffer.concat(arr);
    
    		fs.writeFile('1.jpg',b,()=>{
    			console.log('success')
    		})
    	});
    });
    
    req.end();
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章