打开上一篇下载的xiaohua.html文件发现,我们把所有代码原封不动的都下载下来了,甚至连校花网的广告都没放过,但是图片因为校花网用的是相对路径而不能正常显示的情况。而我们需要的仅仅是学妹的资料跟图片就可以了。那我们怎么从这些代码中筛选这些内容呢?
我第一时间想到的是利用正则,因为之前用php采集的时候都用的是正则筛选,后来发现cheerio模块这个大利器,他可以让我们通过仿jquery的方式来筛选数据,这对我们前端来说简直就是福音啊。
来,上代码:
var http = require("http"); var cheerio = require("cheerio"); var iconv = require('iconv-lite'); var fs = require("fs"); var BufferHelper = require('bufferhelper'); var url = 'http://www.xiaohuar.com/news-1-1722.html'; http.get(url, function (res) { var bufferHelper = new BufferHelper(); res.on('data', function (chunk) { bufferHelper.concat(chunk); }).on('end', function () { var val = iconv.decode(bufferHelper.toBuffer(), 'gb2312'); var $ = cheerio.load(val, {decodeEntities: false});//decodeEntities: false 避免乱码 console.log($('title').html());//北京联合大学校花惠婉乔资料照片-校花网 }); }).on('error', function (e) { console.log('Got error:' + e.message); });
是不是很畅快!
好,我们来上完整的代码,只取出学妹的信息跟靓照并保存:
var http = require("http"); var cheerio = require("cheerio"); var iconv = require('iconv-lite'); var fs = require("fs"); var BufferHelper = require('bufferhelper'); var url = 'http://www.xiaohuar.com/news-1-1722.html'; http.get(url, function (res) { var bufferHelper = new BufferHelper(); res.on('data', function (chunk) { bufferHelper.concat(chunk); }).on('end', function () { var val = iconv.decode(bufferHelper.toBuffer(), 'gb2312');//将获取到的数据由gb2312编码转成utf8编码 var $ = cheerio.load(val, {decodeEntities: false});//decodeEntities: false 避免乱码 var title = "<div id='title'>" + $(".wrap h1").html() + "</div>";//获取标题 var contentObj = $(".content_wrap");//获取内容 contentObj.find(".gg4,a").remove();//移除内容中的广告代码 contentObj.find("p,img,span").each(function () {//移除不必要的标签属性,使代码更简洁 $(this).removeAttr("class"); $(this).removeAttr("style"); $(this).removeAttr("alt"); $(this).removeAttr("title"); $(this).removeAttr("id"); }); var contentHtml = contentObj.html();//获取处理后的内容代码 contentHtml = contentHtml.replace(/<span>/g, '');//从最新的内容代码中再移除span标签,使代码再简洁一些 contentHtml = contentHtml.replace(/<\/span>/g, '');//同上 contentHtml=contentHtml.replace(/src="\/d\/file/g, 'src="http://www.xiaohuar.com/d/file');//给图片添加校花网网址,将原来的相对路径改为绝对路径,使图片能正常显示 contentHtml = "<div id='content'>" + contentHtml + "</div>";//拼凑最新的内容代码 var mainHtml = title + contentHtml;//标题内容合并 fs.writeFile('xiaohua.html', mainHtml, function () { console.log('保存成功'); }); }); }).on('error', function (e) { console.log('Got error:' + e.message); });
运行,即可得到最简洁最核心的校花内容。
未经允许不得转载:前端撸码笔记 » [nodejs实战:校花网学妹图片采集+站点发布]三、数据的筛选:cheerio模块