node.js爬虫之下载图片,批量下载图片,控制下载图片并行上限
首先介绍一下爬虫所需要的的包
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爬虫之下载图片,批量下载图片,控制下载图片并行上限相关推荐
- Node.js aitaotu图片批量下载Node.js爬虫1.00版
即使是https网页,解析的方式也不是一致的,需要多试试. 代码: //====================================================== // aitaot ...
- Node.js umei图片批量下载Node.js爬虫1.00
这个爬虫在abaike爬虫的基础上改改图片路径和下一页路径就出来了,代码如下: //====================================================== // ...
- node.js 爬虫 实现爬取网页图片并保存到本地
node.js 爬虫 实现爬取网页图片并保存到本地 没有废话直接看代码 /*** 请求网站数据* 将数据保存本地文件*/ //不同协议引用不同模块,http https const http = re ...
- 如何用 Node.js 爬虫?
本文来自作者 小北 在 GitChat 上分享「Node.js 爬虫从 0 到 1」,「阅读原文」查看交流实录 「文末高能」 编辑 | 家辉 写在前面 我们经常会听说爬虫这个词语,但是却从来没有见过这 ...
- node.js 爬虫入门总结
node.js爬虫 前端同学可能向来对爬虫不是很感冒,觉得爬虫需要用偏后端的语言,诸如 php , python 等.当然这是在 nodejs 前了,nodejs 的出现,使得 Javascript ...
- java爬虫拉勾网_[Java教程]node.js爬虫爬取拉勾网职位信息
[Java教程]node.js爬虫爬取拉勾网职位信息 0 2017-03-14 00:00:21 简介 用node.js写了一个简单的小爬虫,用来爬取拉勾网上的招聘信息,共爬取了北京.上海.广州.深圳 ...
- Node.js 爬虫爬取电影信息
Node.js 爬虫爬取电影信息 本文地址:https://blog.csdn.net/weixin_45580251/article/details/107669713 爬取的是1905电影网的信息 ...
- Node.js爬虫一站到底系列先导篇
前言: 在web编程课上,老师布置了爬虫任务,而没有任何经验和相关方面知识的小白简直一头雾水,不知道该如何下手.一开始抱着一本厚厚的犀牛书啃了好几天,本以为对Javascipt语法有一定了解后便可以自 ...
- 图片批量黑白处理,将彩色图片变成黑白
工作中我们通常喜欢使用Photoshop来修改或处理图片,比如修改图片的大小,将图片美化等.它是目前使用最为广泛的图片处理工具,但是使用起来也比较麻烦,没用过的小伙伴通常需要花费很长的时间去学习使用技 ...
最新文章
- Puppet扩展篇1-自定义fact结合ENC(hirea)的应用实践
- TableLayout(表格布局)
- lambda expressions are not supported at this language level
- Reveal:分析iOS UI该武器
- 有关软件开发中的一些想法
- boost::reverse_graph用法的测试程序
- C++将带ui界面的qt工程封装为动态库dll
- 入职体检——项目列表(12项)
- WordPress主题modown6.2+erphpdown11.7
- xshell6左侧导航显示_【iOS12人机交互指南】7.1-导航栏
- MySQL 瓶颈分析及优化
- 比较两个listString是否相等
- SpiderData 2019年2月4日 DApp数据排行榜
- WCF中的REST是什么
- Nuget私有服务搭建实战
- c语言side输出空心正方形,回溯法--正方形(蛋糕切分)问题
- 华成英-模拟电子技术P9 静态工作点的稳定 笔记
- Golang map有序化
- html策略类文字游戏,中国唯一 一款运营超20年的网游竟然是款纯文字游戏
- 计算机ABC分类法的步骤,ABC分类法的具体步骤
热门文章
- Python中常见的添加IP代理简单介绍
- vant 索引城市不对_vue,vant,使用过程中 Swipe 轮播自定义大小遇到的坑
- 科研工具--HistCite
- 字符串倒序输出的五种方法
- 计算机和运筹学杂志,请问运筹学和管理学的顶级期刊有哪些?能否介绍一些这些期刊的级别和投稿经验?...
- 迷失lost结局什么意思_迷失电视剧《迷失》最终的结局是什么样的?描 – 手机爱问...
- CentOS7安装Chrome实现命令行截屏功能
- React Native自定义导航栏
- azure云服务使用方法_使用Azure认知服务自动执行表单处理
- Java+spring 基于ssm的社区流浪猫狗动物救助网站#毕业设计