首先介绍一下爬虫所需要的的包
require(“request”); –get post请求页面
require(“cheerio”) –解析文本对象为DOM对象 也就是说将string 装换为 js操作的 $() 这种选择器
require(‘fs’); – 保存文件到本地
require(“async”) –流程控制 主要是控制抓取时间间隔
require(‘mkdirp’); –创建文件夹
require(‘iconv-lite’); GBK UTF-8 转码
require(‘url’) –解析url成各种对象
require(‘path’); –处理文件路径

接下来是抓取图片的流程了

首先定义配置
var options = {uri: 'http://www.xxxxxx.com/',dir: './output/', //保存目录downLimit: 2//图片并行下载上限
}然后主程序检测图片下载完事件
/*** 开始下载(程序入口函数)*/
function start() {
//url地址 如果是的url是规律的分页 可以看我另外一个[爬斗鱼虎牙主播](http://blog.csdn.net/q3585914/article/details/72058261)var opts = [// 'htm_data/7/1705/2423174.html','htm_data/7/1705/2402955.html','htm_data/7/1705/2385537.html','htm_data/7/1705/2382263.html'];//串行抓取页面,就是一个一个抓,async.forEachSeries(opts, function(opt, callback) {//抓当个页面parsePage(options.uri +opt, (err) => {callback()});},function (err) {if (err) {console.log('error: %s'.error, err.message);} else {console.log('success: 下载完毕'.info);}});}
//抓单个页面
function parsePage(url, callback) {request({url: url, encoding: null}, function (error, response, body) {if (!error && response.statusCode == 200) {//由于页面是GBK 所以使用模块iconv来转码var str = iconv.decode(body, 'gbk');//将字符串装换为DOMvar $ = cheerio.load(str);var links = [];//分析图片url,由于使用了cheerio模块所以跟页面js一样分析$(".do_not_catch .do_not_catch").find("img").each(function () {var src = $(this).attr('src');links.push(src);});// 创建目录var title = $("title").text()var newdir =options.dir+title.trim().replace(" - 技術討論區", "");//创建目录,一个页面,一个目录mkdir(newdir);//下载图片downImages(newdir,links,callback)}});}/*** 创建目录*/
function mkdir(title) {console.log('准备创建目录:%s', title);if (fs.existsSync(title)) {console.log('目录:%s 已经存在'.error, title);}else {mkdirp(title, function (err) {console.log('title目录:%s 创建成功'.info, title);});}
}/*** 下载图片列表中的图片*/
function downImages(dir,links, callback) {console.log('发现%d张图片,准备开始下载...', links.length);//eachLimits 控制下载图片并行上限 第二个参数 options.downLimit 就是配置async.eachLimit(links, options.downLimit,function (imgsrc,cb) {var url = urldm.parse(imgsrc);//获取url最后的名字var fileName = path.basename(url.pathname);//去掉/var toPath = path.join(dir, fileName);console.log('开始下载图片:%s,保存到:%s', fileName, dir);
//这个地方要详细说了request(encodeURI(imgsrc)).on('error', function(err) {cb();}).pipe(fs.createWriteStream(toPath)).on('finish',()=>{console.log('图片下载成功:%s', imgsrc);cb();})}, callback);}

下载图片可以使用

request('http://google.com/doodle.png').pipe(fs.createWriteStream('doodle.png'))

但是如果图片下载和保存出错就会导出程序报错终止,所以需要加一个事件来控制
就是来监听error,他可以解决你保存时候出错问题 cb()就是回调跳过
这哥可以解决批量下载图片时候出现的异常

request(encodeURI(imgsrc)).on('error', function(err) {cb();}).pipe(fs.createWriteStream(toPath)).on('finish',()=>{console.log('图片下载成功:%s', imgsrc);cb();})

欢迎加群一起交流哦!
315552185

node.js爬虫之下载图片,批量下载图片,控制下载图片并行上限相关推荐

  1. Node.js aitaotu图片批量下载Node.js爬虫1.00版

    即使是https网页,解析的方式也不是一致的,需要多试试. 代码: //====================================================== // aitaot ...

  2. Node.js umei图片批量下载Node.js爬虫1.00

    这个爬虫在abaike爬虫的基础上改改图片路径和下一页路径就出来了,代码如下: //====================================================== // ...

  3. node.js 爬虫 实现爬取网页图片并保存到本地

    node.js 爬虫 实现爬取网页图片并保存到本地 没有废话直接看代码 /*** 请求网站数据* 将数据保存本地文件*/ //不同协议引用不同模块,http https const http = re ...

  4. 如何用 Node.js 爬虫?

    本文来自作者 小北 在 GitChat 上分享「Node.js 爬虫从 0 到 1」,「阅读原文」查看交流实录 「文末高能」 编辑 | 家辉 写在前面 我们经常会听说爬虫这个词语,但是却从来没有见过这 ...

  5. node.js 爬虫入门总结

    node.js爬虫 前端同学可能向来对爬虫不是很感冒,觉得爬虫需要用偏后端的语言,诸如 php , python 等.当然这是在 nodejs 前了,nodejs 的出现,使得 Javascript ...

  6. java爬虫拉勾网_[Java教程]node.js爬虫爬取拉勾网职位信息

    [Java教程]node.js爬虫爬取拉勾网职位信息 0 2017-03-14 00:00:21 简介 用node.js写了一个简单的小爬虫,用来爬取拉勾网上的招聘信息,共爬取了北京.上海.广州.深圳 ...

  7. Node.js 爬虫爬取电影信息

    Node.js 爬虫爬取电影信息 本文地址:https://blog.csdn.net/weixin_45580251/article/details/107669713 爬取的是1905电影网的信息 ...

  8. Node.js爬虫一站到底系列先导篇

    前言: 在web编程课上,老师布置了爬虫任务,而没有任何经验和相关方面知识的小白简直一头雾水,不知道该如何下手.一开始抱着一本厚厚的犀牛书啃了好几天,本以为对Javascipt语法有一定了解后便可以自 ...

  9. 图片批量黑白处理,将彩色图片变成黑白

    工作中我们通常喜欢使用Photoshop来修改或处理图片,比如修改图片的大小,将图片美化等.它是目前使用最为广泛的图片处理工具,但是使用起来也比较麻烦,没用过的小伙伴通常需要花费很长的时间去学习使用技 ...

最新文章

  1. Puppet扩展篇1-自定义fact结合ENC(hirea)的应用实践
  2. TableLayout(表格布局)
  3. lambda expressions are not supported at this language level
  4. Reveal:分析iOS UI该武器
  5. 有关软件开发中的一些想法
  6. boost::reverse_graph用法的测试程序
  7. C++将带ui界面的qt工程封装为动态库dll
  8. 入职体检——项目列表(12项)
  9. WordPress主题modown6.2+erphpdown11.7
  10. xshell6左侧导航显示_【iOS12人机交互指南】7.1-导航栏
  11. MySQL 瓶颈分析及优化
  12. 比较两个listString是否相等
  13. SpiderData 2019年2月4日 DApp数据排行榜
  14. WCF中的REST是什么
  15. Nuget私有服务搭建实战
  16. c语言side输出空心正方形,回溯法--正方形(蛋糕切分)问题
  17. 华成英-模拟电子技术P9 静态工作点的稳定 笔记
  18. Golang map有序化
  19. html策略类文字游戏,中国唯一 一款运营超20年的网游竟然是款纯文字游戏
  20. 计算机ABC分类法的步骤,ABC分类法的具体步骤

热门文章

  1. Python中常见的添加IP代理简单介绍
  2. vant 索引城市不对_vue,vant,使用过程中 Swipe 轮播自定义大小遇到的坑
  3. 科研工具--HistCite
  4. 字符串倒序输出的五种方法
  5. 计算机和运筹学杂志,请问运筹学和管理学的顶级期刊有哪些?能否介绍一些这些期刊的级别和投稿经验?...
  6. 迷失lost结局什么意思_迷失电视剧《迷失》最终的结局是什么样的?描 – 手机爱问...
  7. CentOS7安装Chrome实现命令行截屏功能
  8. React Native自定义导航栏
  9. azure云服务使用方法_使用Azure认知服务自动执行表单处理
  10. Java+spring 基于ssm的社区流浪猫狗动物救助网站#毕业设计