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
mongoose有点传统数据库的风格,就会在一开始就给数据库建立字段定义(虽然mongo的字段是可以随意收缩的)
3 saveToDatabase.js
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 */
相关文章推荐
- phpredis pipeline
- OLE DB访问接口“MICROSOFT.JET.OLEDB.4.0”配置为在单线程单位模式下运行,所以该访问接口无法用于分布式
- 2016_SQL学习(1)
- kettle用mysql创建资源库执行sql代码报错
- SQL Server FileStream详解
- SQL Server中数据行批量插入脚本的存储实现
- 为MySQL安装配置代理工具Kingshard的基本教程
- mysql中的key和index 理解
- mysql删除数据库中所有表
- Oracle查询表名及模糊查询
- ORACLE-忘记超管/管理员—密码
- cygwin下使用postgreSQL
- Redis+MongDB 常用命令
- 设置mysql数据库表名不区分大小写
- 8天学通MongoDB——第一天 基础入门
- 如何优化MySQL insert性能
- 修改hosts文件里面的主机名,oralce asm无法启动
- MySQL复制 -- binlog(2)
- 各种数据库使用JDBC连接的方式
- 预算oracle