• 苏州市java岗位的薪资状况(2)


      上一篇已经统计出了起薪最高的top 10:

      接着玩,把top 10 中所有职位的详细信息爬取下来。某一职位的详情是这样:

      我们需要把工作经验、学历、职能、关键字爬取下来。

     1 from urllib.request import urlopen
     2 from urllib.error import HTTPError
     3 from bs4 import BeautifulSoup
     4 import csv
     5 from itertools import chain
     6 import threading
     7
     8 def load_datas():
     9     '''
    10     从joblist.csv中装载数据
    11     :return: 数据集 datas
    12     '''
    13     datas = []
    14     with open('high10_url.csv', encoding='utf-8') as fp:
    15         r = csv.reader(fp)
    16         for row in r:
    17             datas.append(row[0])
    18     return datas
    19
    20 def get_desc(url):
    21     ''' 爬取职位的详细信息,包括:经验, 学历, 职位, 技能关键字 '''
    22     try:
    23         html = urlopen(url)
    24     except HTTPError as e:
    25         print('Page was not found', e.filename)
    26         return []
    27
    28     job_desc = []  # 职位详情
    29     try:
    30         exp, edu, position, keys = '', '', '', []  # 经验, 学历, 职位, 技能关键字
    31         bsObj = BeautifulSoup(html.read())
    32         contents = bsObj.find('p', {'class': 'msg ltype'}).contents
    33         exp = contents[2].strip()  # 经验
    34         edu = contents[4].strip()  # 学历
    35         print(edu)
    36         a_list = bsObj.findAll('a', {'class': 'el tdn'})
    37         for i, a in enumerate(a_list):
    38             if i == 0:
    39                 position = a.get_text()  # 职位
    40             else:
    41                 keys.append(a.get_text())  # 技能关键字
    42         job_desc.append((exp, edu, position, keys))
    43     except AttributeError as e:
    44         print(e)
    45         job_desc = []
    46     return job_desc
    47
    48 def crawl(urls):
    49     '''
    50     :param urls: 职位详情
    51     '''
    52     print('开始爬取数据...')
    53     job_desc = [get_desc(url) for url in urls]
    54     print('爬取结束')
    55     return job_desc
    56
    57 def save_data(all_jobs, f_name):
    58     '''
    59     将信息保存到目标文件
    60     :param all_jobs: 二维列表,每个元素是一页的职位信息
    61     '''
    62     print('正在保存数据...')
    63     with open(f_name, 'w', encoding='utf-8', newline='') as fp:
    64         w = csv.writer(fp)
    65         # 将二维列表转换成一维
    66         t = list(chain(*all_jobs))
    67         w.writerows(t)
    68         print('保存结束,共{}条数据'.format(len(t)))
    69
    70 urls = load_datas()
    71 job_desc = crawl(urls)
    72 print(job_desc)
    73 save_data(job_desc, 'job_desc.csv')

      high10_url.csv中已经预先存储了top 10的所有64个url。job_desc.csv中的结果如下:

      学历列出现了问题,第5行显示的是“招1人”,实际上这个职位没有学历要求,把所有“招x人”的记录都改成“无要求”。

      接下来可以按照经验、学历、职能分别统计:

    import csv
    import pandas as pd
    import numpy as np
    
    def load_datas():
        '''
        从joblist.csv中装载数据
        :return: 数据集 datas
        '''
        datas = []
        with open('job_desc.csv', encoding='utf-8') as fp:
            r = csv.reader(fp)
            for row in r:
                datas.append(row)
        return datas
    
    def analysis(datas):
        ''' 数据分析 '''
        df = pd.DataFrame({'exp': datas[:, 0],
                           'edu': datas[:, 1],
                           'position': datas[:, 2],
                           'keys': datas[:, 3]})
        count(df, 'exp', '经验') # 按经验统计
        count(df, 'edu', '学历') # 按学历统计
        count(df, 'position', '职位') # 按职位统计
    
    def count(df, idx, name):
        ''' 分组统计 '''
        print(('' + name + '分组').center(60, '-'))
        c = df[idx].value_counts(sort=True)
        print(c)
    
    if __name__ == '__main__':
        # 读取并清洗数据
        datas = np.array(load_datas())
        analysis(datas)

      

      5~7年经验果然是最容易找到高薪职位的,而且用人单位大多要求本科学历。

      职能的统计比较杂乱,高级软件工程师和架构师的岗位较多,项目经理这类职位的薪水一般低于工程师,这也和预计的相同:

      技能关键字看起来并不友好:

      第一条记录很好地反应了技能要求,第二条就没什么用了,这是由于关键字信息是HR自行添加的,大多数HR都不太了解技术,因此也就出现了像第二条那样对本次分析没什么作用的关键字。

      看来得求助于一些分词技术,从职位信息中抽取一些关键字。

      下篇继续,看看哪些技能是抢手的。


      作者:我是8位的

      出处:http://www.cnblogs.com/bigmonkey

      本文以学习、研究和分享为主,如需转载,请联系本人,标明作者和出处,非商业用途! 

      扫描二维码关注公作者众号“我是8位的”

  • 相关阅读:
    zoj 2876 Phone List
    zoj 2829 Beautiful Number
    zoj 2723 Semi-Prime(set)
    zoj 2835 Magic Square(set)
    zoj 2818 Root of the Problem
    zoj 2744 Palindromes
    zoj 1109 Language of FatMouse(map)
    zoj 2724 Windows Message Queue
    zoj 2722 Head-to-Head Match(两两比赛)
    zoj 2727 List the Books
  • 原文地址:https://www.cnblogs.com/bigmonkey/p/11775400.html
Copyright © 2020-2023  润新知