网页请求模块

注:如你下载最新的nodegrass版本,由于部分方法已经更新,本文的例证已经不再适应,详细请查看开源地址中的例子。
生机勃勃、为啥自个儿要写那样叁个模块?

来源我想行使Node.js写多个爬虫,即使Node.js官方API提供的乞请远程能源的秘诀已经丰富省事,具体参谋

 此中对于Http的伏乞提供了,http.get(options, callback卡塔尔和http.request(options, callback卡塔尔(英语:State of Qatar)四个法子,

看方法便知,get方法用于get方式的呼吁,而request方法提供越来越多的参数,举个例子此外央浼方式,乞求主机的端口等等。对于Https的诉求于Http相仿。二个最简便的事例:

 

 1 var https = require('https');
 2 
 3 https.get('', function(res) {
 4   console.log("statusCode: ", res.statusCode);
 5   console.log("headers: ", res.headers);
 6 
 7   res.on('data', function(d) {
 8     process.stdout.write(d);
 9   });
10 
11 }).on('error', function(e) {
12   console.error(e);
13 });

对于以上代码,大家唯有便是想号召远程主机,获得响应新闻,举个例子响应状态,响应头,响应宗旨内容。个中get方法的第一个参数是一个回调函数,大家异步的获得响应新闻,然后,在该回调函数中,res对象又监听data,on方法中第2个参数又是三个回调,而你获得d(你央求到的响应新闻)后,很或然在对它举行操作的时候重新引进回调,大器晚成少有下去,最终就晕了。。。对于异步格局的编制程序,对于有些经常见到同步方式写代码的校友是十二分纠结的,当然国内外已经对此提供了部分特别了不起的一块类库,举例老赵的Wind.js......好像有一点点扯远了。其实,大家调用get最终要拿走的无非就是响应音讯,而不关切res.on那样的监听进度,因为太懒惰。不想每便都res.on('data',func卡塔尔国,于是诞生了后天本人要介绍的nodegrass。

 

二、nodegrass诉求财富,像Jquery的$.get(url,func卡塔尔

叁个最简易的例子:

 

1 var nodegrass = require('nodegrass');
2 nodegrass.get("
3     console.log(status);
4     console.log(headers);
5     console.log(data);
6 },'gbk').on('error', function(e) {
7     console.log("Got error: " + e.message);
8 });

咋后生可畏看,和合法原本的get没啥分歧,确实差不离=。=!只但是少了生龙活虎层res.on('data',func卡塔尔的平地风波监听回调而已。不管你信不相信,反正本人看起来以为舒适多了,第二个参数同样是二个回调函数,此中的参数data是响应焦点内容,status是响应状态,headers是响应头。获得响应内容,我们就可以对获得的能源提取任何我们感兴趣的新闻啦。当然那几个事例中,只是简短的打字与印刷的调整台而已。第多少个参数是字符编码,这几天Node.js不扶助gbk,这里nodegrass内部援引了iconv-lite举办了管理,所以,假如你央浼的网页编码是gbk的,举例百度。只需加上这几个参数就行了。

 

那便是说对于https的央求呢?如若是官方api,你得引入https模块,不过央求的get方法等和http形似,于是nodegrass顺便把他们结成在一块了。看例子:

 

1 var nodegrass = require('nodegrass');
2 nodegrass.get("
3     console.log(status);
4     console.log(headers);
5     console.log(data);
6 },'utf8').on('error', function(e) {
7     console.log("Got error: " + e.message);
8 });

 

nodegrass会依照url自动识别是http依然https,当然你的url必需得有,不能够只写www.baidu.com/而需要。

 

对于post的请求,nodegrass提供了post方法,看例子:

 

 

var ng=require('nodegrass');
ng.post("
    var accessToken = JSON.parse(data);
    var err = null;
    if(accessToken.error){
         err = accessToken;
    }
    callback(err,accessToken);
    },headers,options,'utf8');

 

以上是天涯论坛网易Auth2.0央浼accessToken的后生可畏局地,在那之中使用nodegrass的post央求access_token的api。

post方法相比较get方法多提供了headers央求头参数,options--post的多寡,它们都以目的字面量的花色:

 

 1 var headers = {
 2         'Content-Type': 'application/x-www-form-urlencoded',
 3         'Content-Length':data.length
 4     };
 5 
 6 var options = {
 7              client_id : 'id',
 8          client_secret : 'cs',
 9          grant_type : 'authorization_code',
10          redirect_uri : 'your callback url',
11          code: acode
12     };

 

三、利用nodegrass做代理服务器?……**

看例子:

 

var ng = require('nodegrass'),
     http=require('http'),
     url=require('url');

     http.createServer(function(req,res){
        var pathname = url.parse(req.url).pathname;
        
        if(pathname === '/'){
            ng.get('
                res.writeHeader(200,{'Content-Type':'text/html;charset=utf-8'});
                res.write(data+"n");
                res.end();
                },'utf8');
            }
     }).listen(8088);
     console.log('server listening 8088...');

 

 就这么轻巧,当然代理服务器还会有参差不齐的多,这几个不到底,但起码你拜会本地8088端口,看见的是否天涯论坛的页面吗?

nodegrass的开源地址:

 

本文由银河网址发布于银河网址,转载请注明出处:网页请求模块

您可能还会对下面的文章感兴趣: