您的位置:首页 > 数据库

casperjs爬虫总结 -- (4) 保存到mongo数据库

2015-12-24 00:50 295 查看
casperjs爬虫总结 -- (4) 保存到mongo数据库

1 mongo和mongoose

mongoose是对mongo数据库的封装,让nodejs操作mongo更加方便

2 package.json

这个json文件中记录了项目所需要的第三方nodejs包

因为mongoose的nodejs包需要编译,所以需要安装c++的编译器

在windows操作系统上,请安装vs2013

3 saver文件夹结构分析

|method

--|tieba.js

saver.js

saveToDatabase.js

schema.js

解释:

1 method文件夹下的tieba.js会对捕获来的category为"tieba"的数据进行"漏斗"处理,所以这里等于给了再一次format数据的机会

2 schema.js

var mongoose = require("mongoose");
var Schema = mongoose.Schema,
ObjectId = mongoose.ObjectId;

// 图片表
exports.PicListSchema = new Schema({
crcCode:{type:Number,index:true,unique:true},
category:String,
title:String,
imgCodes:Array,
userNameList:Array,
zan:Number,
cai:Number,
status:String,/*枚举 normal frozen*/
timeStamp:Date
});


mongoose有点传统数据库的风格,就会在一开始就给数据库建立字段定义(虽然mongo的字段是可以随意收缩的)

3 saveToDatabase.js

var fs = require("fs");

var async = require("async");
var crc = require("crc");
var _ = require("underscore");

var saver = require("./saver");

// 读取node命令行的参数
// 跟casperjs读取命令行参数的方式略有不同,casperjs使用"--key=value"方式
var realArgv = process.argv.slice(2);
console.log(realArgv);
console.log(realArgv[0]);
console.log(realArgv[1]);

var category = realArgv[0],
saveMethod = realArgv[1];

console.log(category);
console.log("save " + category + " to database");

var file = "./casper/data/"+category+".json";

// 如果不存在指定的file,则退出,code为1
if(!fs.existsSync(file)){
console.log("not exist -> "+file);
process.exit(1);
}

// 读取json文件
fs.readFile(file,function(err,data){
if(err){
process.exit(2);
}
var json = JSON.parse(data);

// 处理json数据
json = require("./method/"+saveMethod)(category,json);

// 保存数据到mongo
_save(json,function(err,data){
if(err){
console.log("end");
console.log(err);
}
process.exit(3);
});
});

// 保存数据
function _save(json,next){
// 连接数据库
saver.connect();
// 插入的新数据的个数
var insertCount = 0;
// json显然是个数组
async.each(json,function(n,next){
async.series([
function(next){
// console.log("isExist");
saver.isExist(n.crcCode,function(err,data){
// console.log("isExist callback");
if(err){
next(err);
}else if(data){
next("exist same crcCode..");
}else{
next();
}
});
},
function(next){
// console.log("insert");
saver.insert(n.crcCode,n.category,n.title,n.imgCodes,function(err,data){
if(!err){
insertCount++;
}
next(err,data);
});
}
],
// 不论是否成功失败,一律传送"完成"信息到外层
next.bind(null,null)
);
},function(err,data){
console.log("insertCount -> "+insertCount);
saver.disconnect();
next(err,data);
});
};

/*
category -> 小萝莉
saveMethod -> tieba
node ./saver/saveToDatabase.js 小萝莉 tieba
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: