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

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

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

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

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

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

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

 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中的结果如下:

  

  

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

  学历列出现了问题,第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)

  

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

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

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

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

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

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

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

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

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


  作者:我是8位的

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

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

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

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

上一篇:java模拟实现ArrayList


下一篇:jquery ajax request payload和fromData请求方式