1.0.3 • Published 3 years ago

node-spider-core v1.0.3

Weekly downloads
-
License
ISC
Repository
github
Last release
3 years ago

node-spider-core

NPM package version

简单快捷的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) 开始第一个url
  • mydb: (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:"") 站点url
  • SType: (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("开始抓取")
})