Node.js实现爬取网站图片的示例代码
涉及知识点
开发一个小爬虫,涉及的知识点如下所示:
- https模块,主要是用户获取网络资源,如:网页源码,图片资源等。
- cheerio模块,主要用于解析html源码,并可访问,查找html节点内容。
- fs模块,主要用于文件的读写操作,如保存图片,日志等。
- 闭包,主要是对于异步操作,对象的隔离保护。
cheerio简介
什么是cheerio ?
cheerio是为服务器特别定制的,快速、灵活、实施的jQuery核心实现。主要用于在服务端解析html。特点如下所示:
- 易用,语法类似jQuery语法,从jQuery库中去除了所有 DOM不一致性和浏览器尴尬的部分。
- 解析快,比JSDOM快八倍。
- 灵活,Cheerio 封装了兼容的htmlparser。Cheerio 几乎能够解析任何的 HTML 和 XML document。
安装cheerio
首先在命令行,切换到程序目录,然后输入安装命令进行安装,如下所示:
cnpm install cheerio
安装过程,如下所示:
准备工作
在编写爬虫之前,首先需要分析目标内容,本次需要爬取的是某网站,星空类型的图片内容,经过分析,发现所有的图片都是在ul下每一个li中的a标签内的img中,本次只需要解析出img的src属性,即可获取图片的下载路径。如下所示:
核心代码
经过以上分析,通过Node.js编写代码,分为两步,获取所有图片的url路径,即解析所有目标img元素的src属性。然后再下载具体图片进行保存即可。
引用所需要的功能模块,如下所示:
var https = require('https'); var cheerio = require('cheerio'); var fs = require('fs');
获取并解析html页面内容,如下所示:
//爬取的网址 var addrs=['https://www.*****.com/topic/show_27202_1.html','https://www.******.com/topic/show_27202_2.html','https://www.*****.com/topic/show_27202_3.html']; var logger = fs.createWriteStream('./download/log.txt',{flags:'a+',autoClose:'true'}); for(i in addrs){ (function(num){ var addr = addrs[num]; //创建目录 var p1 = new Promise(function(resolve,reject){ fs.access('./download',function(err){ if(err){ fs.mkdir('./download',function(e){ if(e){ console.log('创建失败'); } }); }else{ resolve("success"); } }); }); p1.then(function(datas){ var html=''; var p2 = new Promise(function(resolve,reject){ https.get(addr,function(res){ res.on('data',function(data){ html+=data.toString(); }) res.on('end',function(){ resolve("success"); }); }); }); p2.then(function(data){ //下载完成后,进行解析 const $ =cheerio.load(html); var lis = $('#img-list-outer').find('li'); for(var j=0;j<lis.length-1;j++){ var li = lis[j]; var src =$(li).find('a').find('img').attr('src'); //console.log(src); //console.log('-------------------------'); var imgurl='https:'+src; download(imgurl); var msg='['+j+']下载成功:'+imgurl; logger.write(msg+'\n'); console.log(msg); } }); }); })(i); }
注意:因为所有爬取的目标共分为3页,所以用到了循环,并且在循环中用到了闭包。
下载并保存单张图片代码,如下所示:
//下载图片 function download(imgurl){ var p1 = new Promise(function(resolve,reject){ https.get(imgurl,function(res){ var imgName=imgurl.substr(imgurl.lastIndexOf('/')+1); var stream = fs.createWriteStream('./download/'+imgName); res.pipe(stream); setTimeout(function(){ resolve('success'); },300); }); }); p1.then(function(data){ return; }); }
示例截图
开发完成后,运行代码,如下所示
爬取的图片,保存在文件夹中,如下所示:
注意:添加日志,是为了方便记录程序执行过程,对比图片和日志,便于发现问题。
到此这篇关于Node.js实现爬取网站图片的示例代码的文章就介绍到这了,更多相关Node.js爬取图片内容请搜索猪先飞以前的文章或继续浏览下面的相关文章希望大家以后多多支持猪先飞!
原文出处:https://www.cnblogs.com/hsiang/p/16084270.html
相关文章
使用PHP+JavaScript将HTML页面转换为图片的实例分享
这篇文章主要介绍了使用PHP+JavaScript将HTML元素转换为图片的实例分享,文后结果的截图只能体现出替换的字体,也不能说将静态页面转为图片可以加快加载,只是这种做法比较interesting XD需要的朋友可以参考下...2016-04-19- 这篇文章主要介绍了C#从数据库读取图片并保存的方法,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下...2021-01-16
- 今天小编在这里就来给各位Photoshop的这一款软件的使用者们来说说把古装美女图片转为细腻的工笔画效果的制作教程,各位想知道方法的使用者们,那么下面就快来跟着小编一...2016-09-14
- 这篇文章主要介绍了Python 图片转数组,二进制互转操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-09
- php如何实现抓取网页图片,相较于手动的粘贴复制,使用小程序要方便快捷多了,喜欢编程的人总会喜欢制作一些简单有用的小软件,最近就参考了网上一个php抓取图片代码,封装了一个php远程抓取图片的类,测试了一下,效果还不错分享...2015-10-30
- 获取网站icon,常用最简单的方法就是通过website/favicon.ico来获取,不过由于很多网站都是在页面里面设置favicon,所以此方法很多情况都不可用。 更好的办法是通过google提供的服务来实现:http://www.google.com/s2/favi...2014-06-07
jquery左右滚动焦点图banner图片鼠标经过显示上下页按钮
jquery左右滚动焦点图banner图片鼠标经过显示上下页按钮...2013-10-13- 下面小编就为大家带来一篇利用JS实现点击按钮后图片自动切换的简单方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2016-10-25
- Photoshop的这一款软件小编相信很多的人都已经是使用过了吧,那么今天小编在这里就给大家带来了用Photoshop软件制作枪战电影海报的教程,想知道制作步骤的玩家们,那么下面...2016-09-14
- 这篇文章主要为大家详细介绍了js实现上传图片及时预览的相关资料,具有一定的参考价值,感兴趣的朋友可以参考一下...2016-05-09
- 图片剪裁是常用的方法,那么如何通过4坐标剪裁图片,本文就详细的来介绍一下,感兴趣的小伙伴们可以参考一下...2021-06-04
- 这次文章要给大家介绍的是node.JS md5加密中文与php结果不一致怎么办,不知道具体解决办法的下面跟小编一起来看看。 因项目需要,需要Node.js与PHP做接口调用,发现nod...2017-07-06
mac下Apache + MySql + PHP搭建网站开发环境
首先为什不自己分别搭建Apache,PHP和MySql的环境呢?这样自己可以了解更多知识,说起来也更酷。可也许因为我懒吧,我是那种“既然有现成的,用就是了”的人。君子生非异也,善假于物也。两千年前的荀子就教导我们,要善于利用工具...2014-06-07- 共享一段使用PHP下载CSS文件中的图片的代码 复制代码 代码如下: <?php //note 设置PHP超时时间 set_time_limit(0); //note 取得样式文件内容 $styleFileContent = file_get_contents('images/style.css'); //not...2013-10-04
- 1.什么是异步编程? 异步编程是指由于异步I/O等因素,无法同步获得执行结果时, 在回调函数中进行下一步操作的代码编写风格,常见的如setTimeout函数、ajax请求等等。示例: for (var i = 1; i <= 3; i++) {setTimeout(functi...2015-10-23
- PHP代码如下:复制代码 代码如下:if (isset($_FILES["Filedata"]) || !is_uploaded_file($_FILES["Filedata"]["tmp_name"]) || $_FILES["Filedata"]["error"] != 0) { $upload_file = $_FILES['Filedata']; $fil...2013-10-04
- 这篇文章主要给大家介绍了关于微信小程序如何获取图片宽度与高度的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-10
- 本文介绍基于nodejs+express+art-template的留言板功能。包含列表界面、添加界面和发送留言功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-21
C#中图片旋转和翻转(RotateFlipType)用法分析
这篇文章主要介绍了C#中图片旋转和翻转(RotateFlipType)用法,实例分析了C#图片旋转及翻转Image.RotateFlip方法属性的常用设置技巧,需要的朋友可以参考下...2020-06-25- 使用require('crypto')调用加密模块。加密模块需要底层系统提供OpenSSL的支持。它提供了一种安全凭证的封装方式,可以用于HTTPS安全网络以及普通HTTP连接。该模块还提供了一套针对OpenSSL的hash(哈希),hmac(密钥哈希),cipher...2014-06-07