前面,我们介绍了nodejs中一些基础的api、express框架、mysql api、mongodb api 等。
本篇我们介绍下nodejs在爬虫领域的应用。相比python,nodejs的爬虫实现起来要更简单,又因为是异步,支持的并发高,性能相比python也更高一些。
好了,废话不多讲,直接上代码吧。
第一个案例,爬取京东网首页左侧栏的所有一级商品分类,并打印。
代码如下:
var request=require('request'); var cheerio=require('cheerio'); //获取京东首页的左侧栏一级菜单的列表 request.get("https://www.jd.com/",function (err,response,body) { if(err){ throw err; } if(response&&response.statusCode==200){ var $ =cheerio.load(body); // console.log($("li.cate_menu_item").length);//16 //console.log($("ul.cate_menu li.cate_menu_item").length);//16 var arr=[]; $("ul.cate_menu li.cate_menu_item").each(function (i) { // arr[i]=$(this).text().replace(/[\n,\t]/g,'').trim(); var title=""; var aa =$(this).find('a').toArray(); for(var item of aa){ // console.log($(item).text()); title+=$(item).text()+"/"; } arr[i]=title.substring(0,title.length-1); }); console.log(arr);//打印结果 (数组) } });打印结果如下:
[ '家用电器',
'手机/运营商/数码',
'电脑/办公',
'家居/家具/家装/厨具',
'男装/女装/童装/内衣',
'美妆个护/宠物',
'女鞋/箱包/钟表/珠宝',
'男鞋/运动/户外',
'房产/汽车/汽车用品',
'母婴/玩具乐器',
'食品/酒类/生鲜/特产',
'艺术/礼品鲜花/农资绿植',
'医药保健/计生情趣',
'图书/音像/电子书',
'机票/酒店/旅游/生活',
'理财/众筹/白条/保险' ]
第二个案例,爬取电影天堂所有的最新上映的影片信息,并保存到本地文件。
var request=require('request'); var cheerio=require('cheerio'); var iconv=require('iconv-lite'); var fs=require('fs'); var async=require('async'); //var url="http://www.dytt8.net/html/gndy/dyzz/list_23_1.html"; var baseUrl="http://www.dytt8.net/html/gndy/dyzz/list_23_"; //1.html 2.html 3.html ... //1 - 172 页 /* movie 对象 * { * title:'xxxx', * createtime:'2017-09-08 10:20:10', * description:'xxxxx' * } * */ //获取最新电影 function getLatestMoves(page,callback) { request.get({ url:baseUrl+page, //1.html 2.html 3.html ... encoding:null, headers:{ 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36', } },function (err,response,body) { if (err) { throw err; } if(response&& response.statusCode==200){ //co_content8 // var $=cheerio.load(body); var $=cheerio.load(iconv.decode(body, 'gbk')); //console.log($("div.co_content8 > ul > table").length);//25条数据 每页 var movies =[]; $("div.co_content8 > ul > table").each(function (i) { var ctx=$(this); var move ={}; //title ok var title=ctx.find("tr").eq(1).find('td').eq(1).text().trim(); // console.log(title); move.title=title; //createtime var createtime =ctx.find("tr").eq(2).find('td').eq(1).text().trim(); createtime= createtime.replace(/点击\:\d+/g, '').replace(/日期\:/,'').trim(); move.createtime=createtime; var description=ctx.find('tr').eq(3).find('td').eq(0).text().trim(); move.description=description; movies.push(move); });//end 循环 callback(movies);//回调返回 }else{ callback(undefined); } }); } var pages=[]; for(var i=0;i<172;i++){ pages[i]=(i+1)+".html"; } var saveDir="f:/11/dyttData"; async.mapLimit(pages ,10, function(page, callback) { getLatestMoves(page,function (data) { // 1.html var i=page.replace(/\.html/g,''); fs.writeFile(saveDir+"/movie_"+i+".txt",JSON.stringify(data),function (err) { if (err) { throw err; }else{ console.log('写入数据ok'); // callback(null); } }); callback(null,"successful!"); }); },function (err,results) { if(err){ throw err; } // console.log(result);// 会输出一个有大量个 "successful!" 字符串的数组 console.log("数据全部已下载完毕!"); });
需要注意的是电影天堂网(http://www.dytt8.net/)是采用gb2312的古老编码格式,故请求和获取响应时需要一些特殊的编码设置。
request.get({ url:baseUrl+page, //1.html 2.html 3.html ... encoding:null, headers:{ 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36', } }, var $=cheerio.load(iconv.decode(body, 'gbk'));
运行完成, 会下载电影信息到本地磁盘中。
Copyright © 叮叮声的奶酪 版权所有
备案号:鄂ICP备17018671号-1