智联招聘爬虫——学习笔记(2).md

2017.4.9- 4.9

前言:

本周完成的工作主要是整理上周从智联招聘网站上采集到的数据。
① 工资 ==> 字符串转化,并计算均值
② 招聘人数 ==> 字符串转化,并计算均值
③ 统计工种数量与对应招聘需求量
④ 统计公司信息与公司招聘工种与对应需求

笔记导航

  • 正则表达式学习
  • 招聘信息整理

具体笔记

1. 正则表达式

正则表达式完整整理
常用的几个:
/\d+/ 含有一个或一个以上的数字
/[^\d+]/ 不包含数字
/[xyz]/ 出现xyz中的任意一个字符
使用示例:

String.match(regExp)返回值:如果匹配返回匹配到的字符串,否则返回null
//判断字符串与正则表达式是否匹配:  
String.match(regExp) !== null
   ==> true 说明匹配
   ==> false 说明不匹配

2. mongodb模块的学习

npm包中的mongodb,是mongodb的官方驱动。
官方API文档

//mongodb的find函数返回的结果是游标,与mongoose的使用方法不同,需要通过toArray()转换  
db.collection.find({}, function(err, doc){
    //返回的doc是游标,需通过toArray完成转换
    doc.toArray(functiong(err, data){
        //data 才是document
    })
})

//update方法与mongoose的update用法相同
db.collection.updateOne({queryConditons},{updateOperations},{upsert:true},function(err,doc){
    //doc就是更新后的记录
})

3. 数据库信息整理

  • 工资转换
exports.reformSalary = function (cb) {
        var test = db.collection('cooo');
        var regExp1 = /\d+\-\d+[元/月]/;
        var regExp2 = /^\d+[元/月]/;
        var regExp3 = /[面议]/;
        //对所有不包含数字的记录进行操作
        test.find({},function (err, doc) {
            doc.toArray(function (err, data) {
                if (data.length > 0) {
                    async.mapLimit(data, 1, function (job, callback) {
                        if ((job.salary).match(regExp1) !== null) {               //工资格式为区间,则计算中间值
                            var salary = job.salary.replace('元/月', '');
                            var lowerLimit = parseInt(salary.replace(/\-\d+/, ''));
                            var upperLimit = parseInt(salary.replace(/\d+\-/, ''));
                            salary = (lowerLimit + upperLimit) / 2;
                            test.updateOne({_id: job._id}, {$set: {salary: salary}}, function (err, data) {
                                if (err) {
                                    console.log(err);
                                } else {
                                    console.log('success to update the average!');
                                    callback(null, 'one');
                                }
                            })
                        } else if ((job.salary).match(regExp2) !== null) {      //把工资格式为具体金额的纪律,转换成数字类型
                            var salaryNum = parseInt((job.salary).replace(/[^\d]+/,''));
                            test.updateOne({_id: job._id},{$set: {salary: salaryNum}},function (err, res) {
                                if (err){
                                    console.log(err);
                                }else {
                                    console.log('success to update string to number!');
                                    callback(null, 'one');
                                }
                            })
                        } else if ((job.salary).match(regExp3) !== null) {      // 把价格为"面议"的招聘记录都修改成0
                            test.updateOne({_id: job._id},{$set: {salary: 0}}, function (err, doc) {
                                if (err) {
                                    console.log(err);
                                } else {
                                    console.log("success update 面议 to 0!");
                                    callback(null, 'one');
                                }
                            });
                        } else {
                            callback(null, 'one');
                        }
                    }, function (err, res) {
                        console.log('salary values have been all REFORMED!');
                        cb(null, 'end');
                    })
                }else {
                    cb(null, 'end');
                }
            })
        })
}
  • 需求人数转换
//把招聘人数属性值转变为Number类型
exports.reformDemandNum = function () {
    var JOB = db.collection('copy');
    var jobtype = db.collection('jobtype');
    JOB.find({}, function (err, data) {
        if (err){
            console.log(err);
        }else {
            data.toArray(function (err, jobs) {
                var jobTypeDemand = [];
                async.mapSeries(jobs, function (job, callback) {
                    //当属性值为X人时,取数字;当属性值为若干时,取0
                    var numReq = (job.numReq).match(/\d+[人]/)!== null ? parseInt((job.numReq).replace('人','')) : 0;
                    JOB.updateOne({_id: job._id}, {$set:{numReq:numReq}}, function (err, data) {
                        if (err){
                            console.log(err);
                        }else {
                            // console.log('update numReq successful');
                            jobTypeDemand[job.jobType] = typeof(jobTypeDemand[job.jobType])==='undefined'?numReq:jobTypeDemand[job.jobType]+numReq;
                            callback(null, 'one');
                        }
                    });
                },function (err, res) {
                    console.log(jobTypeDemand);
                    console.log("更新人数成功");
                })
            })
        }
    })
}
  • 工种数量分析
//统计工种,记录工种名称与该工种的需求量
exports.selectDistinctJobtype = function () {
    var job = db.collection('copy');
    var jobType = db.collection('jobtype');

    job.distinct('jobType', function (err, data) {
        if (err) {
            console.log(err);
        } else {
            async.mapLimit(data, 1, function (jobType, callback) {
                job.find({jobType: jobType}, function (err, doc) {
                    if (err) {
                        console.log(err);
                    } else {
                        doc.toArray(function (err, data) {
                            var staff = 0;
                            for(var i = 0; i < data.length; i++){
                                staff += data[i].numReq;
                            }
                            var cmp = {
                                jobType: jobType,
                                companyDemand: data.length,
                                staffDemad: staff,
                            }
                            callback(null, cmp);
                        })
                    }
                })
            }, function (err, res) {
                jobType.insertMany(res, function (err, data) {
                    if (err) {
                        console.log(err);
                    } else {
                        console.log("insert jobType successfully");
                    }
                })
            });
        }
    })
}
  • 公司数据分析
//统计共有多少个招聘公司,记录公司名称与公司的岗位需求量
exports.selectDistinctCompany = function () {
    var job = db.collection('copy');
    var company = db.collection('company');

    job.distinct('company', function (err, data) {
        if (err) {
            console.log(err);
        } else {
            async.mapLimit(data, 1, function (company, callback) {
                job.find({company: company}, function (err, doc) {
                    if (err) {
                        console.log(err);
                    } else {
                        doc.toArray(function (err, data) {
                            var staff = 0;
                            for(var i = 0; i < data.length; i++){
                                staff += data[i].numReq;
                            }
                            var cmp = {
                                companyName: company,
                                typeDemand: data.length,
                                staffDemand: staff,
                            }
                            callback(null, cmp);
                        })
                    }
                })
            }, function (err, res) {
                company.insertMany(res, function (err, data) {
                    if (err) {
                        console.log(err);
                    } else {
                        console.log("insert cmp successfully");
                    }
                })
            });
        }
    })
}

你可能感兴趣的:(智联招聘爬虫——学习笔记(2).md)