本文数据来源:
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)
单从数据上来看,爬虫相关职位薪资也达到理想中的水平,毕竟不是什么高科技,从数量上来看,可算是热门行列吧!
好了,今天分享就到这,如果这篇文章对你有所帮助,麻烦动动鼠标,来个国际手势👍,谢谢