NodeJS爬取网站图片并下载
说到爬虫,大家首先想到的一定是Python爬虫(反正我是),前段时间学习nodejs老师讲了一个爬虫案例当时就感到很兴奋,没想到js也能爬虫,下面请看实例代码
1.项目准备
前提是安装了node环境并且npm安装了cheerio(用于筛选数据)。
2.上代码
const https = require('https'); // node内置模块https,如果你要爬取的网站是http协议就要引入http模块,两者用法基本相同
const fs = require('fs'); // node内置模块fs 用于后面操作文件
const cheerio = require('cheerio'); //需要自己npm安装,用于筛选爬到的数据,用法跟jquery类似
let url = 'https://china.nba.com/'; // 要爬取的网站,这里是nba中国官方网站
https.get(url, (res) => {
// 安全判断 开始
const {statusCode} = res; //状态码
const contentType = res.headers['content-type']; //文件类型
let err = null;
if (statusCode !== 200) {
err = new Error('请求状态错误'); //生成一个自定义错误对象
} else if (!/^text\/html/.test(contentType)) {
// 格式类型不是网页
err = new Error('请求类型错误');
}
//如果err为真,即上面两个判断出错
if (err) {
console.log(err);
res.resume(); // 重置缓存
return false;
}
//安全判断 -- 结束
// 以下是数据处理
let rawData = ''; //数据是一段一段的传输,这用于拼接所有数据
// 数据分段 只要接受数据就会触发data事件,chunk表示每次接受的数据片段
res.on('data', (chunk) => {
rawData += chunk.toString('utf8'); //传输数据是二进制流,所以我们要转为utf8格式
})
// 数据流传输完毕
res.on('end', () => {
// 将爬到的数据下载到本地
fs.writeFileSync('./nba.html', rawData); // 这样你的根目录下就会有一个nba的静态网页代码
console.log('传输完成');
const $ = cheerio.load(rawData); // 使用cheerio
var imglist = []; // 用于存储爬取到的图片url地址
$('img').each((index, el) => {
imglist.push($(el).attr('src'));
})
// console.log(imglist);
imglist.forEach((item) => {
loadImg(item); // 封装的下载图片到本地的方法,只需要传入url即可
})
})
}).on('error', (err) => {
console.log(err);
})
// 封装下载图片到本地方法
function loadImg (url) {
https.get(url, (res) => {
res.setEncoding("binary"); // 一定要设置response的编码为binary否则会下载下来的图片打不开
var imgData = '';
res.on('data', (chunk) => {
imgData += chunk;
})
res.on('end', () => {
// 将爬到的图片下载到本地,下载前要确认根目录下有imgs文件夹,否则会fail
fs.writeFile('./imgs/' + Math.floor(Math.random() * 100000) +'.png', imgData, "binary", function(error){
if(error){
console.log("down fail");
}else{
console.log("down success");
}
});
})
})
}
3.运行文件代码
node splider.js
根目录下的imgs文件夹下就会出现爬取下来的图片