Nodejs爬虫实战(二)
1. 尝试抓取数据
引入模块
http
和fs
,fs
为文件操作模块let 声明的变量只在 let 命令所在的代码块内有效
在ES6之前没有块级概念,let在所在区域内有效,和c语言中的变量作用域相同。
var变量,函数内声明的变量作用域是局部的,外部就是全局的。
request
中包含很多信息,其中的hostname
指域名,path
指域名后的路径。抓取数据必然是要在
request
请求发送后进行,防止数据阻塞导致 函数提前执行抛异常出现,将操作放在回调函数中。箭头函数 (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();
取数据,通过
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') }) });
结果发现照片打不开,为什么呢?
这里存在一个转换的问题,它必须将我们读取到的
data
转换为二进制流,(将一个.jpg拖进文本编辑器会自动解析为二进制文本)buffer对象已经提供了
concat
方法帮我们转换为二进制流。let b = Buffer.concat(arr);
别忘了最后的
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();
原文作者: 冯亚杰(DanBoard·Feng)
原文链接: http://danbo3110.github.io/2019/10/23/Nodejs爬虫实战(二)/
版权声明: 转载请注明出处(必须保留作者署名及链接)