经过前面五天的学习 ,对Node.js开发已经逐渐入门 ,今天结合之前学到的东西,开发一个小示例【爬取某图片网站的图片】 ,仅供学习分享使用 ,如有不足之处 ,还请指正 。
涉及知识点
开发一个小爬虫 ,涉及的知识点如下所示:
https模块 ,主要是用户获取网络资源 ,如:网页源码 ,图片资源等 。
cheerio模块 ,主要用于解析html源码 ,并可访问,查找html节点内容 。
fs模块 ,主要用于文件的读写操作 ,如
保存图片,日志等 。
闭包 ,主要是对于异步操作 ,对象的隔离保护 。
cheerio简介
什么是cheerio ?
cheerio是为服务器特别定制的,快速 、灵活 、实施的jQuery核心实现 。主要用于在服务端解析html 。特点如下所示:
易用 ,语法类似jQuery语法 ,从jQuery库中去除了所有 DOM不一致性和浏览器尴尬的部分 。
解析快 ,比JSDOM快八倍 。
灵活 ,Cheerio 封装了兼容的htmlparser。Cheerio 几乎能够解析任何的 HTML 和 XML document 。
安装cheerio
首先在命令行 ,切换到程序目录 ,然后输入安装命令进行安装 ,如下所示:
安装过程 ,如下所示:
准备工作
在编写爬虫之前 ,首先需要分析目标内容,本次需要爬取的是某网站 ,星空类型的图片内容 ,经过分析,发现所有的图片都是在ul下每一个li中的a标签内的img中 ,本次只需要解析出img的src属性 ,即可获取图片的下载路径 。如下所示:
核心代码
经过以上分析,通过Node.js编写代码 ,分为两步 ,获取所有图片的url路径 ,即解析所有目标img元素的src属性。然后再下载具体图片进行保存即可 。
引用所需要的功能模块 ,如下所示:
1 var https = require(https);
2 var cheerio = require(cheerio);
3 var fs = require(fs);
获取并解析html页面内容 ,如下所示:
1 //爬取的网址
2 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];
3 var logger = fs.createWriteStream(./download/log.txt,{flags:a+,autoClose:true});
4
5 for(i in addrs){
6 (function(num){
7 var addr = addrs[num];
8 //创建目录
9 var p1 = new Promise(function(resolve,reject){
10 fs.access(./download,function(err){
11 if(err){
12 fs.mkdir(./download,function(e){
13 if(e){
14 console.log(创建失败);
15 }
16 });
17 }else{
18 resolve("success");
19 }
20 });
21 });
22
23 p1.then(function(datas){
24 var html=;
25 var p2 = new Promise(function(resolve,reject){
26 https.get(addr,function(res){
27 res.on(data,function(data){
28 html+=data.toString();
29 })
30 res.on(end,function(){
31 resolve("success");
32 });
33
34 });
35
36 });
37 p2.then(function(data){
38 //下载完成后 ,进行解析
39 const $ =cheerio.load(html);
40 var lis = $(#img-list-outer).find(li);
41 for(var j=0;j<lis.length-1;j++){
42 var li = lis[j];
43 var src =$(li).find(a).find(img).attr(src);
44 //console.log(src);
45 //console.log(-------------------------);
46 var imgurl=https:+src;
47 download(imgurl);
48 var msg=[+j+]下载成功:+imgurl;
49 logger.write(msg+\n);
50 console.log(msg);
51 }
52 });
53 });
54 })(i);
55 }
注意:因为所有爬取的目标共分为3页 ,所以用到了循环 ,并且在循环中用到了闭包 。
下载并保存单张图片代码 ,如下所示:
1 //下载图片
2 function download(imgurl){
3 var p1 = new Promise(function(resolve,reject){
4 https.get(imgurl,function(res){
5 var imgName=imgurl.substr(imgurl.lastIndexOf(/)+1);
6 var stream = fs.createWriteStream(./download/+imgName);
7 res.pipe(stream);
8 setTimeout(function(){
9 resolve(success);
10 },300);
11
12 });
13 });
14 p1.then(function(data){
15 return;
16 });
17 }
示例截图
开发完成后,运行代码 ,如下所示:
爬取的图片 ,保存在文件夹中,如下所示:
注意:添加日志 ,是为了方便记录程序执行过程 ,对比图片和日志,便于发现问题。
备注
学而时习之 ,不亦说乎?有朋自远方来 ,不亦乐乎?人不知而不愠 ,不亦君子乎?
声明:本站所有文章 ,如无特殊说明或标注 ,均为本站原创发布 。任何个人或组织 ,在未征得本站同意时 ,禁止复制 、盗用 、采集 、发布本站内容到任何网站 、书籍等各类媒体平台 。如若本站内容侵犯了原著者的合法权益 ,可联系我们进行处理 。