在本次项目中,使用到的第三方库如下:

import requestsimport timeimport randomimport jsonimport pandasimport matplotlib.pyplotimport csvimport numpyimport  WordCloudimport jieba

项目实现流程如下:

一、利用requests库模块进行对招聘网站信息的爬取

代码如下:

import requests
import time
import random
import json
import pandas as pd
import matplotlib.pyplot as plt page_num_max = 3
class Recruitment_info():def __init__(self):self.zhilian_url = 'https://m.zhaopin.com/api/sou/positionlist'def get_page(self,search_content,page_num):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).textreturn htmldef get_data(self,search_content,page_num):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):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):resurt = json.loads(html)resurt = resurt['data']['list']data_list = []for per_info in resurt:data = {'cityId' : per_info['cityId'], 'companyId' : per_info['companyId'], 'companyName' : per_info['companyName'], 'companySize' : per_info['companySize'], 'education' : per_info['education'], 'workName' : per_info['name'], 'publishTime' : per_info['publishTime'], 'salary' : per_info['salary60'], 'welfareLabel' : per_info['welfareLabel'], 'workCity' : per_info['workCity'],'workingExp' : per_info['workingExp'] }data_list.append(data)return data_listdef salve_data_csv(self,df):df.to_csv(path_or_buf='./数据.csv', encoding='gbk')def run(self,*search_content):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) else:df = pd.DataFrame(data_list)self.salve_data_csv(df)return df
spider = Recruitment_info()
df = spider.run('数据分析','数据运营','数据专员','数据')

运行效果如下图:

存储数据的csv文件效果图如下:

二、利用pandas库模块对存储爬取到的招聘数据文件csv进行数据清理和数据分析

代码如下:

import pandas as pd
pd.set_option('display.max_columns', 10)
pd.set_option('display.width',200)
df = pd.read_csv('./数据.csv',encoding='gbk')
def bottom_top(x,num=0):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
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
df['salary_label'] = pd.cut(df.avg,bins=[0,5,10,max(df.avg)],labels=['薪资属于低水平','薪资属于中水平','薪资属于高水平'])
print(df.salary_label.value_counts())
#对教育水平不同学历程度进行统计
count = df.loc[:,'education'].value_counts()
print(count)
#对工作城市不同进行统计
count = df.loc[:,'workCity'].value_counts()
print(count)
print(df.info())
print(df.describe())
print(df.avg.skew())
# 以城市进行分组
df_gb = df.groupby(['workCity'])
# 招聘数据岗位最多的前五个城市
print('以城市进行分组:职位数量前五名:', df_gb.count().sort_values('cityId', ascending=False).head()['cityId'], sep='\n')
# 招聘薪资水平最多的前五个城市
print('以城市进行分组:薪资水平前五名:', df_gb.count().sort_values('salary_label', ascending=False).head()['salary_label'], sep='\n')
# 以教育水平进行分组
df_gb = df.groupby(['education'])
print('以教育水平进行分组:职位数量前五名:', df_gb.count().sort_values('cityId', ascending=False).head()['cityId'], sep='\n')
print('以教育水平进行分组:薪资水平前五名:', df_gb.count().sort_values('salary_label', ascending=False).head()['salary_label'], sep='\n')
# 以工作经验进行分组
df_gb = df.groupby(['workingExp'])
print('以工作经验进行分组:职位数量前五名:', df_gb.count().sort_values('cityId', ascending=False).head()['cityId'], sep='\n')
print('以工作经验进行分组:薪资水平前五名:', df_gb.count().sort_values('salary_label', ascending=False).head()['salary_label'], sep='\n')
# 以薪资水平进行分组
df_gb = df.groupby(['salary'])
print('以薪资水平进行分组:职位数量前五名:', df_gb.count().sort_values('cityId', ascending=False).head()['cityId'], sep='\n')
# 以公司员工数量进行分组
df_gb = df.groupby(['companySize'])
print('以公司员工数量进行分组:薪资水平前五名:', df_gb.count().sort_values('salary_label', ascending=False).head()['salary_label'], sep='\n')
print('以公司员工数量进行分组:工作经验前五名:', df_gb.count().sort_values('workingExp', ascending=False).head()['workingExp'], sep='\n')

运行效果如下图:

三、利用WordCloud库模块和matplotlib库模块实现数据的可视化

(1)词云可视化

代码如下:

from wordcloud import WordCloud
import matplotlib.pyplot as plt
import jieba
path_txt = 'data.txt'
f = open(path_txt,'r',encoding='gbk').read()
cut_text = " ".join(jieba.cut(f))
wordcloud = WordCloud(font_path="C:/Windows/Fonts/simfang.ttf",background_color="white",width=1000,height=880).generate(cut_text)
plt.imshow(wordcloud, interpolation="bilinear")
plt.axis("off")
plt.show()

运行效果如下图:

本图可以看出城市中数量最多的是上海,而学历中数量最多的是本科。

(2)统计图可视化

代码如下:

import matplotlib.pyplot as plt
import pandas as pd
import csv
import matplotlib
import numpy as np
df = pd.read_csv('./数据.csv',encoding='gbk')
df_gb = df.groupby(['workCity'])
def bottom_top(x,num=0):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
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
df['salary_label'] = pd.cut(df.avg,bins=[0,5,10,max(df.avg)],labels=['低','中','高'])
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['font.serif'] = ['SimHei']#多组条形图
df_bar=df_gb.apply(lambda x:x.value_counts('salary_label'))
city_s = df.drop_duplicates('workCity')['workCity']
li1 = []
li2 = []
li3 = []
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.tick_params(axis='x',colors='red')
plt.tick_params(axis='y',colors='red')
plt.legend()
plt.title('各城市数分岗位薪酬分布')
plt.show()#折线图
df_plot = df.loc[df['salary_label']=='高','workingExp'].value_counts()
print(df_plot)
df_plot = pd.DataFrame(data=df_plot)
df_plot['num'] = [0,3,2,4,1]
df_plot = df_plot.sort_values('num')
plt.tick_params(axis='x',colors='red')
plt.tick_params(axis='y',colors='red')
df_plot = df_plot['workingExp'].plot(label = '高')
plt.xlabel("工作经验")
plt.ylabel("岗位个数")
plt.legend()
plt.title('工作经验与岗位个数比例分析折线图')
plt.show()#扇形图
labels='大专','高中','中专/中技','本科','学历不限','硕士' #每一块的标签
sizes=[20,3,5,64,6,2] #所占百分比
explode=(0,0,0,0,0,0) #所对应一块的分离情况
plt.pie(sizes,explode,labels=labels,autopct='%1.1f%%',shadow=True,startangle=90)
plt.axis('equal') #以正圆展示
plt.title('学历比例扇形图')
plt.show()#前10人数最多工作城市水平条形图
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['axes.unicode_minus'] = False
price = [60,27,11,11,10,8,7,7,4,3]
plt.barh(range(10), price, height=0.7, color=['r','b','y','green'], alpha=0.8)      # 从下往上画
plt.yticks(range(10), ["上海","北京","天津 ","大连","广州","深圳 ","杭州","苏州 ","无锡","重庆"])
plt.xlim(1,100)
plt.xlabel("成绩")
plt.ylabel("姓名")
plt.tick_params(axis='x',colors='red')
plt.tick_params(axis='y',colors='red')
for x, y in enumerate(price):plt.text(y + 0.2, x - 0.1, '%s' % y)
plt.title('工作城市与人数分布水平条形图')
plt.show()

运行效果如下图:

本图可以看出上海、北京、天津、大连、广州的职位数最多,这表明了在一线或二线城市找工作会拥有更多的机会。

本图可以看出10年以上工作的岗位个数很少,说明工作经验越丰富的人,他的技术水平越高,就越能适应那些要求更高的岗位。

本图可以看出学历属于本科水平的人数最多,而学历属于硕士水平的人数最少,这表明当前数据人们的学历大多都有本科水平,而有硕士水平的人却寥寥无几。

本图可以看出在上海工作的人数最多,达到了60人,而在重庆工作的人数最少,只有3人。

四、总结

本次项目大概的实现周期在2-3周,所实现的部分功能可能还不够完善,爬取到的数据可能并不是很多,数据分析也不够全面,在以后还会继续努力完善本项目,有经验的小伙伴可以来一起交流交流。

项目:招聘网站信息(获取数据+数据分析+数据可视化)相关推荐

  1. Android 智联招聘网站信息获取

    使用的是Jsoup框架,主要使用的是select函数完成的. #id elements with attribute ID of "id" div#wrap, #logo .cla ...

  2. 线上招聘网站信息数据

    一.数据简介 线上招聘是指各公司将其岗位需求.工作地点.能力要求和薪酬等招聘信息发布在互联网上,供求职者参考,以线上的方式进行招聘.线上招聘网站通过互联网相关技术,集结这些线上招聘信息,帮助雇主和求职 ...

  3. 基于scrapy框架的关于58同城招聘网站信息的爬取

    起因: 学校项目实训,要求我们爬取招聘网站信息并对其进行分析,在此我和大家分享一下关于我爬取58同城招聘网站信息的过程和结果~ 前期准备步骤: 1.搭建环境:首先把scrapy需要的环境搭建好,再次我 ...

  4. 基于scrapy+mongodb的智联招聘网站信息爬取

    本篇内容主要记录博主本人爬取智联招聘网站信息的过程!! 环境:python 3.6.5 pycharm JetBrains PyCharm Community Edition 2018.1 x64 M ...

  5. 大数据项目实战——基于某招聘网站进行数据采集及数据分析(四)

    大数据项目实战 第四章 数据预处理 文章目录 大数据项目实战 学习目标 一.分析预处理数据 1)salary 2)city 3)skillLabels 4)companyLabelList.posit ...

  6. 综合项目:人工智能领域目前职位及薪资现状分析 - 基于主流招聘网站信息

    ~~~~~~~~本文基于对三大主流招聘网站收集的信息进行清洗.处理.转换的基础上,对当前人工智能领域的行业现状进行了简要分析.通过对数据的特征工程处理生成适合于机器学习算法的数据集,并利用数据集对目前 ...

  7. 牛人博客!!!各大招聘网站信息实时查询浏览【转】

    转自:http://www.cnblogs.com/zhaopei/p/4368417.html 阅读目录 效果图: 第一.分析url 智联招聘: 猎聘网: 前程无忧: 第二.用到了HtmlAgili ...

  8. 各大招聘网站信息实时查询浏览

    阅读目录 最近听得较多的跳槽.面试之类的,相信很多园友也开始蠢蠢欲动了,有的甚至早已经开始了.最近我也在琢磨着换工作的事.说得俗套点,人在外面不就为了那么点工资么.现在找工作大部分都是通过在网上投简历 ...

  9. 研华数据采集卡如何采集压力信号转化为数字信号_我所了解的数据-数据分析-数据产品...

    做数据产品经理有一小段时间了,接下来对数据相关来一个阶段总结,以便更好的了解自己的肤浅与不足,方便接下来做改进. 本文大纲: 第一部分 数据 1数据是如何出现的? 公元前4千年,生活在美索不达米亚平原 ...

最新文章

  1. 《因果科学周刊》第4期:因果赋能推荐系统
  2. 【CV秋季划】模型优化很重要,如何循序渐进地学习好?
  3. android sharedUserId 共享用户
  4. 新增房源服务实现之新增房源RESTful接口的开发
  5. c++ double 截取_c选择double小数点后自动截取3位,不...
  6. jsx怎么往js里传参数_Angular、React 当前,Vue.js 优劣几何?
  7. Python报错:PermissionError: [Errno 13] Permission denied 解决方案详解
  8. (06)VHDL实现计数器
  9. parallels desktop 启动过失败_使用u启动软件制作启动盘时注意哪些【详细介绍】...
  10. 不再惧怕!二叉树结构相关算法总结 | 原力计划
  11. oracle sql 取日期,Oracle SQL日期及日期格式获取命令,oraclesql
  12. 电路复习——集成运算放大器电阻电路
  13. 二阶魔方万能还原公式_二阶魔方复原方法
  14. 【图灵奖得主】Alfred V. Aho 哥伦比亚大学
  15. 大型机、小型机、x86架构以及ARM架构服务器的区别大型机、小型机、x86架构以及ARM架构服务器的区别
  16. c语言pow函数原型_c语言pow的用法
  17. 光功率 博科交换机_FAQ-交换机是否支持查看光模块型号及收发光功率
  18. 医院运维管理平台(模板)
  19. 知道这六种拍摄技巧,让你玩转夕阳拍摄
  20. Python-OpenCV自适应阈值图像处理使用adaptiveThreshold函数获取图像轮廓

热门文章

  1. Java Tesseract-OCR 4.0 windows 测试图像识别
  2. 怎样解决电信网通南北互通问题?
  3. 从一篇AMA揭幕单慢雾安全技术
  4. 任何播放器无法播放视频
  5. Jenkins集成GitLab自动化部署
  6. 【雕爷学编程】Arduino动手做(87)---ULN2003步进电机模组
  7. java aop 环绕通知_SpringAOP 环绕通知避坑
  8. 【Gstreamer】PUSH/PULL mode生动解析
  9. 彻底卸载navicat
  10. FigDraw 5. SCI 文章绘图之柱状图 (Barplot)