node-spider-core
v1.0.3
Published
这是一个极简而优美的爬虫框架
Downloads
2
Readme
node-spider-core
简单快捷的NodeJS爬虫队列框架
Install
npm install node-spider-core --save
Examples:
Initialize (INIT):
const NodeCache = require( "node-spider-core" );
let spider= nodespider.getInstance({
FisrtDatUrl: {
Url:"https://www.csdn.net/"
}
})
Options
ProgramName
: (default:Name
) 应用程序名称IsClearData
: (default:N
) 用于执行完,是否执行存储过程清洗数据EndTime
: *(default:14
: (default:00`) 启动时间在这个时间之后是抓今天,否则是补抓昨天MainSleepTime
: (default:300000
) 主程序休眠时间CheckTime
: (default:300000
) 检查周期BegTimeOut
: (default:180000
) 开始抓取连接超时时长IntervalTimeOut
: (default:2000
) 抓取连接递增间隔超时时长BegRWTimeOut
: (default:180000
) 开始抓取读写超时时长IntervalRWTimeOut
: (default:2000
) 抓取读写超时递增间隔时长BegSpiderIntervalTime
: (default:5000
) 开始抓取间隔时长IntervalSpiderIntervalTime
: (default:300
) 抓取递增间隔时长MaxTrySpidertimes
: (default:5
) 最大失败次数IntervalSpiderTime
: (default:200
) 如果抓取队列中没值,间隔时间IntervalAnalysisTime
: (default:200
) 分析队列中没值,间隔时间IntervalDBTime
: (default:200
) 如果数据库插入队列中没值,间隔时间IntervalLogTime
: (default:300000
) 如果LogList中没值,间隔时间MaxPage
: (default:1000
) 分析队列中最大页面数SpiderSleepTime
: (default:5000
) 分析队列超过最大页面数,抓取队列休眠时间MaxDepth
: (default:10
) 抓取最大深度NetSleepTime
: (default:60000
) 网络不通,抓取线程休眠时间IsSpiderHouse
: (default:Y
) 是否抓取房源IsSpiderBatch
: (default:Y
) 是否抓取楼盘IsSpiderBuildNext
: (default:N
) 是否抓取楼栋翻页IsSpiderRoomState
: (default:N
) 是否抓取房间IsSpiderRoom
: (default:N
) 是否抓取房间状态IsFlateImg
: (default:N
) 是否抓取房源图片PIndex
: (default:1
) 开始页PCount
: (default:1
) 程序总数量SpiderConcurrency
: (default:1) 抓取队列并行运行值AnalysisConcurrency
: (default:1) 分析队列并行运行值DBConcurrency
: (default:1) 数据库插入队列并行运行值priority
: (default:1) 优先级 1.广度 2.深度 3.最佳FisrtDatUrl
: (default:DatUrl) 开始第一个urlmydb
: (default:Sequelize对象) 默认初始化一个sqlite本地数据库,用于抓取url,错误url的 保存,去重、重抓,如果你想用自己的,按需初始化,里面只有两个表,DatStatus状态表、DatUrl url表。
mydb: new Sequelize({
host: 'localhost',
dialect: 'sqlite',
pool: {
max: 2000,//池中最大连接数
acquire: 300000,//该池在抛出错误之前尝试获取连接的最长时间(以毫秒为单位)
idle: 100000//连接在被释放之前可以空闲的最长时间(以毫秒为单位)。
},
operatorsAliases: 0,
logging: 0,
storage: './database.sqlite'
})
//如果自己想自定义
mydb:new Sequelize(
"表名",
"sa",
"xxxx", {
dialect: 'mssql',
host: 'localhost',
port: 1433,
logging: 0,
}
)
Options.FisrtDatUrl
ID
: (default:uuid.v4()
) 随机生成KeyWord
: (default:''
)ProgramName
: (default:"Options.ProgramName"
)SpiderDate
: (default:Options.SpiderDate
) 抓取日期PID
: (default:""
)SiteUrl
: (default:""
) 站点urlSType
: (default:"Portal"
) 类型·SourUrl
: (default:""
) 父页面路径Url
: (default:``) 站点路径UrlType
: (default:GET
) 抓取方式(GET/POST/MGET)UrlPara
: (default:``) 参数EnCode
: (default:'UTF-8'
) 编码方式APara
: (default:''
) 附加参数CookieContent
: (default:``) Cookie值AContent
: (default:``) 附加内容PConent
: (default:``) 页面内容ErrorMsg
: (default:``) 错误信息TrySpiderTimes
: (default:1
) 抓取次数Depth
: (default:1
) 抓取深度SpiderTime
: (default:moment().format('YYYY-MM-DD HHs ss')
) 抓取时间UseclsPageUrl
: (default:false
) 是否使用自己定义的请求方法,监听clsPageUrl事件
Methods
spider.clsPageUr //抓取队列 spider.clsPageContent //分析队列 spider.clsDB //数据库插入队列 spider.SaveUrl(tast)//添加到重抓url,需开启 MaxTrySpidertimes最大失败次数
var spider= nodespider.getInstance({
SpiderConcurrency:1,//抓取队列并行运行值
AnalysisConcurrency:1,//分析队列并行运行值
DBConcurrency:1,//数据库插入队列并行运行值
SpiderSleep:5000,
FisrtDatUrl: {
Url:"https://www.csdn.net/"
}
})
//再次获取初始化后的爬虫,单例模式
spider1 =nodespider.getInstance()
console.log(spider==spider1)
spider1.on("clsPageContent",function (task,resolve){
console.log("处理分析队列"+task.Portal)
console.log("内容是"+task.PContent)
console.log("使用正则或者cheerio分析返回数据")
console.log("获取列表****")
console.log("加入数据库队列使用 spider.clsDB.push() 加入抓取队列 spider.clsDB.push()")
resolve()
})
spider1.on("clsDB",function (task,resolve){
console.log("处理数据库插入队列"+task.Portal)
console.log("还有"+spider.clsPageUrl.length())
resolve()
})
//当option.FisrtDatUrl.UseclsPageUrl==true 可触发这个事件,就可以自定义http请求了
spider1.on("clsPageUrl",function (task,resolve){
console.log("处理自定义抓取队列"+task.Portal)
console.log("还有"+spider.clsPageUrl.length())
resolve()
})
//触发重试 设置MaxTrySpidertimes最大失败次数 以及CheckTime 检查周期
spider1.on("retry",function (num){
console.log(`第${num}次重试`)
})
//抓取结束
spider1.on("finish",function (task){
console.log("抓取结束")
})
//请求页面错误
spider1.on("clsPageUrlerr",function (task){
console.log("请求页面错误")
})
// 向抓取队列插入一条。先进先出
spider.clsPageUrl.push({name: 'bar'});
// 向抓取队列插入一组
q.push([{name: 'baz'},{name: 'bay'},{name: 'bax'}], function(err) {
console.log('finished processing item');
});
//插到最前面
spider.clsPageUrl.unshift({name: 'bar'}, function (err) {
});
spider.clsPageUrl.drain(function() {
console.log('抓取队列中所有数据已经处理完');
});
// 向抓取队列插入一条。先进先出
spider.clsPageUrl.push({name: 'bar'});
// 向抓取队列插入一组
q.push([{name: 'baz'},{name: 'bay'},{name: 'bax'}], function(err) {
console.log('finished processing item');
});
//插到最前面
spider.clsPageUrl.unshift({name: 'bar'}, function (err) {
});
spider.clsPageUrl.drain(function() {
console.log('抓取队列中所有数据已经处理完');
});
Events
clsPageUrl
spider.on("clsPageUrl",function (task){
console.log("处理"+task)
console.log("还有"+spider.clsPageUrl.length())
})
spider.on("clsPageContent",function (task){
console.log("处理"+task)
console.log("还有"+spider.clsPageUrl.length())
})
spider.on("clsDB",function (task){
console.log("处理"+task)
console.log("还有"+spider.clsPageUrl.length())
})
//触发重试
spider.on("retry",function (num){
console.log('第'+num+'次抓取完成')
})
spider.on("finish",function (){
console.log("抓取结束")
})
spider.on("start",function (){
console.log("开始抓取")
})