爬取智联招聘招聘信息,对数据分析行业目前就业形式进行数据分析,大体流程如下:
    1.通过requests模块爬取指定的智联招聘信息。
    2.用pandas进行数据清洗。
    3.用matplotlib进行数据的可视化。

导入需要用到的包:

import requests
import time
import random
import json
import pandas as pd
import matplotlib.pyplot as plt

第一部分

爬虫

该网址爬取到第三页需要验证登录,需要爬取大量数据的朋友可以添加个cookie验证。数据量变大也不影响后面进行数据分析。

访问是Ajax请求,需要用到post请求附带Request Payload信息才能拿到数据。通过断点,找到对应的js加密,分析数据加密方式,模拟加密即可~

# 爬取的页数,爬取前三页,更多爬取需要cookie
page_num_max = 3class Recruitment_info():"""以智联招聘爬取全国各地相应职业招聘信息"""def __init__(self):# 智联招聘搜索网址,跳过登录self.zhilian_url = 'https://m.zhaopin.com/api/sou/positionlist'def get_page(self,search_content,page_num):"""获取网址,返回对应html。该网页是post请求"""# 拼接网址,自定义搜索内容url = self.zhilian_urlheaders = {'user-agent':self.get_ua()}data = self.get_data(search_content,page_num)html = requests.post(url=url,headers=headers,data=data).text# 调试# print(f"get_page successful,url:{url} \n html:{html}")return html# 根据断点,找到加密方式。def get_data(self,search_content,page_num):"""生成动态的Request Payload信息"""t = "0123456789abide"d = 'XXXXXXXX-XXXX-4XXX-XXXX-XXXXXXXXXXXX'for i in range(35):t_rd = random.choice(t)d = d.replace('X', t_rd, 1)data = {'S_SOU_FULL_INDEX': search_content,'S_SOU_WORK_CITY': "489",'at': "",'channel': "baidupcpz",'d': d,  # 每次请求都会变,动态加载。'eventScenario': "msiteSeoSearchSouList",'pageIndex': page_num,'pageSize': 20,'platform': 7,'rt': "",'utmsource': "baidupcpz",}return json.dumps(data)def get_ua(self):"""user-agent池,返回随机ua"""ua_list = ['Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 2.0.50727; SLCC2; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; Tablet PC 2.0; .NET4.0E)','Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; InfoPath.3)','Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0','Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; .NET4.0E)','Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Mobile Safari/537.36']return random.choice(ua_list)def Data_cleaning(self,html):'''将收集到的js数据进行清洗'''resurt = json.loads(html)resurt = resurt['data']['list']data_list = []for per_info in resurt:data = {# 'cityDistrict' : per_info['cityDistrict'], # city 城市'cityId' : per_info['cityId'], # cityid 城市id'companyId' : per_info['companyId'], # companyId 公司id'companyName' : per_info['companyName'], # 'companyName' 公司名称'companySize' : per_info['companySize'], # 公司大小'education' : per_info['education'], # 'education' 教育'workName' : per_info['name'], # 'name' 公司性质'publishTime' : per_info['publishTime'], # 'publishTime' 发布时间'salary' : per_info['salary60'], # 'salary60' 薪资'welfareLabel' : per_info['welfareLabel'], # 'welfareLabel' 工作福利'workCity' : per_info['workCity'], # 'workCity' 工作地点(省)'workingExp' : per_info['workingExp'] # 工作经验}data_list.append(data)return data_listdef salve_data_csv(self,df):"""将数据保存至本地的CSV"""df.to_csv(path_or_buf='./数据.csv', encoding='gbk')def run(self,*search_content):"""控制整个代码运行"""# 收集3页数据data_list = []for content in search_content:print('正在爬取',content)for num in range(page_num_max):# 获取网页源码print('正在爬取第%d页'%(num+1))html = self.get_page(content,num+1)# 数据清洗data_list.extend(self.Data_cleaning(html))time.sleep(random.random()*5) # 休息时间# 生成dataframe方便后续数据操作else:df = pd.DataFrame(data_list)self.salve_data_csv(df)return df# 爬虫和初步清洗
spider = Recruitment_info()
df = spider.run('数据分析','数据运营','数据专员','数据')

以上代码执行完毕我们会得到一个 数据.csv,看起来还不错,我们进行下一个部分。

第二部分

数据分析

由于我们在爬虫阶段已经将数据保存至了CSV,所以直接用pandas中函数直接读取CSV即可,将爬虫注释避免每次运行占用资源。

pandas默认的列和宽度较少不便观看,通过set_option调整最大列数为10,整个列宽为200。

# 设置显示多列数据
pd.set_option('display.max_columns', 10) # 不限列数
pd.set_option('display.width',200) # 读取数据
df = pd.read_csv('./数据.csv',encoding='gbk')

数据清理

爬取的数据较乱,没有可以直接用来分析的数据,下面我们进行清理。

分列

薪资将会是一个重要指标,我们先进行清理,将salary列分成最低工资bottom和最高工资top,再进行平均计算。

# 定义一个进行数据清理的函数
def bottom_top(x,num=0):"""将每行工资数据进行清理,将工资统一以K为单位。分割成两列返回指定的列,num=0为最低列、num=1为最高列"""if len(x.split('-')) >1:x = x.split('-')[num]if x.find('千') != -1:x=float(x[0:x.find('千')])elif x.find('万') != -1:x=float(x[0:x.find('万')])*10return x# 用apply将函数应用到salary的每一行数据
df['bottom'] = df.salary.apply(lambda x : bottom_top(x,0))
df['top'] = df.salary.apply(lambda x : bottom_top(x,1))# 增加平均值列
df['avg'] = (df['bottom']+df['top'])/2

切片

这样我们就会得到三个新的列,我们再将工资划分成3个等级,以0-5k为“低”,5-10k为“中”,10k以上为“高”。

# 对薪资水平进行切片处理,划分为低、中、高作为新增一列salary_label
df['salary_label'] = pd.cut(df.avg,bins=[0,5,10,max(df.avg)],labels=['低','中','高'])
print(df.salary_label.value_counts()) # 中 134 高 56 低 38

关于数据岗位的薪资还是不错的,结果如图:

分析

再做一些简单的描述性数据分析

# 查看数据类型
print(df.info())# 查看数据描述统计
print(df.describe())# 查看偏度
print(df.avg.skew())

其中describe和skew结果如下:

从初步的分析来看,全国对于数据分析行业,平均薪资为9.8k,中位数为7k,同时skew=2.8可以看出数据正偏(右偏)分布,说明有少部分工资很高的岗位拉高了平均值。

# 以城市进行分组
df_gb = df.groupby(['workCity'])# 招聘数据岗位最多的前五个城市
print('职位数量前五名:', df_gb.count().sort_values('cityId', ascending=False).head()['cityId'], sep='\n')

结果如下:

第三部分

使用堆积柱状图来显示每个城市的数据岗位数和工资范围

我们设置字体设置为黑体,不然会有乱码出现

# 下面开始用matplotlib作图
# 设置字体编码,防止乱码
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['font.serif'] = ['SimHei']
# 堆积柱状图以每个城市薪资低中高进行堆积
df_bar=df_gb.apply(lambda x: x.value_counts('salary_label'))# 将原表city去重
city_s = df.drop_duplicates('workCity')['workCity']
# 建立三个表的y值 有的城市低中高有缺失,只能以城市分组
li1 = []
li2 = []
li3 = []
# 用来做为堆积柱状图的bottom,避免柱状图显示出错
li12 = []
for city in city_s:li1.append(df_bar[city]['低'])li2.append(df_bar[city]['中'])li3.append(df_bar[city]['高'])li12.append(df_bar[city]['中']+df_bar[city]['低'])# 进行条形图的堆叠
plt.bar(x=city_s,height=li1,label = '低')plt.bar(x=city_s,height=li2,bottom=li1,label = '中')plt.bar(x=city_s,height=li3,bottom=li12,label = '高')# 设置坐标轴
plt.xlabel("城市")
plt.ylabel("职位数")# 显示标签,标题
plt.legend()
plt.title('各城市数分岗位薪酬分布')
# 显示图表
plt.show()

最后我们得出柱状图,显然一见对于数据岗位,北京、深圳、武汉、成都较为多,北京的高工资岗位相对来说最多。

折线图展示工资为“高”的岗位工作经验要求

# 以工资为“高”进行筛选,计算不同工作年限工作岗位个数
df_plot = df.loc[df['salary_label']=='高','workingExp'].value_counts()
print(df_plot)

可以看出3-5年的数据岗位需求最大,如图:

我们进行排序和可视化

# 进行排序
df_plot = pd.DataFrame(data=df_plot)
df_plot['num'] = [0,3,2,4,1,5] # 根据不限,无经验,1-3,3-5,5-10,10以上排序
df_plot = df_plot.sort_values('num')# 可视化
df_plot = df_plot['workingExp'].plot(label = '高')plt.xlabel("工作经验")
plt.ylabel("岗位个数")
plt.legend()
plt.show()

可以判断出,数据岗位的工作年限黄金段在于3-5年 。

        以上就是本章全部内容了,由于数据量太少,分析的很片面,有兴趣的朋友可以将数据源获取加大,结果更加准确~

        有问题的可以私信我~

爬取招聘信息并进行数据分析及可视化相关推荐

  1. idea爬虫爬取招聘信息,大数据

    某工厂来学校培训大数据爬虫,先提供个网页 <%@ page language="java" import="java.util.*" pageEncodi ...

  2. 基于SpringBoot框架Wbe Magic爬虫框架爬取招聘信息项目(1)

    涉及的技术点:SpringBoot框架.Web Magic爬⾍框架.MySQL.mybatis. 使用语言:Java. 使用工具:idea. 本篇文章主要讲解搭建项目 以及 如何将页面数据输出打印到i ...

  3. 【记录爬虫实战过程】入门学习·详细过程·爬取天气信息并通过pyecharts进行可视化展示1

    文章目录 前言 正文 1.导入对应模块 2.确定爬取的网站 3.得到数据 4.数据处理 5.将所得数据写入CSV 完整代码 补充:数据可视化 前言 入门学习这个部分是跟着b站教学视频做的,记录了所有过 ...

  4. (78)--用框架爬取招聘信息

    (78)--用scrapy框架简单爬取赶集网信息 # main.py from scrapy import cmdlinecmdline.execute('scrapy crawl spider_ga ...

  5. python爬取招聘信息_python 爬取boss直聘招聘信息实现

    原标题:python 爬取boss直聘招聘信息实现 1.一些公共方法的准备 获取数据库链接: importpymysql ''' 遇到不懂的问题?Python学习交流群:821460695满足你的需求 ...

  6. python3小项目——爬取招聘信息(智联招聘)

    2017年6月,花了大概一周的时间学习了以下内容,并基于此写了一个小项目.这里对其进行总结,说明其中遇到的问题和解决方案以及下一步计划. 学习的内容和网址: 斯巴达网站 斯巴达视频 python零基础 ...

  7. xpath 解析之爬取招聘信息

    文章目录 一.引子 环境安装 解析步骤 二.xpath 实战 爬取拉勾网 Python 岗位信息 Analysis Code 一.引子 xpath 是 XML 的路径语言,通俗一点讲就是通过元素的路径 ...

  8. Python 爬取招聘网站数据,利用 tableau 可视化交互大屏,指导你如何学习、找工作!

    作者:Huang supreme 来源链接:https://blog.csdn.net/weixin_41261833/article/details/104924038   如果觉得文章写得好,如果 ...

  9. python抓取招聘数据_Python爬取招聘网站数据并做数据可视化处理

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 以下文章来源于青灯编程 ,作者:清风 前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有 ...

  10. python小爬虫(爬取职位信息和博客文章信息)

    1.python爬取招聘信息 简单爬取智联招聘职位信息(仅供学习) # !/usr/bin/env python # -*-coding:utf-8-*- """ @Au ...

最新文章

  1. java bat 运行 jar文件_运行bat文件启动java的jar且不弹出DOS窗口,后台运行java的jar包...
  2. Spring框架使用规范和IOC的开发
  3. 目标跟踪:CamShift算法
  4. VSCode生成.vue模版
  5. ubuntu下安装kde Plasma
  6. c++学习笔记之异常
  7. 自由存储区和堆的区别_区块链发展阶段:IPFS和Filecoin赋能分布式存储
  8. get_metrology_object_measures获取测量区域和计量模型的计量对象的边缘位置结果
  9. MySQL 如何实现 Oracle 的 row_number() over() 分组排序功能
  10. emui换鸿蒙内核,华为EMUI 11.1三月上线,安卓内核替换为鸿蒙内核
  11. 【Paper-Attack】Attacking Graph-Based Classification without Changing Existing Connections
  12. 产品经理高质量产物的五步思维法
  13. Linux 容器 vs 虚拟机 —— 谁更胜一筹
  14. 《结队-贪吃蛇-项目进度》
  15. rocketmq消费
  16. wps页码从指定页开始_wps怎么自动生成页码以及设置页码从第三页开始
  17. 如何在服务器上上传手游源码,【仙变3手游】跨服服务端游戏源码+架设教程+双端+后台...
  18. Python处理QXDM抓取log
  19. c语言立体爱心会跳动,c语言编程实例——小球跳动
  20. keil MDK5 无法 Go To Definition Of

热门文章

  1. 群晖 DS412+ NAS 网络存储器详尽功能应用评测
  2. 医学影像常用Python包
  3. 以往WiFi的最大痛点,终于被WiFi 7给解决掉了
  4. java的GUI:个人所得税计算
  5. 深度学习 | 误差反向传播法
  6. Egret MovieClip2
  7. Shiro从入门到实战(整合进SpringBoot)
  8. 光波传输的角谱理论【理论,实例及matlab代码】
  9. 算术平方根的整数部分(简单)*求平方根的三种方法**整数与小数取绝对值*
  10. 2017-2018 年终总结