使用 node 抓取网页图片
node 的使用非常广泛,可以做通信,做爬虫,甚至可以做桌面应用程序。
今天就利用闲暇时间写个小小的分享:利用 node 爬取百度图片首页的图片。
对,就是中间那几张:
首先新建一个文件夹,名字随便取,只要不是中文就行,然后在命令行中初始化一下:
npm init -y
新建一个名为 app.js 的文件
在这个文件里,我们需要引入一些模块:
var http=require('http');
var https=require('https')
var fs=require('fs');
var cheerio=require('cheerio');
cheerio 模块是第三方模块,需要进行安装:
npm install cheerio --save
接下来,需要解析百度图片的首页:
var wz='http://images.baidu.com/';
var strHtml='';
http.get(wz,(res)=>{
res.on('data',(chunk)=>{
strHtml+=chunk;
});
console.log(strHtml)
})
在命令行输入 node app.js 运行,会在命令行看到网页的源代码。这样网页就解析完了。
接下来我们需要获取首页中间的十张图片。
要获取图片,就必须知道图片的 url 地址,在这个网页上,图片的url地址在 img_single_box 下的 img 标签里。
我们之前引用了一个名为 cheerio 的第三方模块,这个库是一个 jQuery 的模块,可以在服务端写 jQuery
在上面的代码示例中,我们已经获取到了网页源代码,接下来就要找到我们需要的 url 地址了:
http.get(wz,(res)=>{
res.on('data',(chunk)=>{
···
});
res.on('end',()=>{
var $=cheerio.load(strHtml);
//建立一个空数组,用来放我们取得的url地址
var imgdata=[];
$('.img_single_box img').each((index,item)=>{
imgdata.push($(item).attr('src'))
});
console.log(imgdata)
})
})
运行我们写的文件,你将会看到我们需要的url地址已经存进去了。
现在就利用这几个url地址来保存图片了
http.get(wz,(res)=>{
res.on('data',(chunk)=>{
···
});
res.on('end',()=>{
···
function saveImage(imgdata){
https.get(imgdata,(res)=>{
res.setEncoding('binary');//二进制文件
var data='';
res.on('data',(a)=>{
data+=a;
}).on('end',()=>{
if(!fs.existsSync('./images')){
fs.mkdirSync('./images');
};
fs.writeFile('images/'+Math.random()+'.png',data,'binary',(err)=>{
if(!err)
console.log('成功')
})
})
});
}
for(var i=0;i<imgdata.length;i++){
saveImage(imgdata[i]);
}
})
})
到这里就写完了,在命令行 node app.js ,是不是在 images 文件夹下有了10张图片呢?