项目背景
最近朋友圈又有小伙伴被降薪、被裁员了。往年金三银四是找工作的好时机,但在今年疫情之下互联网似乎更冷了。为了更好的找到好工作,就要了解企业需要什么样的人才,地区之间人才需求数量,薪资、学历与经验之间的关系等等。本文以拉勾网 Python 岗位数据作为分析。
获取数据
获取数据比较简单,拉勾网是用 POST 提交 Ajax 请求数据。
部分爬取代码
def crawler(self): headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36', 'Host': 'www.lagou.com', 'Referer': 'https://www.lagou.com/jobs/list_python/p-city_0?&cl=false&fromSearch=true&labelWords=&suginput=', 'Cookie': 'cookie', 'X-Anit-Forge-Code': '0', 'X-Anit-Forge-Token': 'None', 'X-Requested-With': 'XMLHttpRequest' } page = 0 totalCount = 1 resultSize = 0 while (page * resultSize) <= totalCount: page = page + 1 url = "https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false" datas = { 'first': 'false', 'pn': page, 'kd': 'python' } if page == 1: datas['first'] = 'true' html = requests.post(url, headers=headers, data=datas) result = html.json() if page == 1: totalCount = result['content']['positionResult']['totalCount'] resultSize = result['content']['positionResult']['resultSize'] jobs = result['content']['positionResult']['result'] for job in jobs: job_array = [job['positionName'], job['workYear'], job['salary'], job['city'], job['education'], job['positionAdvantage'], "|".join(job['companyLabelList']), job['financeStage'], job['companySize'], job['industryField'], job['firstType']] # 存入数据库 self.cursor.execute(self.sql, tuple(job_array)) self.conn.commit() r = random.randint(15, 30) time.sleep(r)
把抓取的数据存入 Mysql 数据库中
数据可视化
数据库中杂乱的数据必须经过分析才有意义,使用第三方的 pyecharts 模块 ( https://github.com/pyecharts/pyecharts ) 将招聘数据可视化。
安装 pyecharts
pip3 install pyecharts -U # 全球国家地图pip3 install echarts-countries-pypkg# 中国省级地图pip3 install echarts-china-provinces-pypkg# 中国市级地图pip3 install echarts-china-cities-pypkg # 缺少提示安装pip3 install pyecharts_snapshot
在城市岗位热力图和柱状图中可以看出北上广超一线城市提供了大部分的工作岗位。二三线城市提供的岗位不是很多。
# 主要代码 sql = 'select city, count(1) counts from jobs group by city' results = self.query(sql) c = ( Geo() .add_schema(maptype="china") .add( "城市热力图", list(results), type_=ChartType.HEATMAP, ) .set_series_opts(label_opts=opts.LabelOpts(is_show=False)) .set_global_opts( visualmap_opts=opts.VisualMapOpts(), ).render("拉钩城市热力图.html") ) sql = 'select city,counts from (select city, count(1) counts from jobs group by city) a order by counts desc limit 20' results = self.query(sql) citys = [] values = [] for row in results: citys.append(row[0]) values.append(row[1]) c = ( Bar() .add_xaxis(citys) .add_yaxis("各城市的招聘数量 Top 20", values) .set_global_opts( xaxis_opts=opts.AxisOpts(name_rotate=60, name="城市", axislabel_opts={"rotate": 45}) ).render("拉钩城市招聘图.html") )
招聘岗位中本科学历的占比远大于大专、硕士和不限。1-5 年工作经验的本科人才能更快的找到工作,5-10年工作经验的岗位较少。
# 主要代码sql = 'select education,count(1) counts from jobs group by education'results = self.query(sql)c = ( Pie() .add("", list(results)) .set_global_opts(title_opts=opts.TitleOpts(title='学历占比')) .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}")) .render("拉勾学历.html")) sql = 'select workYear,count(1) counts from jobs group by workYear'results = self.query(sql)c = ( Pie() .add("", list(results)) .set_global_opts(title_opts=opts.TitleOpts(title='工作经验占比')) .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c},{d}%")) .render("拉勾工作年限.html"))
年限与薪资
在上图表中可以看出工作经验与薪资是成正比的,其中 1-3 年工作经验薪资在 10K 到 25K之间,3-5年的在 10K 到 30K 之间, 5-10 年的在 15K 到 35K 之间。3-10 年工作经验的最高薪资可以达到 60K。
# 主要代码sql = 'SELECT workYear,replace(salary,\'k\',\'\') s FROM jobs group by workYear,salary order by workYear'results = self.query(sql)sum = {}for r in results: rs = r[1].split('-') a = sum.get(r[0], []) a.extend(rs) sum[r[0]] = a for k in sum: numbers = list(map(int, sum[k])) v = list(set(numbers)) sum[k] = v print(list(sum.values())) c = Boxplot()c.add_xaxis(list(sum.keys()))c.add_yaxis("薪资与工作经验", c.prepare_data(list(sum.values())))c.set_global_opts(title_opts=opts.TitleOpts(title="薪资与工作经验"))c.render("拉勾薪资.html")
工作类型
移动互联网行业在招聘上占比大。数据服务、企业服务、金融、电商行业招聘人数较少。
# 主要代码sql = 'select industryField from jobs'results = self.query(sql)rows = []for row in results: r = row[0].replace(',', ' ').replace('丨', ' ').replace('、', ' ') rows.extend(r.split(' '))sum = {}for r in rows: num = sum.get(r, 0) + 1 sum[r] = numtup = sorted(sum.items(), key = lambda kv:(kv[1], kv[0]),reverse=True)sum = {}for k, v in tup[0:20]: sum[k + str(v)] = vlocation = list(sum.keys())values = list(sum.values()) c = ( PictorialBar() .add_xaxis(location) .add_yaxis( "", values, label_opts=opts.LabelOpts(is_show=False), symbol_size=18, symbol_repeat="fixed", symbol_offset=[0, 0], is_symbol_clip=True, symbol=SymbolType.ROUND_RECT, ) .reversal_axis() .set_global_opts( title_opts=opts.TitleOpts(title="热门行业"), xaxis_opts=opts.AxisOpts(is_show=False), yaxis_opts=opts.AxisOpts( axistick_opts=opts.AxisTickOpts(is_show=False), axisline_opts=opts.AxisLineOpts( linestyle_opts=opts.LineStyleOpts(opacity=0) ), ), ) .render("拉勾行业.html"))
企业融资
从融资上市来看上市融资的企业招聘岗位数量还是很多的,不需要融资的企业也占了 30% 的比例,未融资的企业只有 12% 左右。
results = self.query('select companySize,count(1) counts from jobs group by companySize')c = ( Pie() .add("", list(results)) .set_global_opts(title_opts=opts.TitleOpts(title='企业大小')) .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c},{d}%")) .render("拉勾企业大小.html"))
福利时间
带薪年假、绩效奖金、扁平管理、弹性工作等是多数企业能给员工的福利。
# 主要代码 sql = 'select positionAdvantage,companyLabelList from jobs' results = self.query(sql) data = {} for row in results: # 去掉特殊符号 positionStr = re.sub('\W+', ' ', row[0]) labelStr = re.sub('\W+', ' ', row[1]) a = positionStr.split(' ') b = labelStr.split(' ') a.extend(b) for i in a: data[i] = data.get(i, 0) + 1 sum = [] for k in data: sum.append((k,data[k])) ( WordCloud() .add(series_name="热点分析", data_pair=sum, word_size_range=[6, 66]) .set_global_opts( title_opts=opts.TitleOpts( title="热点分析", title_textstyle_opts=opts.TextStyleOpts(font_size=23) ), tooltip_opts=opts.TooltipOpts(is_show=True), ) .render("拉勾福利.html") )
总结
招聘岗位相对来说还是较少的,本科以上、有工作经验的人才可以更快的找到工作。融资上市的企业招聘不在少数。