nodejs批量下载图片的实现方法

发布时间 - 2026-01-11 01:10:47    点击率:

今天想获取一大批猫的图片,然后就在360流浪器搜索框中输入猫,然后点击图片。就看到了一大波猫的图片:http://image.so.com/i?q=%E7%8...,我在想啊,要是审查元素,一张张手动下载,多麻烦,所以打算写程序来实现。不写不知道,一写发现里面还是有很多道道的。

1. 爬取图片链接

因为之前也写过nodejs爬虫功能,所以觉得应该很简单,就用cheerio来处理dom啦,结果打印一下啥也没有,后来查看源代码:

发现waterfall_zoom里面空空如也,查找了一下,发现所有的数据都是写在<script>里面,然后动态加载到页面的,所以用cheerio.load到的页面里面其实没数据的。真实数据:

分析完毕,刷刷写代码:

var request = require('request');
var cheerio = require('cheerio');
var url = 'http://image.so.com/i?q=%E7%8C%AB&src=tab_www';

request(url,function(err,res,body){
  if(!err && res.statusCode === 200){
    var $ = cheerio.load(body);
    var imgList = []
    JSON.parse($('script[id="initData"]').html()).list.forEach(function(item){
      imgList.push(item.img)
    });
    console.log(imgList);
  }
});

2. 下载图片到本地

2.1 粗糙的方案

最初的思路很简单,简单的fs.createWriteStream()就能解决:

var downloadPic = function(src, dest){
  request(src).pipe(fs.createWriteStream(dest)).on('close',function(){
    console.log('pic saved!')
  })
}

使用方式:

downloadPic(imgList[0],'./catpics/1.jpg');

 

成功捕获一只猫!然后写了一个循环准备捕获所有猫。然而这种方式是串行的,速度很慢!下载一大批图片要花大量时间。

2.2 使用async异步批量下载

关于async的map操作,详见:async_demo/map.js,对集合中的每一个元素,执行某个异步操作,得到结果。所有的结果将汇总到最终的callback里。与forEach的区别是,forEach只关心操作不管最后的值,而map关心的最后产生的值。

提供了两种方式:

  1. 并行执行。async.map同时对集合中所有元素进行操作,结果汇总到最终callback里。如果出错,则立刻返回错误以及已经执行完的任务的结果,未执行完的占个空位
  2. 顺序执行。async.mapSeries对集合中的元素一个一个执行操作,结果汇总到最终callback里。如果出错,则立刻返回错误以及已经执行完的结果,未执行的被忽略。

在此处:

async.mapSeries(imgList,function(item, callback){
  setTimeout(function(){
    downloadPic(item, './catpics/'+ (new Date()).getTime() +'.jpg');
    callback(null, item);
  },400);
}, function(err, results){});

注:此处使用setTimeout,是因为下载需要一定时间,在笔者较慢网速下,需要400ms的间隔能确保每张图片下载完全。

 

成功捕获一批猫猫!

2.3 使用bagpipe批量

bagpipe是朴灵大大做的一个在nodejs中控制并发执行的模块。其安装和使用也比较简单:

npm install bagpipe --save

使用:

var Bagpipe = require('bagpipe');

var bagpipe = new Bagpipe(10);
var files = ['这里有很多很多文件'];
for(vari =0; i < files.length; i++){
  bagpipe.push(fs.readFile, files[i], 'utf-8',function(err, data){
    ...
  });
}

在此处:

var bagpipe = new Bagpipe(10,{timeout: 100});
for(var i = 0; i < imgList.length; i++) {
  console.log('i:'+i)
  bagpipe.push(downloadPic, imgList[i], './catpics/'+ i +'.jpg', function(err, data){
    //
   });
}

3.总结

作为一个程序员,能用程序解决就不手动解决。每一次尝都会有新的收获。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# nodejs批量下载图片  # nodejs  # 批量下载文件  # 下载图片  # nodejs制作爬虫实现批量下载图片  # node.js读取Excel数据(下载图片)的方法示例  # 详解node.js 下载图片的 2 种方式  # angular.js+node.js实现下载图片处理详解  # 利用Node.js批量抓取高清妹子图片实例教程  # Node.js批量给图片加水印的方法  # Node.js读写文件之批量替换图片的实现方法  # 用Node.js通过sitemap.xml批量抓取美女图片  # Node.js实现批量下载图片简单操作示例  # 有很多  # 很简单  # 大波  # 都是  # 会有  # 是因为  # 我在  # 就在  # 就能  # 就不  # 两种  # 空空如也  # 找了  # 写了  # 作为一个  # 就看  # 就用  # 来实现  # 写在  # 要花 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?  如何做网站制作流程,*游戏网站怎么搭建?  Android滚轮选择时间控件使用详解  免费视频制作网站,更新又快又好的免费电影网站?  HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】  Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤  LinuxCD持续部署教程_自动发布与回滚机制  韩国服务器如何优化跨境访问实现高效连接?  如何快速搭建高效服务器建站系统?  Laravel怎么配置自定义表前缀_Laravel数据库迁移与Eloquent表名映射【步骤】  安克发布新款氮化镓充电宝:体积缩小 30%,支持 200W 输出  Laravel N+1查询问题如何解决_Eloquent预加载(Eager Loading)优化数据库查询  Laravel如何实现数据导出到CSV文件_Laravel原生流式输出大数据量CSV【方案】  Python结构化数据采集_字段抽取解析【教程】  活动邀请函制作网站有哪些,活动邀请函文案?  如何在VPS电脑上快速搭建网站?  Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】  edge浏览器无法安装扩展 edge浏览器插件安装失败【解决方法】  高端云建站费用究竟需要多少预算?  使用PHP下载CSS文件中的所有图片【几行代码即可实现】  php打包exe后无法访问网络共享_共享权限设置方法【教程】  如何使用 Go 正则表达式精准提取括号内首个纯字母标识符(忽略数字与嵌套)  Laravel怎么做缓存_Laravel Cache系统提升应用速度的策略与技巧  Win11怎么恢复误删照片_Win11数据恢复工具使用【推荐】  如何利用DOS批处理实现定时关机操作详解  怎么用AI帮你设计一套个性化的手机App图标?  作用域操作符会触发自动加载吗_php类自动加载机制与::调用【教程】  如何基于云服务器快速搭建网站及云盘系统?  laravel怎么为应用开启和关闭维护模式_laravel应用维护模式开启与关闭方法  如何在橙子建站中快速调整背景颜色?  焦点电影公司作品,电影焦点结局是什么?  如何在阿里云虚拟服务器快速搭建网站?  如何快速查询域名建站关键信息?  PHP怎么接收前端传的文件路径_处理文件路径参数接收方法【汇总】  如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?  nodejs redis 发布订阅机制封装实现方法及实例代码  做企业网站制作流程,企业网站制作基本流程有哪些?  Java类加载基本过程详细介绍  Laravel如何使用Socialite实现第三方登录?(微信/GitHub示例)  Laravel如何使用Gate和Policy进行权限控制_Laravel权限判定与策略规则配置  如何快速生成ASP一键建站模板并优化安全性?  Laravel如何记录自定义日志?(Log频道配置)  通义万相免费版怎么用_通义万相免费版使用方法详细指南【教程】  Laravel策略(Policy)如何控制权限_Laravel Gates与Policies实现用户授权  如何在Windows虚拟主机上快速搭建网站?  Laravel如何设置定时任务(Cron Job)_Laravel调度器与任务计划配置  消息称 OpenAI 正研发的神秘硬件设备或为智能笔,富士康代工  微信推文制作网站有哪些,怎么做微信推文,急?  如何制作一个表白网站视频,关于勇敢表白的小标题?  如何在阿里云域名上完成建站全流程?