Node.js实践

Node.js做一个爬虫

一个临时的支线小任务,用node做一个爬虫,爬点贴吧的数据。

Express

express 是 Node.js 应用最广泛的 web 框架),可以用来建立一个强大的服务器端应用,包括中间件,模板引擎,路由等强大功能。
启动一个express最简单的服务代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 这句的意思就是引入 `express` 模块,并将它赋予 `express` 这个变量等待使用。
var express = require('express');
// 调用 express 实例,它是一个函数,不带参数调用时,会返回一个 express 实例,将这个变量赋予 app 变量。
var app = 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('Hello World');
});
// 定义好我们 app 的行为之后,让它监听本地的 3000 端口。这里的第二个函数是个回调函数,会在 listen 动作成功后执行,我们这里执行了一个命令行输出操作,告诉我们监听动作已完成。
app.listen(3000, function () {
console.log('app is listening at port 3000');
});

CasperJS

CasperJS是一个开源的导航脚本处理和测试工具,基于PhantomJS(前端自动化测试工具)编写。CasperJS简化了完整的导航场景的过程定义,提供了用于完成常见任务的实用的高级函数、方法和语法。
启动一个casper服务代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
var casper = require('casper').create({
verbose: true,
logLevel: 'debug'
});
// start中可以什么都不写
casper.start();
// 这句很重要,如果没有设置userAgent,则很多website会拒绝访问
var userAgentString = 'Mozilla/5.0 (Macintosh; Intel Mac OS X)';
casper.userAgent(userAgentString);

CasperJS打开一个页面后,会建立一个沙箱,沙箱就相当于浏览器啦,可以使用浏览器文档对象的一些方法拿到想要的信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// 遍历列表
this.thenOpen(opts.url,function(){
var res = this.evaluate(function(){
// 沙箱里面不能用_,只能用for,因为_不能传入沙箱
var aString = "a.j_th_tit";
var rst = [];
var nodeList = document.querySelectorAll(aString);
var nxtString = ".pagination-item.next";
var nxt = document.querySelector(nxtString).getAttribute("href");
for (var i = 0; i < nodeList.length; i++) {
var node = nodeList[i];
var title = node.innerHTML;
var url = node.getAttribute("href");
if(url.indexOf("http://")==-1){
url = location.origin+url;
}
rst.push({title:title,url:url});
};
return {rst:rst,nxt:nxt};
});
list = res.rst;
nextP = res.nxt;
});

完整demo见我的spider