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();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值