Node.js爬虫--网页请求模块

Node.js爬虫–网页请求模块

解决我几个月的问题,太感谢啊~

注:如您下载最新的nodegrass版本,由于部分方法已经更新,本文的例子已经不再适应,详细请查看开源地址中的例子。 一、为什么我要写这样一个模块?

源于笔者想使用Node.js写一个爬虫,虽然Node.js官方API提供的请求远程资源的方法已经非常简便,具体参考

http://nodejs.org/api/http.html 其中对于Http的请求提供了,http.get(options, callback)和http.request(options, callback)两个方法,

看方法便知,get方法用于get方式的请求,而request方法提供更多的参数,例如其它请求方式,请求主机的端口等等。对于Https的请求于Http类似。一个最简单的例子:

var https = require('https');

https.get(‘https://encrypted.google.com/’, function(res) { console.log("statusCode: ", res.statusCode); console.log("headers: ", res.headers);

res.on(‘data’, function(d) { process.stdout.write(d); });

}).on(‘error’, function(e) { console.error(e); });

对于以上代码,我们无非就是想请求远程主机,得到响应信息,例如响应状态,响应头,响应主体内容。其中get方法的第二个参数是一个回调函数,我们异步的获取响应信息,然后,在该回调函数中,res对象又监听data,on方法中第二个参数又是一个回调,而你得到d(你请求到的响应信息)后,很可能在对它进行操作的时候再次引入回调,一层层下去,最后就晕了。。。对于异步方式的编程,对于一些习惯同步方式写代码的同学是非常纠结的,当然国内外已经对此提供了一些非常优秀的同步类库,例如老赵的Wind.js…好像有点扯远了。其实,我们调用get最终要得到的无非就是响应信息,而不关心res.on这样的监听过程,因为太懒惰。不想每次都res.on(‘data’,func),于是诞生了今天我要介绍的nodegrass。

二、nodegrass请求资源,像Jquery的$.get(url,func)

一个最简单的例子:

var nodegrass = require('nodegrass');
nodegrass.get("http://www.baidu.com",function(data,status,headers){
 console.log(status);
 console.log(headers);
 console.log(data);
},'gbk').on('error', function(e) {
	console.log("Got error: " + e.message);
});

咋一看,和官方原来的get没啥区别,确实差不多=。=!只不过少了一层res.on(‘data’,func)的事件监听回调而已。不管你信不信,反正我看上去感觉舒服多了,第二个参数同样是一个回调函数,其中的参数data是响应主体内容,status是响应状态,headers是响应头。得到响应内容,我们就可以对得到的资源提取任何我们感兴趣的信息啦。当然这个例子中,只是简单的打印的控制台而已。第三个参数是字符编码,目前Node.js不支持gbk,这里nodegrass内部引用了iconv-lite进行了处理,所以,如果你请求的网页编码是gbk的,例如百度。只需加上这个参数就行了。

那么对于https的请求呢?如果是官方api,你得引入https模块,但是请求的get方法等和http类似,于是nodegrass顺便把他们整合在一块了。看例子:

var nodegrass = require('nodegrass');
nodegrass.get("https://github.com",function(data,status,headers){
	console.log(status);
	console.log(headers);
	console.log(data);
},'utf8').on('error', function(e) {
	console.log("Got error: " + e.message);
});

odegrass会根据url自动识别是http还是https,当然你的url必须得有,不能只写www.baidu.com/而需要http://www.baidu.com/。

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

var ng=require('nodegrass');
ng.post("https://api.weibo.com/oauth2/access_token",function(data,status,headers){
 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的数据,它们都是对象字面量的类型:

var headers = {
    'Content-Type': 'application/x-www-form-urlencoded',
    'Content-Length':data.length
};

var options = { client_id : ‘id’, client_secret : ‘cs’, grant_type : ‘authorization_code’, redirect_uri : ‘your callback url’, code: acode };

三、利用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('http://www.cnblogs.com/',function(data){
        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的开源地址:https://github.com/scottkiss/nodegrass

原文地址:http://www.cnblogs.com/vimsk/archive/2012/09/22/2697806.html


3 回复

Node.js爬虫–网页请求模块

一、为什么我要写这样一个模块?

在开发爬虫时,虽然Node.js官方API提供的请求远程资源的方法已经非常简便,但直接使用http.gethttp.request依然存在一些不便之处。这些方法需要手动处理异步回调,这使得代码变得冗长且难以维护。为了解决这个问题,我决定编写一个更简洁易用的模块——nodegrass

二、nodegrass请求资源,像jQuery的$.get(url, func)

nodegrass模块简化了HTTP请求的过程,使得代码更加清晰简洁。下面是一个简单的例子:

var nodegrass = require('nodegrass');
nodegrass.get("http://www.baidu.com", function(data, status, headers) {
    console.log(status); // 打印响应状态码
    console.log(headers); // 打印响应头
    console.log(data); // 打印响应主体内容
}, 'gbk') // 设置字符编码
.on('error', function(e) {
    console.log("Got error: " + e.message);
});

在这个例子中,nodegrass.get 方法接受三个参数:

  1. 请求的URL。
  2. 回调函数,该函数接收三个参数:响应主体内容、状态码和响应头。
  3. 字符编码(可选),如果请求的网页使用了非UTF-8的编码(如GBK),可以通过设置此参数来正确解码。

三、HTTPS请求

nodegrass 自动识别请求的协议(HTTP或HTTPS),因此你可以像处理HTTP请求一样处理HTTPS请求:

var nodegrass = require('nodegrass');
nodegrass.get("https://github.com", function(data, status, headers) {
    console.log(status);
    console.log(headers);
    console.log(data);
}, 'utf8')
.on('error', function(e) {
    console.log("Got error: " + e.message);
});

四、POST请求

nodegrass 还提供了处理POST请求的方法。下面是一个例子:

var nodegrass = require('nodegrass');

var headers = {
    'Content-Type': 'application/x-www-form-urlencoded',
    'Content-Length': data.length
};

var options = {
    client_id: 'your_client_id',
    client_secret: 'your_client_secret',
    grant_type: 'authorization_code',
    redirect_uri: 'your_callback_url',
    code: 'your_auth_code'
};

nodegrass.post("https://api.weibo.com/oauth2/access_token", function(data, status, headers) {
    var accessToken = JSON.parse(data);
    var err = null;
    if (accessToken.error) {
        err = accessToken;
    }
    callback(err, accessToken);
}, headers, options, 'utf8');

在这个例子中,nodegrass.post 方法的参数包括:

  1. 请求的URL。
  2. 回调函数,接收响应数据、状态码和响应头。
  3. 请求头(可选)。
  4. POST数据(可选)。
  5. 字符编码(可选)。

五、利用nodegrass做代理服务器

你可以使用nodegrass来创建一个简单的代理服务器,将请求转发给其他服务器:

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

http.createServer(function(req, res) {
    var pathname = url.parse(req.url).pathname;

    if (pathname === '/') {
        nodegrass.get('http://www.cnblogs.com/', function(data) {
            res.writeHead(200, {'Content-Type': 'text/html;charset=utf-8'});
            res.write(data + "\n");
            res.end();
        }, 'utf8');
    }
}).listen(8088);

console.log('Server listening on port 8088...');

在这个例子中,当用户访问代理服务器的根路径时,代理服务器会从http://www.cnblogs.com/获取内容,并将其返回给用户。

通过使用nodegrass,你可以更加方便地处理HTTP请求,简化代码结构,提高开发效率。


nodegrass这个模块很久不更新的样子.

在Node.js中,编写爬虫时经常需要处理HTTP或HTTPS请求。nodegrass 是一个便捷的库,可以简化这些请求。以下是基于 nodegrass 的一些基本示例,展示如何发起GET和POST请求,并处理响应。

GET 请求示例

var nodegrass = require('nodegrass');

// 发起一个GET请求到百度
nodegrass.get("http://www.baidu.com", function(data, status, headers) {
    console.log(status); // 响应状态码
    console.log(headers); // 响应头
    console.log(data); // 响应体
}, 'gbk') // 设置字符编码
.on('error', function(e) {
    console.log("Got error: " + e.message);
});

POST 请求示例

var nodegrass = require('nodegrass');

// 定义请求头和选项
var headers = {
    'Content-Type': 'application/x-www-form-urlencoded'
};

var options = {
    client_id: 'your_client_id',
    client_secret: 'your_client_secret',
    grant_type: 'client_credentials'
};

// 发起一个POST请求到某个API
nodegrass.post("https://api.example.com/token", function(data, status, headers) {
    var response = JSON.parse(data);
    console.log(status);
    console.log(headers);
    console.log(response);
}, headers, options, 'utf8')
.on('error', function(e) {
    console.log("Got error: " + e.message);
});

使用 Node.js 原生 http 模块发起GET请求

如果不想使用额外的库,也可以直接使用Node.js的原生模块:

const http = require('http');

http.get('http://www.example.com', (res) => {
    let data = '';

    res.on('data', (chunk) => {
        data += chunk;
    });

    res.on('end', () => {
        console.log(data);
    });
}).on('error', (err) => {
    console.error(`Got error: ${err.message}`);
});

通过上述代码示例,你可以看到如何使用nodegrass库来发起HTTP和HTTPS请求,从而简化编写爬虫的工作。同时,也展示了如何使用Node.js的原生http模块来实现相同的功能。

回到顶部