下面是“Nodejs实现批量下载妹纸图”的完整攻略:
1. 准备工作
首先需要安装 Node.js 和 NPM(Node Package Manager),可以在官网下载安装程序。
然后在命令行窗口中使用以下命令安装必要的模块:
npm install request cheerio mkdirp --save
request
:用于发送 HTTP/HTTPS 请求;cheerio
:类似于 jQuery,用于解析 HTML 标签;mkdirp
:Node.js 文件系统模块,用于创建目录。
2. 编写代码
本案例中,我们使用爬虫来下载妹纸图。以下是完整的代码:
const request = require('request');
const cheerio = require('cheerio');
const mkdirp = require('mkdirp');
const path = require('path');
// 下载的图片分类
const categories = ['xinggan', 'japan', 'taiwan', 'mm']
// 下载数量
const imgNum = 10;
// 下载目录名
const dirName = 'meizi';
// 创建目录
mkdirp(dirName, (err) => {
if (err) {
return console.error(err);
} else {
console.log(`${dirName}目录创建成功`);
for (let category of categories) {
getImgs(dirName, category, imgNum);
}
}
});
// 获取图片链接
function getImgs(dir, category, num) {
const url = `http://www.mzitu.com/${category}/`;
request(url, (error, response, body) => {
if (!error && response.statusCode === 200) {
const $ = cheerio.load(body);
let count = 0;
const imgUrls = [];
$('img').each(function(i, element) {
const src = $(this).attr('src');
if (src.indexOf('http://') === -1) {
imgUrls.push(`http:${src}`);
} else {
imgUrls.push(src);
}
});
console.log(`开始下载${category}分类的图片`);
downloadImgs(dir, category, num, imgUrls);
} else {
console.error(`请求失败,错误码:${response.statusCode}`);
}
});
}
// 下载图片
function downloadImgs(dir, category, num, imgUrls) {
if (imgUrls.length === 0) {
console.log(`${category}分类没有找到可下载的图片`);
return;
}
if (imgUrls.length < num) {
console.log(`${category}分类只有${imgUrls.length}张可下载的图片`);
num = imgUrls.length;
}
const downloadDir = path.join(dir, category);
mkdirp(downloadDir, (err) => {
if (err) {
console.error(err);
}
});
for (let i=0; i<num; i++) {
const imgUrl = imgUrls[i];
const imgName = `${category}-${i+1}.${imgUrl.split('.').pop()}`;
const targetPath = path.join(downloadDir, imgName);
request(imgUrl).pipe(fs.createWriteStream(targetPath));
}
console.log(`下载${category}分类的图片完成`);
}
分析代码
代码由三部分组成:准备工作、获取图片链接和下载图片。
在准备工作中,我们使用 mkdirp
模块创建一个名为 dirName
的目录。该目录中包含了要下载的图片的分类名 categories
和下载数 imgNum
。
在获取图片链接中,我们使用 request
模块向目标网站发送请求,并使用 cheerio
模块解析 HTML 标签,获取所有的图片链接。最后使用 downloadImgs
函数下载图片。
在下载图片中,我们使用 fs
模块将所有图片保存到本地文件系统。
3. 运行代码
将代码保存在一个名为 meizi.js
的文件中,使用以下命令运行:
node meizi.js
代码会自动爬取 http://www.mzitu.com/
网站的妹纸图,并下载到本地。
示例1
假如我们要下载 5 张 -xinggan
分类的妹纸图,可以这样:
const request = require('request');
const cheerio = require('cheerio');
const mkdirp = require('mkdirp');
const path = require('path');
const categories = ['xinggan'];
const imgNum = 5;
const dirName = 'meizi';
mkdirp(dirName, (err) => {
if (err) {
return console.error(err);
} else {
console.log(`${dirName}目录创建成功`);
for (let category of categories) {
getImgs(dirName, category, imgNum);
}
}
});
function getImgs(dir, category, num) {
const url = `http://www.mzitu.com/${category}/`;
request(url, (error, response, body) => {
if (!error && response.statusCode === 200) {
const $ = cheerio.load(body);
let count = 0;
const imgUrls = [];
$('img').each(function(i, element) {
const src = $(this).attr('src');
if (src.indexOf('http://') === -1) {
imgUrls.push(`http:${src}`);
} else {
imgUrls.push(src);
}
});
console.log(`开始下载${category}分类的图片`);
downloadImgs(dir, category, num, imgUrls);
} else {
console.error(`请求失败,错误码:${response.statusCode}`);
}
});
}
function downloadImgs(dir, category, num, imgUrls) {
if (imgUrls.length === 0) {
console.log(`${category}分类没有找到可下载的图片`);
return;
}
if (imgUrls.length < num) {
console.log(`${category}分类只有${imgUrls.length}张可下载的图片`);
num = imgUrls.length;
}
const downloadDir = path.join(dir, category);
mkdirp(downloadDir, (err) => {
if (err) {
console.error(err);
}
});
for (let i=0; i<num; i++) {
const imgUrl = imgUrls[i];
const imgName = `${category}-${i+1}.${imgUrl.split('.').pop()}`;
const targetPath = path.join(downloadDir, imgName);
request(imgUrl).pipe(fs.createWriteStream(targetPath));
}
console.log(`下载${category}分类的图片完成`);
}
示例2
如果我们要下载 xinggan
、japan
、taiwan
和 mm
四个分类的第 3 张图片,可以这样:
const request = require('request');
const cheerio = require('cheerio');
const mkdirp = require('mkdirp');
const path = require('path');
const categories = ['xinggan', 'japan', 'taiwan', 'mm'];
const imgNum = 3;
const dirName = 'meizi';
mkdirp(dirName, (err) => {
if (err) {
return console.error(err);
} else {
console.log(`${dirName}目录创建成功`);
for (let category of categories) {
getImgs(dirName, category, imgNum);
}
}
});
function getImgs(dir, category, num) {
const url = `http://www.mzitu.com/${category}/`;
request(url, (error, response, body) => {
if (!error && response.statusCode === 200) {
const $ = cheerio.load(body);
let count = 0;
const imgUrls = [];
$('img').each(function(i, element) {
const src = $(this).attr('src');
if (src.indexOf('http://') === -1) {
imgUrls.push(`http:${src}`);
} else {
imgUrls.push(src);
}
});
console.log(`开始下载${category}分类的图片`);
downloadImgs(dir, category, num, imgUrls);
} else {
console.error(`请求失败,错误码:${response.statusCode}`);
}
});
}
function downloadImgs(dir, category, num, imgUrls) {
if (imgUrls.length === 0) {
console.log(`${category}分类没有找到可下载的图片`);
return;
}
if (imgUrls.length < num) {
console.log(`${category}分类只有${imgUrls.length}张可下载的图片`);
num = imgUrls.length;
}
const downloadDir = path.join(dir, category);
mkdirp(downloadDir, (err) => {
if (err) {
console.error(err);
}
});
const imgUrl = imgUrls[num-1];
const imgName = `${category}-${num}.${imgUrl.split('.').pop()}`;
const targetPath = path.join(downloadDir, imgName);
request(imgUrl).pipe(fs.createWriteStream(targetPath));
console.log(`下载${category}分类的第${num}张图片完成`);
}
总结
本文中,我们介绍了如何使用 Node.js 实现批量下载妹纸图。我们通过爬虫技术获取了要下载的妹纸图的图片链接,并将图片保存到本地文件系统中。完成了所有的工作之后,我们得到了一个功能完善的 Node.js 程序,能够自动下载指定分类的妹纸图,这对于爱好者来说是一个非常有用的工具。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Nodejs实现批量下载妹纸图 - Python技术站