当前位置: 首页 > 工具软件 > CasperJS > 使用案例 >

casperJs爬虫程序[1]

易宣
2023-12-01

如果直接用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, "[]");
}


 类似资料: