如果直接用request,而不用casperjs,速度会有明显的提升(我不确定具体的量)
但是问题在于,casperjs基于phantom可以得到一个渲染过的页面,而且我们可以在其options里inject一些js的库,比如喜闻乐见的jquery,让操作dom信息变得非常的容易
PS:如果你觉得速度要提升下,可以设置casperjs的loadImages属性为false
以下是基于casperjs写的vine.js(藤条),它依赖于待inject的一个特定的vine模块,模块必须包含3个方法:
1 swallow(燕子)
它用于生成待fetch的url的一个list
2 hamsters(仓鼠)
它用于在前者提供的url上fetch相关信息
3 bear(熊)
它用于组织前者fetch出来的信息,其中,它可以访问到相关的db,从而进行进一步的筛选
其中数据库是用了taffy,一个js的数据库(因为数据量不会太大,就用简单的了)
有兴趣的朋友可以去百度
源码如下:
var casper = require('casper').create({
clientScripts: ["includes/jquery.js"],
stepTimeout: 120 * 1000,
pageSettings: {
loadImages: false
},
verbose: true,
logLevel: "error"
});
// casperjs vine.js --vineName=22mm [--fileName=22mm_new]
var vineName = casper.cli.get("vineName");
if (!vineName) {
throw "MUST NEED A VINE !!";
}
var fileName = casper.cli.has("fileName") ? casper.cli.get("fileName") : vineName;
var dbName = "./data/" + vineName + ".json";
// special vine
var myVine = require("./vines/" + vineName);
var dba = require("./lib/taffy").taffy;
var fs = require("fs");
var timeDog = require("./lib/timeDog");
var dog = new timeDog();
var opts = {
urlArr: null,
data: null,
db: null
};
dog.bark("---START READ DATABASE---");
// read database
opts.db = readDB(dbName);
casper.start();
casper.then(function() {
dog.bark("---START---");
});
// create links should be fetched
casper.then(function() {
dog.bark("***SWALLOW START***");
});
casper.then(function() {
myVine.swallow(opts);
});
casper.then(function() {
dog.bark("***SWALLOW COMPLETE***");
});
// fetchElf
//
casper.then(function() {
dog.bark("***HAMSTERS START***");
});
casper.then(function() {
opts.data = [];
opts.urlArr.forEach(function(url, i) {
casper.thenOpen(url, function(status) {
if (!status) {
casper.echo(url + " is not valid");
}
var item = casper.evaluate(function(hamsters, db) {
return hamsters(db);
}, myVine.hamsters, opts.db);
// console.log(JSON.stringify(item, undefined, 4));
if (item) {
opts.data[opts.data.length] = item;
};
dog.bark("---FETCHED @ " + i + " ---");
});
});
});
casper.then(function() {
dog.bark("***HAMSTERS COMPLETE***");
});
// save data
casper.then(function() {
dog.bark("***BEAR START***");
});
casper.then(function() {
myVine.bear(opts);
writeDB(dbName, opts.db);
});
casper.then(function() {
dog.bark("***BEAR COMPLETE***");
});
casper.run(function() {
dog.bark("---END---");
casper.exit();
});
function readDB(path) {
if (!fs.exists(path)) {
fs.write(path, "[]");
}
var content = fs.read(path);
// casper.echo(content);
return dba(JSON.parse(content));
}
function writeDB(path, db) {
fs.write(path, db().stringify());
}
function refreshDB(path) {
fs.write(path, "[]");
}