Python 招聘岗位数据可视化

简介: Python 招聘岗位数据可视化

项目背景


最近朋友圈又有小伙伴被降薪、被裁员了。往年金三银四是找工作的好时机,但在今年疫情之下互联网似乎更冷了。为了更好的找到好工作,就要了解企业需要什么样的人才,地区之间人才需求数量,薪资、学历与经验之间的关系等等。本文以拉勾网  Python 岗位数据作为分析。


image.png


获取数据

获取数据比较简单,拉勾网是用 POST 提交 Ajax 请求数据。


image.png


部分爬取代码


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 数据库中


image.png


数据可视化

数据库中杂乱的数据必须经过分析才有意义,使用第三方的 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


微信图片_20220212180435.jpg


image.png


在城市岗位热力图和柱状图中可以看出北上广超一线城市提供了大部分的工作岗位。二三线城市提供的岗位不是很多。


# 主要代码
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")
)


image.png


招聘岗位中本科学历的占比远大于大专、硕士和不限。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"))


年限与薪资


image.png


在上图表中可以看出工作经验与薪资是成正比的,其中 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")


工作类型


image.png


移动互联网行业在招聘上占比大。数据服务、企业服务、金融、电商行业招聘人数较少。


# 主要代码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"))


企业融资


image.png


从融资上市来看上市融资的企业招聘岗位数量还是很多的,不需要融资的企业也占了 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"))


福利时间


image.png


带薪年假、绩效奖金、扁平管理、弹性工作等是多数企业能给员工的福利。


# 主要代码
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")
)


总结

招聘岗位相对来说还是较少的,本科以上、有工作经验的人才可以更快的找到工作。融资上市的企业招聘不在少数。

目录
相关文章
|
1月前
|
机器学习/深度学习 TensorFlow 算法框架/工具
使用Python实现深度学习模型:智能数据隐私保护
使用Python实现深度学习模型:智能数据隐私保护 【10月更文挑战第3天】
98 0
|
8天前
|
数据可视化 数据挖掘 定位技术
Python和Geopandas进行地理数据可视化
【10月更文挑战第22天】本文介绍了如何使用Python和Geopandas进行地理数据可视化和分析,涵盖从准备工作、加载数据、数据探索与处理、地理数据可视化、空间分析与查询到交互式地理数据可视化等内容。通过丰富的代码示例和案例演示,帮助读者掌握地理数据分析的基本方法,为实际应用提供支持。
45 19
|
4天前
|
移动开发 数据可视化 数据挖掘
利用Python实现数据可视化:以Matplotlib和Seaborn为例
【10月更文挑战第37天】本文旨在引导读者理解并掌握使用Python进行数据可视化的基本方法。通过深入浅出的介绍,我们将探索如何使用两个流行的库——Matplotlib和Seaborn,来创建引人入胜的图表。文章将通过具体示例展示如何从简单的图表开始,逐步过渡到更复杂的可视化技术,帮助初学者构建起强大的数据呈现能力。
|
22天前
|
数据采集 JSON 数据处理
抓取和分析JSON数据:使用Python构建数据处理管道
在大数据时代,电商网站如亚马逊、京东等成为数据采集的重要来源。本文介绍如何使用Python结合代理IP、多线程等技术,高效、隐秘地抓取并处理电商网站的JSON数据。通过爬虫代理服务,模拟真实用户行为,提升抓取效率和稳定性。示例代码展示了如何抓取亚马逊商品信息并进行解析。
抓取和分析JSON数据:使用Python构建数据处理管道
|
7天前
|
图形学 Python
SciPy 空间数据2
凸包(Convex Hull)是计算几何中的概念,指包含给定点集的所有凸集的交集。可以通过 `ConvexHull()` 方法创建凸包。示例代码展示了如何使用 `scipy` 库和 `matplotlib` 绘制给定点集的凸包。
16 1
|
8天前
|
JSON 数据格式 索引
Python中序列化/反序列化JSON格式的数据
【11月更文挑战第4天】本文介绍了 Python 中使用 `json` 模块进行序列化和反序列化的操作。序列化是指将 Python 对象(如字典、列表)转换为 JSON 字符串,主要使用 `json.dumps` 方法。示例包括基本的字典和列表序列化,以及自定义类的序列化。反序列化则是将 JSON 字符串转换回 Python 对象,使用 `json.loads` 方法。文中还提供了具体的代码示例,展示了如何处理不同类型的 Python 对象。
|
8天前
|
数据采集 Web App开发 iOS开发
如何使用 Python 语言的正则表达式进行网页数据的爬取?
使用 Python 进行网页数据爬取的步骤包括:1. 安装必要库(requests、re、bs4);2. 发送 HTTP 请求获取网页内容;3. 使用正则表达式提取数据;4. 数据清洗和处理;5. 循环遍历多个页面。通过这些步骤,可以高效地从网页中提取所需信息。
|
1月前
|
数据处理 Python
Python实用记录(十):获取excel数据并通过列表的形式保存为txt文档、xlsx文档、csv文档
这篇文章介绍了如何使用Python读取Excel文件中的数据,处理后将其保存为txt、xlsx和csv格式的文件。
45 3
Python实用记录(十):获取excel数据并通过列表的形式保存为txt文档、xlsx文档、csv文档
|
1月前
|
计算机视觉 Python
Python实用记录(九):将不同的图绘制在一起、将不同txt文档中的数据绘制多条折线图
这篇文章介绍了如何使用Python的OpenCV库将多张图片合并为一张图片显示,以及如何使用matplotlib库从不同txt文档中读取数据并绘制多条折线图。
41 3
Python实用记录(九):将不同的图绘制在一起、将不同txt文档中的数据绘制多条折线图
|
1月前
|
数据可视化 算法 Python
基于OpenFOAM和Python的流场动态模态分解:从数据提取到POD-DMD分析
本文介绍了如何利用Python脚本结合动态模态分解(DMD)技术,分析从OpenFOAM模拟中提取的二维切片数据,以深入理解流体动力学现象。通过PyVista库处理VTK格式的模拟数据,进行POD和DMD分析,揭示流场中的主要能量结构及动态特征。此方法为研究复杂流动系统提供了有力工具。
63 2
基于OpenFOAM和Python的流场动态模态分解:从数据提取到POD-DMD分析