美文网首页前端社团程序员
智联招聘爬虫——学习笔记(2).md

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

作者: ccminn | 来源:发表于2017-04-17 12:37 被阅读22次

    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

        本文链接:https://www.haomeiwen.com/subject/vrltzttx.html