前面,我们介绍了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