Node实战-----爬取⽹页图⽚
在本篇博⽂中我将实现⼀个完整的实例:主要使⽤Node.js爬取⼀个⽹页,需要通过第三⽅模块cheerio.js分析这个⽹页的内容,最后将这个⽹页的图⽚保存个在本地。
⼀、项⽬⽬录与思路
tablets box新建⼀个项⽬名为:project_01,输⼊命令在控制台,使其⽣成package.json⽂件:
activex和ppapi选哪个
命令:
npm init
在控制台输⼊npm install命令下载需要的模块,在本项⽬中需要的request和cheerio模块,将使⽤命令进⾏下载到本地:
命令:
npm install request cheerio -S
此时项⽬的⽂件夹的⽬录为:
img⽂件夹⽤来存储图⽚⽂件
node_modules⽂件夹是模块默认的保存位置
index.js⽂件是整个项⽬的⼊⼝⽂件。
config.js⽂件是配置⽂件,⽤来存放⽹页地址和图⽚⽂件夹的路径,这样做的⽬的是使整个项⽬的可拓展性增强。
analyze.js⽂件⽤来存储分析DOM的⽅法。
package.json⽂件是包的描述⽂件。
打开node_modules⽂件夹可以看到相应的模块:
整体的思路:通过第三⽅模块request的请求⽹页地址,从⽽得到整个⽹页的DOM结构,根据DOM结构利⽤cheerio模块分析出图⽚⽂件的地址,再次请求这个地址,再次请求这个地址,最后将得到的图⽚数据存储在本地。
⼆、配置⽹页地址及图⽚存放的⽂件夹
配置内容:config.js中,在⽂件中通过exports导出这些配置内容,从⽽使其它⽂件可以使⽤
以爬为例
代码:
config.js
const url='deceo/';//填写⾃⼰请求的具体的⽹址
const path=require('path');
const imgDir=path.join(__dirname,'img');
三、解析DOM得到的图⽚地址
得到DOM结构之后,将分析DOM部分代码写⼊analyze.js⽂件中,通过cheerio得到每⼀张图⽚的地址,最后利⽤⼀个回调函数callback 处理这个地址(这⾥的回调函数callback是发送请求):
代码:
analyze.js:
const cheerio=require('cheerio');
const fs=require('fs');
function findImg(dom,Callback){
let $=cheerio.load(dom);
$('img').each(function(i,elem){
let imgSrc=$(this).attr('src');
Callback(imgSrc,i);
});
}
cheerio模块可以像jQuery⼀样操作DOM,这⾥得到的是请求⽹页中每⼀张图⽚的⽂件地址
四、请求图⽚的地址以及图⽚⽂件的保存
请求图⽚的的地址:
将请求的操作放在主模块index.js⽂件中,将config.js和analyze.js⽂件引⼊这个模块,利⽤request模块请求图⽚的地址,得到DOM结构,将DOM结构给analyze的findImg⽅法处理,代码:
const http=require('http');
const fs=require('fs');
const request=require('request');
const path=require('path');
const config=require('./config');
const analyze=require('./analyze');
springboot starter自定义
function start(){
request(config.url,function(err,res,body){
console.log('start');
if(!err && res){
console.log('start');
analyze.findImg(body);
}
})
}
图⽚⽂件的保存:
通过分析DOM结构得到图⽚地址后,利⽤request再次发送请求,将请求得到的数据写⼊本地即可,这⾥也将其封装为⼀个函数,追加在index.js⽂件中:
代码:
function downLoad(imgUrl,i){
let ext=imgUrl.split('.').pop();jquery下载文件请求
request(imgUrl).ateWriteStream(path.join(config.imgDir,i+'.'+ext),{
'enconding':'binary'
}))
console.log(i);
}
注意:所获取的数据的⼆进制数据,所以⼀定要设置编码格式为binary,因为writeFile的默认编码格式为utf-8,否则保存的图⽚⽆法打开。
同时,我们需要将这个download函数作为参数传递给analyze模块的findImg⽅法,最后运⾏这个项⽬的主函数start(),这样项⽬才会运⾏起来
index.js
const http=require('http');
const fs=require('fs');
const request=require('request');
const path=require('path');
const config=require('./config');
const analyze=require('./analyze');
function start(){
request(config.url,function(err,res,body){
console.log('start');
if(!err && res){
console.log('start');
analyze.findImg(body,downLoad);
}
})
}
function downLoad(imgUrl,i){
let ext=imgUrl.split('.').pop();
request(imgUrl).ateWriteStream(path.join(config.imgDir,i+'.'+ext),{
'enconding':'binary'
}))
c语言必背代码求和值console.log(i);
异步fifo时序
}
start();
最终的结果显⽰:
运⾏代码不到5秒钟,就抓取完了并命名好了,这相对于我们⼿动保存,速度⾮常快
你想抓取哪个⽹站的图⽚就抓取哪个⽹站的图⽚(当然除了那些做了防爬⾍处理的)。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。