配色: 字号:
如何用 Nodejs 分析一个简单页面
2016-11-02 | 阅:  转:  |  分享 
  
如何用Nodejs分析一个简单页面



本文目的

在浏览器地址栏中输入localhost:3000,在页面显示博客园首页的20篇文章标题。



过程分析

首先需要端口的监听,这就需要引入Node中最重要的模块之一express。其次需要对http://www.cnblogs.com/页面发送类似http的请求以获取页面数据进行分析,这里需要引入SuperAgent模块。最后为了能使请求得到的html源码进行类似dom一般的操作,需要引入cheerio模块。



express模块

首先第一步,我们要实现端口的监听,以便能将信息输出到页面上。



我们可以用http模块:



varhttp=require("http");

http.createServer(function(request,response){

response.writeHead(200,{"Content-Type":"text/html"});

response.write("HelloWorld!");

response.end();

}).listen(3000);

当然我们更可以用封装了http功能更加强大的express模块:



//这句的意思就是引入`express`模块,并将它赋予`express`这个变量等待使用。

varexpress=require(''express'');

//调用express实例,它是一个函数,不带参数调用时,会返回一个express实例,将这个变量赋予app变量。

varapp=express();



//app本身有很多方法,其中包括最常用的get、post、put/patch、delete,在这里我们调用其中的get方法,为我们的`/`路径指定一个handler函数。

//这个handler函数会接收req和res两个对象,他们分别是请求的request和response。

//request中包含了浏览器传来的各种信息,比如query啊,body啊,headers啊之类的,都可以通过req对象访问到。

//res对象,我们一般不从里面取信息,而是通过它来定制我们向浏览器输出的信息,比如header信息,比如想要向浏览器输出的内容。这里我们调用了它的#send方法,向浏览器输出一个字符串。

app.get(''/'',function(req,res){

res.send(''HelloWorld'');

});



//定义好我们app的行为之后,让它监听本地的3000端口。这里的第二个函数是个回调函数,会在listen动作成功后执行,我们这里执行了一个命令行输出操作,告诉我们监听动作已完成。

app.listen(3000,function(){

console.log(''appislisteningatport3000'');

});

SuperAgent模块

接着我们需要获取博客园首页的代码从而能进行分析。SuperAgent就是服务端可以发送getpost等http请求的模块,直接看代码,更多的api可以参考文档。



varexpress=require(''express'');

varsuperagent=require(''superagent'');



varapp=express();



app.get(''/'',function(req,res,next){

superagent

.get(''http://www.cnblogs.com/'')

.end(function(err,ans){

//常规的错误处理

if(err){

returnnext(err);

}



res.send(ans.text);

});

});





app.listen(3000,function(){

console.log(''appislisteningatport3000'');

});

cheerio模块

我们用SuperAgent模块获取了博客园的页面代码,而用cheerio则可以进行类似Jquery的css选择器操作。cheerio模块的详细api可以参考文档。



完整代码

varexpress=require(''express'');

varcheerio=require(''cheerio'');

varsuperagent=require(''superagent'');



varapp=express();



app.get(''/'',function(req,res,next){

superagent

.get(''http://www.cnblogs.com/'')

.end(funwww.wang027.comction(err,sres){//callback

//常规的错误处理

if(err){

returnnext(err);

}



//sres.text里面存储着网页的html内容,将它传给cheerio.load之后

//就可以得到一个实现了jquery接口的变量,我们习惯性地将它命名为`$`

//剩下就都是jquery的内容了

var$=cheerio.load(sres.text);

varans='''';

$(''.titlelnk'').each(function(index,item){

var$item=$(item);

ans+=$item.html()+''

'';

});



//将内容呈现到页面

res.send(ans);

});

});



app.listen(3000,function(){

console.log(''appislisteningatport3000'');

});

这时启动localhost:3000,页面就能显示博客园首页的20篇文章标题啦(虽然没样式不太美观)!(当然得先nodefileName.js)



当然我们也可以直接把内容输出在控制台:



varcheerio=require(''cheerio'');

varsuperagent=require(''superagent'');



superagent

.get(''http://www.cnblogs.com/'')

.end(function(err,sres){//callback

//常规的错误处理

if(err){

console.error(err);

}



//sres.text里面存储着网页的html内容,将它传给cheerio.load之后

//就可以得到一个实现了jquery接口的变量,我们习惯性地将它命名为`$`

//剩下就都是jquery的内容了

var$=cheerio.load(sres.text);

$(''.titlelnk'').each(function(index,item){

varwww.baiyuewang.net$item=$(item);

console.log($item.text());

});

});

献花(0)
+1
(本文系thedust79首藏)