51job爬虫职位数据分析实战

本文数据来源:
scrapy爬虫实战 - 51job爬虫职位爬取

使用到的模块包括:
pandas,numpy,matplotlib,pymysql,re,pyecharts,collections,jieba
如果没有以上任何一个模块,请自行安装

国际惯例:导入模块

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import pymysql,re
import pyecharts.charts as pc
from pyecharts import options as opts
from pyecharts.globals import ThemeType
%matplotlib inline

加载数据

# 创建mysql数据库对象
conn = pymysql.connect("localhost","root","123456","51job")
job_data = pd.read_sql("select * from information",conn)
job_data.head()

在这里插入图片描述

数据清洗

  • 筛选出包含爬虫,挖掘,抓取的标题
# 复制数据
data = job_data.loc[job_data["title"].str.contains("爬虫|挖掘|抓取")]
data.head()
  • 过滤掉工资为None的数据
notnull_data = data.loc[data["salary"].notnull()]
notnull_data.head()
  • 工资转换成整数型
# 工资转化成整数型并区分出单位
temp1 = notnull_data["salary"].str.split("/",expand=True)
def change(s):
    
    if s[-1] == "千":
        unit = 1000
    elif s[-1] == "万":
        unit = 10000
    else:
        unit = 1
    segment = s.split("-")
    try:
        return f"{float(segment[0])*unit}-{float(segment[1][:-1])*unit}"
    except Exception as err:
        return f"{s[:-1]}-{s[:-1]}"
temp1[0] = temp1[0].apply(change)
temp1.columns = ["h","time_unit"]
temp2 = temp1.join(temp1["h"].str.split("-",expand=True))
temp2.drop("h",axis=1,inplace=True)
temp2.columns = ["time_unit","lowest","highest"]
temp2["highest"] = temp2["highest"].astype("float").astype("int")
temp2["lowest"] = temp2["lowest"].astype("float").astype("int")
# 合并到数据中
data = notnull_data.join(temp2)
data.head()

在这里插入图片描述
*假装我是一条分割线 假装我是一条分割线 假装我是一条分割线 假装我是一条分割线 *

主要分析目标:

  • 1.最低和最高月工资平均达到什么水平
  • 2.月工薪分布图
  • 3.工资最高的公司
  • 4.工资与地区关系
  • 5.哪个城市招聘爬虫较多
  • 6.职位要求热门词

1.最低和最高工资平均达到什么水平

# 画布设置
plt.figure(figsize=(10,8),dpi=80)
plt.grid(alpha=0.3)

# 绘制箱型图
a = plt.boxplot(
    x=[data.lowest.tolist(),data.highest.tolist()], # 数据
    labels=["lowest","highest"], # 标签
    showmeans=True, # 显示均值点
)

在这里插入图片描述

# 求出异常值(这里假设工资大于2倍标准差为异常值)
lowout = (data.lowest.std()) * 2
highout = (data.highest.std()) * 2
temp = data.loc[data["lowest"] < lowout].loc[data["highest"] < highout]
temp.describe()

在这里插入图片描述

2.月工薪分布图

  • 柱状图
# 复制数据
datum = temp.loc[temp["time_unit"]=="月"]
datum = datum[["lowest","highest"]]

# 工资分段
bins = [i for i in range(datum.lowest.min(),datum.highest.max()+1,1000)]
cut1 = pd.cut(datum.lowest,bins=bins).value_counts(sort=False)
cut2 = pd.cut(datum.highest,bins=bins).value_counts(sort=False)
def mapping(s):
    return f"{s.left}-{s.right}"
cut1.index = cut1.index.map(mapping)
cut2.index = cut2.index.map(mapping)
# 绘图
bar = pc.Bar()
bar.add_xaxis(cut1.index.tolist())
bar.add_yaxis("lowest",cut1.values.tolist())
bar.add_yaxis("highest",cut2.values.tolist())
bar.set_global_opts(
    datazoom_opts=opts.DataZoomOpts(is_show=True)
)
bar.render_notebook()

在这里插入图片描述

  • 饼图
x_data = cut1.index.tolist()
y_data = cut1.values.tolist()
z_data = cut2.values.tolist()

pie = pc.Pie(init_opts=opts.InitOpts(width="800px", height="800px"))
pie.add(
    # 系列名称
    series_name="lowest",
    # 数据对
    data_pair=[list(z) for z in zip(x_data, y_data)],
    # 半径(内半径,外半径)
    radius=["20%", "30%"],
    # 数据标签
    label_opts=opts.LabelOpts(is_show=True)
)
pie.add(
    # 系列名称
    series_name="highest",
    # 数据对
    data_pair=[list(z) for z in zip(x_data, z_data)],
    # 半径(内半径,外半径)
    radius=["60%", "70%"],
    # 数据标签
    label_opts=opts.LabelOpts(is_show=True)
)
pie.set_global_opts(
    # 图例配置
    legend_opts=opts.LegendOpts(is_show=False)
)
pie.set_series_opts(
    # 触发提示效果配置
    tooltip_opts=opts.TooltipOpts(
        # 触发效果
        trigger="item",
        # 触发效果格式化
        formatter="{a} <br/>{b}: {c} ({d}%)"
    )
)
pie.render_notebook()

在这里插入图片描述

3.工资最高的公司

low = temp.sort_values(by="lowest",ascending=False)
high = temp.sort_values(by="highest",ascending=False)
print(f"最低工资最高的公司: {low.company.values[0]} - {low.lowest.values[0]}元/月")
print(f"最高工资最高的公司: {high.company.values[0]} - {high.highest.values[0]}元/月")
>> 最低工资最高的公司: 浙江杭州湾信息港高新建设开发有限公司 - 14000/>> 最高工资最高的公司: 国研科技集团有限公司 - 25000/

4.工资与地区关系

# 提取城市和工资
city_sal = temp[["city","lowest","highest"]]
# 按 '-' 分割地区,保留城市那一列
city = city_sal.city.str.split("-",expand=True)[0]
# 合并
city_sal = city_sal.join(city)
# 删除原有的city
city_sal.drop("city",axis=1,inplace=True)
# 修改列名
city_sal.columns = ["lowest","highest","city"]
# 按城市分组,统计最低工资和最高工资均值
city_sal_mean = city_sal.groupby("city").mean().sort_values("lowest")
# 转换int类型
city_sal_mean = city_sal_mean.astype("int")
# 绘图
city_sal_mean_bar = pc.Bar(init_opts=opts.InitOpts(width="1000px",height="700px",theme=ThemeType.DARK))
# x轴
city_sal_mean_bar.add_xaxis(city_sal_mean.index.tolist())
# y轴
city_sal_mean_bar.add_yaxis("lowest",city_sal_mean.lowest.values.tolist(), stack="stack1")
city_sal_mean_bar.add_yaxis("highest",city_sal_mean.highest.values.tolist(),stack="stack1")
# 数据标签
city_sal_mean_bar.set_series_opts(label_opts=opts.LabelOpts(position="insideTop"))
# 配置标题和可拉伸滚动条
city_sal_mean_bar.set_global_opts(
    title_opts=opts.TitleOpts(title="工资与地区关系"),
    datazoom_opts=opts.DataZoomOpts(is_show=True)
)
# notebook中显示
city_sal_mean_bar.render_notebook()

在这里插入图片描述

5.哪个城市招聘爬虫较多

# 复制数据
datum = data[["title","city"]]
city_datum = datum.join(datum.city.str.split("-",expand=True)[0])
city_datum.drop("city",axis=1,inplace=True)
city_datum.columns = ["count","city"]
temp = city_datum.groupby("city").count()

在这里插入图片描述

  • 绘制地图
city_map = pc.Map()
city_map.add(
    series_name="频次",
    data_pair=[i for i in temp["count"].to_dict().items()],
    maptype="china-cities",
    # 是否显示地理名称
    label_opts=opts.LabelOpts(is_show=False),
    is_map_symbol_show=False
)
city_map.set_global_opts(
    title_opts=opts.TitleOpts("city of china"),
    visualmap_opts=opts.VisualMapOpts(
        min_=0,
        max_=70,
        # 是否分段
        is_piecewise=True
    )
)
city_map.render_notebook()

在这里插入图片描述

6.职位要求热门词

import jieba
from collections import Counter
demand = data.demand
text = "".join(demand.tolist())
text = re.sub(r"\r\n","",text)
cut_text = jieba.lcut(text)
cut_text = [i for i in cut_text if len(i) > 1]
words = Counter(cut_text).most_common(300)
wd = pc.WordCloud()
wd.add(
    series_name="",
    data_pair=words,
    word_size_range=[12, 55],
    mask_image=r"e:\files\11.jpg"
)
wd.set_global_opts(title_opts=opts.TitleOpts(title="职位要求热门词"))
wd.render_notebook()

在这里插入图片描述

总结:(仅参考51job爬虫职位)

  • 实际有效统计数量224条(排除掉某些非爬虫相关的职业)
  • 最低工资平均7867元,最高工资平均13020,可能受疫情影响,平均工资有所下滑
  • 最低月薪在9500-10000居多,共有68个统计,占比31.63%,最高工资14500-15500居多,共有59个统计数据,占比27.44%
  • 最低工资最高的公司: 浙江杭州湾信息港高新建设开发有限公司 - 14000元/月
  • 最高工资最高的公司: 国研科技集团有限公司 - 25000元/月
  • 最低工资均值前三甲: 杭州(9555)、深圳(9182)、上海(9040)
  • 最高工资均值前三甲: 济南(18000)、东莞(15000)、佛山(15000)
  • 聘请数统计前三甲: 深圳(64)、广州(44)、上海(41)

单从数据上来看,爬虫相关职位薪资也达到理想中的水平,毕竟不是什么高科技,从数量上来看,可算是热门行列吧!

好了,今天分享就到这,如果这篇文章对你有所帮助,麻烦动动鼠标,来个国际手势👍,谢谢

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值