node 的使用很是普遍,能够作通讯,作爬虫,甚至能够作桌面应用程序。node
今天就利用闲暇时间写个小小的分享:利用 node 爬取百度图片首页的图片。shell
对,就是中间那几张:npm
首先新建一个文件夹,名字随便取,只要不是中文就行,而后在命令行中初始化一下:数组
npm init -y
新建一个名为 app.js 的文件app
在这个文件里,咱们须要引入一些模块:dom
var http=require('http'); var https=require('https') var fs=require('fs'); var cheerio=require('cheerio');
cheerio 模块是第三方模块,须要进行安装:ui
npm install cheerio --save
接下来,须要解析百度图片的首页:url
var wz='http://images.baidu.com/'; var strHtml=''; http.get(wz,(res)=>{ res.on('data',(chunk)=>{ strHtml+=chunk; }); console.log(strHtml) })
在命令行输入 node app.js 运行,会在命令行看到网页的源代码。这样网页就解析完了。spa
接下来咱们须要获取首页中间的十张图片。命令行
要获取图片,就必须知道图片的 url 地址,在这个网页上,图片的url地址在 img_single_box 下的 img 标签里。
咱们以前引用了一个名为 cheerio 的第三方模块,这个库是一个 jQuery 的模块,能够在服务端写 jQuery
在上面的代码示例中,咱们已经获取到了网页源代码,接下来就要找到咱们须要的 url 地址了:
http.get(wz,(res)=>{ res.on('data',(chunk)=>{ ··· }); res.on('end',()=>{ var $=cheerio.load(strHtml); //创建一个空数组,用来放咱们取得的url地址 var imgdata=[]; $('.img_single_box img').each((index,item)=>{ imgdata.push($(item).attr('src')) }); console.log(imgdata) }) })
运行咱们写的文件,你将会看到咱们须要的url地址已经存进去了。
如今就利用这几个url地址来保存图片了
http.get(wz,(res)=>{ res.on('data',(chunk)=>{ ··· }); res.on('end',()=>{ ··· function saveImage(imgdata){ https.get(imgdata,(res)=>{ res.setEncoding('binary');//二进制文件 var data=''; res.on('data',(a)=>{ data+=a; }).on('end',()=>{ if(!fs.existsSync('./images')){ fs.mkdirSync('./images'); }; fs.writeFile('images/'+Math.random()+'.png',data,'binary',(err)=>{ if(!err) console.log('成功') }) }) }); } for(var i=0;i<imgdata.length;i++){ saveImage(imgdata[i]); } }) })
到这里就写完了,在命令行 node app.js ,是否是在 images 文件夹下有了10张图片呢?