npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

node-spider-core

v1.0.3

Published

这是一个极简而优美的爬虫框架

Downloads

2

Readme

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("开始抓取")
})