Python爬虫 分析拉勾招聘信息

Python爬虫 分析拉勾招聘信息

在上一篇文我已经爬取了拉勾的招聘信息,那么在这一篇文,我将根据爬取到的数据计算平均数,中位数等工资统计量,以及使用TF-IDF方法分析出关键字,从而得出当前职位所普遍需要的技能。

在这一切开始之前一个很重要的问题是我为什么需要统计量以及分工资区间提取关键字呢?

平均数之类的统计量能给我一个底,至少知道当前地区行业的整体薪资是怎么样的,那么在面试之时不至于陷入完全被动的状态

而分工资区间的关键字提取能给我一点信息,帮助我分析出不同的工资阶段侧重点在哪些地方,这样可能能在以后的学习或者工作提供一些参考

获取工资统计量以及分布

  1. 将salary转换为数字

    爬取到的salary都是“10k-20k”这样的字符串形式,所以需要先提取数字,计算出中位数。

    (1). 提取数字

    # 使用正则表达式提取salary中的数字
    salary_range = re.findall(r"\d+\.?\d*", salary)
    

    (2). 计算中位数

    median = (float(salary_range[0]) + float(salary_range[1])) / 2
    
  2. 计算工资统计量(平均数,中位数,众数,方差,最大值,最小值)

    然后我们根据处理后的salary计算平均数,中位数等统计量,自然这些计算numpy已经为我们提供了现成的api。

        def calculate_statistic(self):
            # salary_medians是job_id及工资区间中位数的dict
            salary_medians = self.get_salary()
    
            print("the min salary is ",min(list(salary_medians.values())))
            print("the max salary is ",max(list(salary_medians.values())))
    
            print("the average salary is ",np.mean(list(salary_medians.values())))
            print("the median salary is ",np.median(list(salary_medians.values())))
            print("the mode salary is ",mode(list(salary_medians.values())))
    
            print("the variance salary is ",np.var(list(salary_medians.values())))
    

    以下是工资统计量结果

    the min salary is  3.0
    the max salary is  45.0
    the average salary is  13.573863636363637
    the median salary is  14.0
    the mode salary is  ModeResult(mode=array([15.]), count=array([12]))
    the variance salary is  54.491703254132226
    
  3. 显示工资分布图

    最后通过matplotlib画出工资分布图

    salary_medians=self.get_salary()
    
    salary_medians = sorted(salary_medians.items(), key=lambda item: item[1])
    
    plt.bar(range(len(salary_medians)), [item[1] for item in salary_medians])
    plt.show()
    

    以下是工资分布图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dJeo6NcG-1600431181704)(D:\document\mdFiles\img\sarary_hz.png)]
4. 结果分析
从计算出来的统计量以及生成的条形图来看,应届生最低工资和最高工资相差15倍,这个差距是相当大的(我认为这可能是我条件是限制在本科以及以上的),一个令我比较惊讶的点是中位数和平均数非常接近,而且在我的认知中这是一个比较高的工资。

提取各工资分布区间关键字

  1. 将工资分布分为interval_num段

        # 使用start_index_in_salary_interval记录区间段起始索引,end_index_in_salary_interval记录区间段中止索引    
        start_index_in_salary_interval = 0
    
        for i in range(interval_num):
            end_index_in_salary_interval = int(length * ((i + 1) / interval_num))
            '''
            使用提取tf-idf提取各工资区间关键字
            '''
    
            start_index_in_salary_interval = end_index_in_salary_interval
    
  2. 使用分词,加入停用词

    在本文中我采用的是非常流行的jieba分词。

    停用词开始是想在网上搜索,然而我发现网上所收集的停用词都很“通用”,所以最后我采取的办法是先通过tf-idf提取关键字,然后从输出的关键字中找到无意义的词加入到停用词文件

    jieba 是基于Python非常好用的中文分词工具。

    • 支持四种分词模式:
      • 精确模式,试图将句子最精确地切开,适合文本分析;
      • 全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义;
      • 搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。
      • paddle模式,利用PaddlePaddle深度学习框架,训练序列标注(双向GRU)网络模型实现分词。同时支持词性标注。paddle模式使用需安装paddlepaddle-tiny,pip install paddlepaddle-tiny==1.6.1。目前paddle模式支持jieba v0.40及以上版本。jieba v0.40以下版本,请升级jieba,pip install jieba --upgradePaddlePaddle官网
    • 支持繁体分词
    • 支持自定义词典

    https://github.com/fxsjy/jieba

    以下是摘录的部分停用词

    参与
    实习
    知识
    有
    岗位
    职位
    职责
    强烈
    的
    ,
    。
    能
    在
    
  3. 使用TF-IDF方法提取关键词

    TF-IDF顾名思义Term Frequency-Inverse Document Frequency

    img

    img

    img

    虽然原理有点复杂,可是代码非常简单

    keywords = jieba.analyse.extract_tags(sentence=text, topK=20, withWeight=True)
    

    提取关键字结果如下

    测试 0.15962855312304036
    团队 0.10182375955561959
    CP 0.09474239375497118
    沟通 0.085109072974683
    Linux 0.07751650398134005
    安全 0.07590825459487031
    项目 0.07387567596146974
    文档 0.06476793358713977
    负责 0.05828861906292507
    独立 0.051337991118033145
    算法 0.050093322761556196
    数据结构 0.046005393864553316
    架构 0.04507552676659942
    数据库 0.04497081931692363
    计算机 0.044123241986974066
    Web 0.04306472443407781
    App 0.04306472443407781
    MySQL 0.04306472443407781
    Python 0.04306472443407781
    双休 0.04005958977521614
    ----------------------
    测试 0.14379692459110285
    数据库 0.09966919929511922
    文档 0.08931732917928464
    Python 0.08017355255298063
    算法 0.07771557227239939
    MySQL 0.06235720754120715
    负责 0.06028658961202682
    游戏 0.05356883201877795
    社团 0.05353619508882266
    Linux 0.05344903503532042
    架构 0.053280673750938895
    流程 0.05207601702534277
    项目 0.05093861809961252
    数据结构 0.047582329868852455
    分析 0.046920167819076
    沟通 0.04660219775575261
    计算机 0.04563566309830104
    接口 0.0453056581673547
    单元测试 0.04454086252943368
    数据仓库 0.04454086252943368
    ----------------------
    数据库 0.12543891969187157
    Linux 0.09505319727076451
    C++ 0.07311784405443425
    Redis 0.06580605964899082
    负责 0.06362091999423852
    热衷于 0.06017942295906421
    Python 0.058494275243547396
    测试 0.05245680538260551
    数据结构 0.05207379138348624
    计算机相关 0.05118249083810397
    操作系统 0.051005222002293585
    沟通 0.05100114119324771
    项目 0.04778304970881957
    自动化 0.046607228214189604
    网络 0.045574147188623855
    系统 0.045506233342385315
    分布式 0.044416036631070334
    PHP 0.04387070643266055
    MySQL 0.04387070643266055
    算法 0.04252570764100305
    ----------------------
    算法 0.10791355252023878
    负责 0.0662338135565616
    团队 0.06074414538532951
    数据 0.059367370409808974
    Spring 0.05709058024307545
    系统 0.0568501940896275
    Python 0.051381522218767905
    沟通 0.04977725993968481
    架构设计 0.04567246419446036
    Linux 0.04567246419446036
    数据结构 0.04065933567908309
    安全 0.03972276330028653
    机器 0.038060524492148994
    业务 0.0366699297523639
    计算机 0.03574624104091691
    C++ 0.03425434814584527
    数据库 0.03406712905547278
    文档 0.033390918111676215
    海量 0.03307230719540592
    探索 0.03301867809250239
    ----------------------
    
    1. 结果分析
      这个结果我其实是很失望的,没有达到我想象中的预期。我所期望的更接近于那种调查报告之类的,能告诉我能往哪些方面发展,但现实却是一堆模糊和抽象关键词而已。

    完整代码

    import re
    import jieba
    import jieba.analyse
    import pandas as pd
    import numpy as np
    from scipy.stats import mode
    from sklearn.feature_extraction.text import CountVectorizer
    import matplotlib.pyplot as plt
    import matplotlib
    
    matplotlib.use('TkAgg')
    
    
    class LagouAnalyzer:
        # 存储job_info所在的文件路劲
        job_info_file = "../webFetch/job_info.csv"
    
        '''
        根据salary从小到大排列得出工资分布
        '''
    
        def show_salary_distribution(self):
            salary_medians=self.get_salary()
    
            salary_medians = sorted(salary_medians.items(), key=lambda item: item[1])
    
            plt.bar(range(len(salary_medians)), [item[1] for item in salary_medians])
            plt.show()
            print(salary_medians)
    
        '''
        计算salary统计量(平均数,中位数,众数,方差,最大值,最小值)
        '''
        def calculate_statistic(self):
            salary_medians = self.get_salary()
    
            print("the min salary is ",min(list(salary_medians.values())))
            print("the max salary is ",max(list(salary_medians.values())))
    
            print("the average salary is ",np.mean(list(salary_medians.values())))
            print("the median salary is ",np.median(list(salary_medians.values())))
            print("the mode salary is ",mode(list(salary_medians.values())))
    
            print("the variance salary is ",np.var(list(salary_medians.values())))
    
        '''
        获取salary并将工资区间转化为中位数
        '''
        def get_salary(self):
            df = pd.read_csv(self.job_info_file)
    
            jobs_salary = df['salary']
            jobs_id = df['job_id']
    
            # job_id以及薪水区间的映射
            salary_ranges = {}
            # job_id以及薪水区间中位数的映射
            salary_medians = {}
    
            for index in range(len(jobs_salary)):
                salary = jobs_salary[index]
                job_id = jobs_id[index]
    
                # 提取salary数字部分作为数组返回
                salary_range = re.findall(r"\d+\.?\d*", salary)
                salary_ranges[job_id] = salary_range
                median = (float(salary_range[0]) + float(salary_range[1])) / 2
                salary_medians[job_id] = median
    
            return salary_medians
    
        '''
        将工资区间分为part_num段,分析出每区间段所侧重的关键字
        '''
    
        def analyze_important_skills_by_salary_distribution(self, interval_num=4):
    
            salary_medians = self.get_salary()
    
            jobs_detail_text = ""
            length = len(salary_medians)
            start_index_in_salary_interval = 0
    
            df = pd.read_csv(self.job_info_file)
            # 加入停用词
            jieba.analyse.set_stop_words("stop_words.txt")
    
            for i in range(interval_num):
                end_index_in_salary_interval = int(length * ((i + 1) / interval_num))
                jobs_detail_list = []
                jobs_id_in_interval = [item[0] for item in
                                       salary_medians[start_index_in_salary_interval:end_index_in_salary_interval]]
    
                # 根据区间job_id获取到相应的job_detail
                for j_id in jobs_id_in_interval:
                    detail = df.job_detail.loc[df.job_id == j_id].iloc[0]
                    jobs_detail_list.append(detail)
    
                text = "".join(jobs_detail_list)
                keywords = jieba.analyse.extract_tags(sentence=text, topK=20, withWeight=True)
                for item in keywords:
                    print(item[0], item[1])
                print("----------------------")
    
                jobs_detail_text+=text
                start_index_in_salary_interval = end_index_in_salary_interval
    
            # 得到job_detail的关键字
            keywords = jieba.analyse.extract_tags(sentence=jobs_detail_text, topK=20, withWeight=True)
            for item in keywords:
                print(item[0], item[1])
            print("----------------------")
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值