Nodejs实现批量下载妹纸图

下面是“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

如果我们要下载 xingganjapantaiwanmm 四个分类的第 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技术站

(0)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • 解决vue eslint开发严格模式警告错误的问题

    下面是解决vue eslint开发严格模式警告错误的问题的完整攻略,具体步骤如下: 1. 理解严格模式 在解决问题之前,我们需要先了解一下什么是严格模式。Vue默认启用了ESLint严格模式,用于捕获一些潜在的问题。这种模式下会对一些非规范行为进行报错提示,提高了代码的质量和可维护性。但是对于一些新手或者还不是很熟悉语法的人来说,这些警告可能会显得很繁琐,并…

    node js 2023年6月9日
    00
  • node.js中的events.EventEmitter.listenerCount方法使用说明

    接下来我将为您提供一份“node.js中的events.EventEmitter.listenerCount方法使用说明”的完整攻略。 什么是EventEmitter? 在 Node.js 中,EventEmitter是一种非常重要的基础设施,它是 Node.js 内置的一个模块,用于实现事件驱动的编程方式。它可以监听事件,并打印日志、处理数据等等。 lis…

    node js 2023年6月8日
    00
  • Nodejs进阶:express+session实现简易登录身份认证

    下面我将为你详细讲解“Nodejs进阶:express+session实现简易登录身份认证”的完整攻略。本攻略主要分为以下几个部分: 什么是session express-session的使用 实现简易登录身份认证的步骤 示例说明 什么是session 在Web开发中,我们常常需要通过用户的身份认证来实现一些特殊的操作。而在HTTP的无状态协议中,为了保存用…

    node js 2023年6月8日
    00
  • 纯异步nodejs文件夹(目录)复制功能

    下面是“纯异步nodejs文件夹(目录)复制功能”的完整攻略。 一、了解异步编程 在介绍纯异步nodejs文件夹(目录)复制功能之前,需要先了解一下异步编程。 异步编程是指在一个执行单元(A)中调用另一个执行单元(B),而在B执行的同时,执行单元A可以继续执行,不必等待B完成。这种编程方式在Node.js中非常常见,因为Node.js处理大量I/O(输入输出…

    node js 2023年6月8日
    00
  • nodejs发送http请求时遇到404长时间未响应的解决方法

    关于“nodejs发送http请求时遇到404长时间未响应的解决方法”的完整攻略,我可以提供以下几点建议和示例说明: 问题背景 在使用 Node.js 发送 HTTP 请求时,可能会遇到服务器返回 404 状态码时,请求会长时间未响应的问题。这种情况通常发生在使用第三方库(如 axios、request 等)发起请求时。假如我们使用 axios 库来发送请求…

    node js 2023年6月8日
    00
  • 利用forever和pm2部署node.js项目过程

    下面是详细的“利用forever和pm2部署node.js项目过程”的攻略。 概述 在使用Node.js开发Web项目时,我们需要将我们的Node.js应用程序部署到服务器上,然后运行该程序。常用的Node.js应用程序部署工具有forever和pm2。 无论你选择哪个工具,它们都能够确保你的Node.js应用程序在服务器上长时间稳定的运行。同时,它们还可以…

    node js 2023年6月8日
    00
  • Node.js 回调函数实例详解

    下面我将为你讲解Node.js回调函数的实例详解攻略。整个攻略将分为以下几个部分: Node.js回调函数的概念和作用 回调函数的常见用法 回调函数的实例应用及示例代码 回调函数的应用注意事项 总结 1. Node.js回调函数的概念和作用 回调函数是Node.js中一个非常重要的概念。在Node.js中,回调函数通常是异步函数的最后一个参数,用于处理异步操…

    node js 2023年6月8日
    00
  • vue-cli构建vue项目的步骤详解

    下面我就为您详细讲解“vue-cli构建vue项目的步骤详解”的攻略。 步骤一:安装Node.js 要安装Vue CLI,首先需要安装Node.js。可以从官方网站 https://nodejs.org/zh-cn/ 上下载安装。 步骤二:安装Vue CLI 使用npm全局安装Vue CLI: npm install -g @vue/cli 如果您已经安装了…

    node js 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部