基于python的招聘网站分析

立项背景:通过使用招聘网站的体验,发现对现在IT市场主流人才和技术需求缺乏宏观的掌握。

项目目标:通过运用python爬虫技术,爬取大型主流招聘网站关于大数据人才的需求,并通过后台分析,最终以玫瑰图,漏斗图,地图的形式展示当下市场主要需求。

项目流程图

51job_view.py

import urllib.request
import xlwt              #使用xlwt模块写入Excel文件
import re                #正则表达式
import urllib.parse      #parse模块的作用:url的解析,合并,编码,解码
import time              #时间模块
#模拟浏览器
header={'Host':'search.51job.com','Upgrade-Insecure-Requests':'1','User-Agent':'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.80 Mobile Safari/537.36'
}
def getfront(page,item):       #page是页数,item是输入的字符串result = urllib.parse.quote(item)                    #先把字符串转成十六进制编码ur1 = result+',2,'+ str(page)+'.html'ur2 = 'https://search.51job.com/list/000000,000000,0000,00,9,99,'res = ur2+ur1                                                          #拼接网址a = urllib.request.urlopen(res)html = a.read().decode('gbk')          # 读取源代码并转为unicodereturn html
def getInformation(html):#compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用。reg = re.compile(r'class="t1 ">.*? <a target="_blank" title="(.*?)" href="(.*?)".*? <span class="t2"><a target="_blank" title="(.*?)" href="(.*?)".*?<span class="t3">(.*?)</span>.*?<span class="t4">(.*?)</span>.*?<span class="t5">(.*?)</span>.*?',re.S)#匹配换行符items=re.findall(reg,html)return items
#新建表格空间
excel1 = xlwt.Workbook()
#新建一个sheet,设置单元格格式,cell_overwrite_ok=True防止对一个单元格重复操作引发的错误
sheet1 = excel1.add_sheet('Job', cell_overwrite_ok=True)
sheet1.write(0, 0, '序号')
sheet1.write(0, 1, '职位')
sheet1.write(0, 2, '公司名称')
sheet1.write(0, 3, '公司地点')
sheet1.write(0, 4, '公司性质')
sheet1.write(0, 5, '薪资')
sheet1.write(0, 6, '学历要求')
sheet1.write(0, 7, '工作经验')
sheet1.write(0, 8, '公司规模')
sheet1.write(0, 9, '公司类型')
sheet1.write(0, 10,'公司福利')
sheet1.write(0, 11,'发布时间')number = 1    #保存到excel中第几条数据
item = input('请输入岗位关键词(与大数据相关职业):')
for j in range(1,10000):   #页数自己随便改try:print("正在爬取第"+str(j)+"页数据...")html = getfront(j,item)      #调用获取网页原码for i in getInformation(html):try:'''i[0]:职位i[1]:职位网址i[2]:公司名称i[4]:公司地点i[5]:薪资i[6]:发布时间company[0][0]:公司性质job_need[2][0]:学历要求job_need[1][0]:工作经验company[0][1]:公司规模company[0][2]:公司类型welfare:公司福利'''url1 = i[1]          #职位网址res1 = urllib.request.urlopen(url1).read().decode('gbk')company = re.findall(re.compile(r'<div class="com_tag">.*?<p class="at" title="(.*?)"><span class="i_flag">.*?<p class="at" title="(.*?)">.*?<p class="at" title="(.*?)">.*?',re.S),res1)job_need = re.findall(re.compile(r'<p class="msg ltype".*?>.*?&nbsp;&nbsp;<span>|</span>&nbsp;&nbsp;(.*?)&nbsp;&nbsp;<span>|</span>&nbsp;&nbsp;(.*?)&nbsp;&nbsp;<span>|</span>&nbsp;&nbsp;.*?</p>',re.S),res1)welfare = re.findall(re.compile(r'<span class="sp4">(.*?)</span>',re.S),res1)print(i[0],i[2],i[4],i[5],company[0][0],job_need[2][0],job_need[1][0],company[0][1],company[0][2],welfare,i[6])sheet1.write(number,0,number)sheet1.write(number,1,i[0])sheet1.write(number,2,i[2])sheet1.write(number,3,i[4])sheet1.write(number,4,company[0][0])sheet1.write(number,5,i[5])sheet1.write(number,6,job_need[2][0])sheet1.write(number,7,job_need[1][0])sheet1.write(number,8,company[0][1])sheet1.write(number,9,company[0][2])sheet1.write(number,10,("  ".join(str(i) for i in welfare)))sheet1.write(number,11,i[6])number+=1# 保存文件excel1.save("51job.xls")time.sleep(0.3) #休息间隔,避免爬取海量数据时被误判为攻击,IP遭到封禁except:passexcept:pass

51job_view2.py

import pandas as pd     #pandas 是对表格数据模型在python上的模拟,它有简单的像SQL 对数据的处理,能够方便的在python上实现
import re               #正则表达式data = pd.read_excel(r'51job.xls',sheet_name='Job')
result = pd.DataFrame(data)             #将数据总表模板 加载a = result.dropna(axis=0,how='any') #值为0则删除行 axis=1则是删除列,any是只要有空值就删除,而all则是全部为空再删除
# 还有一个inplace参数,True是在原数据集上操作,False是返回新的数据集
pd.set_option('display.max_rows',None)     #输出全部行,不省略#删除与大数据无关的职业
b = u'数据'
number = 1
li = a['职位']
for i in range(0,len(li)):try:if b in li[i]:#print(number,li[i])number+=1else:a = a.drop(i,axis=0)  #删除整行except:pass#学历表格那一栏出现招多少人,表示爬取数据出错,删除该行数据
b2 = '人'
li2 = a['学历要求']
for i in range(0,len(li2)):try:if b2 in li2[i]:# print(number,li2[i])number += 1a = a.drop(i, axis=0)except:pass#转换薪资单位为万/月
b3 =u'万/年'
b4 =u'千/月'
li3 = a['薪资']
for i in range(0,len(li3)):try:if b3 in li3[i]:x = re.findall(r'\d*\.?\d+',li3[i])#print(x)min_ = format(float(x[0])/12,'.2f')              #转换成浮点型并保留两位小数max_ = format(float(x[1])/12,'.2f')li3[i][1] = min_+'-'+max_+u'万/月'if b4 in li3[i]:x = re.findall(r'\d*\.?\d+',li3[i])#print(x)#input()min_ = format(float(x[0])/10,'.2f')max_ = format(float(x[1])/10,'.2f')li3[i][1] = str(min_+'-'+max_+'万/月')print(i,li3[i])except:pass
#保存到另一个Excel文件
a.to_excel('51job2.xls', sheet_name='Job', index=False)     #index :布尔类型,默认是Ture写行名(索引)
#############################################################################################
import pandas as pd     #pandas 是对表格数据模型在python上的模拟,它有简单的像SQL 对数据的处理,能够方便的在python上实现
import re               #正则表达式
from pyecharts import Funnel,Pie,Geo    #pyecharts 是一个用于生成 Echarts 图表的类库。#Funnel(漏斗图)、Pie(饼图)、Geo(地理坐标系)
import matplotlib.pyplot as plt         #用于数据可视化。file = pd.read_excel(r'51job2.xls',sheet_name='Job')
f = pd.DataFrame(file)                                  #将数据总表模板 加载
pd.set_option('display.max_rows',None)                  #输出全部行,不省略add = f['公司地点']         #公司地点数据的集合
sly = f['薪资']             #薪资数据的集合
edu = f['学历要求']         #学历要求的集合
exp = f['工作经验']         #工作经验的集合
address =[]
salary = []
education = []
experience = []
for i in range(0,len(f)):try:a = add[i].split('-')               #通过'-',将字符串add[i]拆分成一个字符串数组address.append(a[0])                #只要前面的#print(address[i])s = re.findall(r'\d*\.?\d+',sly[i])     # sly[i]的薪资s1= float(s[0])                         #最低工资s2 =float(s[1])                         #最高工资salary.append([s1,s2])                  #将薪资添加到salary列表#print(salary[i])education.append(edu[i])                #将学历要求添加到education列表#print(education[i])experience.append(exp[i])               #将工作经验添加到experience列表#print(experience[i])except:passmin_s=[]                           #定义存放最低薪资的列表
max_s=[]                           #定义存放最高薪资的列表
for i in range(0,len(experience)):min_s.append(salary[i][0])max_s.append(salary[i][1])
#matplotlib模块如果显示不了中文字符串可以用以下代码。
plt.rcParams['font.sans-serif'] = ['KaiTi'] # 指定默认字体
plt.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题my_df = pd.DataFrame({'experience':experience, 'min_salay' : min_s, 'max_salay' : max_s})              #关联工作经验与薪资
data1 = my_df.groupby('experience').mean()['min_salay'].plot(kind='line')
plt.show()
my_df2 = pd.DataFrame({'education':education, 'min_salay' : min_s, 'max_salay' : max_s})             #关联学历与薪资
data2 = my_df2.groupby('education').mean()['min_salay'].plot(kind='line')
plt.show()#统计岗位中各学历要求的个数
def get_edu(list):education2 = {}for i in set(list):education2[i] = list.count(i)return education2
dir1 = get_edu(education)
#print(dir1)#将岗位中各学历要求的个数绘制成饼图
attr= dir1.keys()
value = dir1.values()
pie = Pie("学历要求")
pie.add("", attr, value, center=[50, 50], is_random=False, radius=[35, 75], rosetype='radius',is_legend_show=False, is_label_show=True,legend_orient='vertical')
pie.render('学历要求饼图.html')#统计各地区岗位个数
def get_address(list):address2 = {}for i in set(list):address2[i] = list.count(i)address2.pop('异地招聘')# 有些地名可能不合法或者地图包里没有可以自行删除。return address2
dir2 = get_address(address)
#print(dir2)#将各地区岗位个数绘制成地理坐标图
geo = Geo("大数据人才需求分布图", title_color="#2E2E2E",title_text_size=24,title_top=20,title_pos="center", width=1300,height=600)
attr2 = dir2.keys()
value2 = dir2.values()
geo.add("",attr2, value2, type="effectScatter", is_random=True, visual_range=[0, 1000], maptype='china',symbol_size=8, effect_scale=5, is_visualmap=True)
geo.render('大数据城市需求分布图.html')#统计各学历要求岗位个数
def get_experience(list):experience2 = {}for i in set(list):experience2[i] = list.count(i)return experience2
dir3 = get_experience(experience)
#print(dir3)#将各学历要求岗位个数绘制成漏斗图
attr3= dir3.keys()
value3 = dir3.values()
funnel = Funnel("工作经验漏斗图",title_pos='center')
funnel.add("", attr3, value3,is_label_show=True,label_pos="inside", label_text_color="#fff",legend_orient='vertical',legend_pos='left')
funnel.render('工作经验要求漏斗图.html')
环境 版本
python 3.6
urllib3 1.24.3
xlwt 1.3.0
pandas 0.25.3
pyecharts 0.1.94

项目运行效果图


源码下载链接:基于python的招聘网站分析源码下载
本项目引用自:python爬取前程无忧和拉勾数据分析岗位并分析(https://blog.csdn.net/lbship/article/details/79452459)

基于python的招聘网站分析相关推荐

  1. 基于Python的招聘网站爬虫及可视化的设计与实现

    摘 要 I Abstract II 引 言 1 第1章 课题概述 2 1.1 课题内容 2 1.2 课题背景 2 1.3 课题意义 3 1.4 运行环境 3 1.5 相关技术 3 1.5.1 Pyth ...

  2. 【基于Python的招聘网站爬虫及可视化的设计与实现】

    完整下载:基于Python的招聘网站爬虫及可视化的设计与实现.docx 目录 目录 2 摘要 3 关键词 3 第一章 绪论 3 1.1 研究背景 3 1.2 研究意义 4 1.3 研究目的 6 1.4 ...

  3. 基于Python的购物网站分析系统

    购物是一种社会行为,最开始可能是源自于互相交换,相互交换自己需要的东西,后来演变成了购物.所以购物也有了两种层面,一种购买必需品,一种是非必须品但是不同的人购物时的心态是不一样的,购买不同的商品时的心 ...

  4. 基于 Python 的招聘信息可视化分析系统

    温馨提示:文末有 CSDN 平台官方提供的博主 Wechat / QQ 名片 :) 1. 项目简介 本项目利用 Python 从某招聘网站抓取海量招聘数据,进行数据清洗和格式化后存储到关系型数据库中( ...

  5. python信息采集管理系统_基于Python的求职信息采集分析系统设计与实现

    基于 Python 的求职信息采集分析系统设计与实现 关鑫洁 ; 黄思奇 ; 位磊 [期刊名称] <计算机时代> [年 ( 卷 ), 期] 2020(000)003 [摘要] 为了便于求职 ...

  6. 基于python摄影作品展示网站django框架计算机毕业设计源码+系统+数据库+lw文档+调试部署

    基于python摄影作品展示网站django框架计算机毕业设计源码+系统+数据库+lw文档+调试部署 基于python摄影作品展示网站django框架计算机毕业设计源码+系统+数据库+lw文档+调试部 ...

  7. 基于python的租房网站

    1,项目功能: 1).主页管理:管理员权限查看相应信息,用户权限登录.注册.条件检索.区域检索信息. 2).房屋列表:管理员权限负责维护房屋信息,用户权限可以发布房源,查询房源相应信息. 3).房屋详 ...

  8. 基于Python企业公司网站设计与实现 开题报告

      本科生毕业论文 基于Python校园网站系统(Django框架) 开题报告 学    院: 专    业: 计算机科学与技术 年    级: 学生姓名: 指导教师: 黄菊华   XXXX大学本科生 ...

  9. 【项目分享~写给应届生的一篇文章】基于Web企业招聘网站 ~~ 登录注册设计

    背景 适合人群: 应届生 推荐:可直接做为毕业设计项目,开发架构简单,按照统一的规范开发,容易上少 原因:这个项目涉及到SSM三大框架,所以刚刚入门JavaWeb的同学可能不大适合,缺少太多必备的知识 ...

  10. python微博评论情感分析_基于Python的微博情感分析系统设计

    2019 年第 6 期 信息与电脑 China Computer & Communication 软件开发与应用 基于 Python 的微博情感分析系统设计 王 欣 周文龙 (武汉工程大学邮电 ...

最新文章

  1. php 请求拦截,解决拦截器对ajax请求的拦截实例详解
  2. 网易云信携手小天才电话手表 打造视频通话体验的行业标杆
  3. 计算机用户域怎么删除,如何查找并删除AD域中多余的计算机帐号?
  4. jQuery的位置信息和事件
  5. Linux内核源码分析--内核启动之(4)Image内核启动(setup_arch函数)(Linux-3.0 ARMv7)【转】...
  6. php ajax session死锁,session过期,ajax请求处理
  7. 用积分来衡量博客的成绩
  8. 深度学习——卷积神经网络CNN
  9. 【证明】【一题多解】 —— 等比数列
  10. vue如何获取tree当前选中的节点_vue Treeselect树形下拉框之获取选中节点的ids和lables操作...
  11. 全链路跟踪对比,skywalking、zipkin等
  12. 中国计算机学会推荐国际学术会议和期刊目录
  13. word文档计算机基础考试,计算机基础考试题库(含答案)48924
  14. 目标检测——CodeBook背景建模(原理+Opencv实现代码)
  15. 寻找协调器FindCoordinatorRequest请求流程
  16. bash: scp: command not found
  17. Python练习题16:人名独特性统计
  18. 【原创】Moon在2005的辉煌
  19. Steam账号注册--流程
  20. 【Mybatis从入门到实战教程】第一章 Mybatis 入门

热门文章

  1. Redhat之SSH
  2. cutoff shader
  3. 64K方法数限制原理与解决方案总结
  4. [原创]中国大陆民谣盘点4 小柯《小柯》
  5. net_device_ops的ndo_open和ndo_start_xmit函数
  6. 中国药科大学校长来茂德:我眼中“医疗+AI”的机会与挑战
  7. 小程序上传图片/上传视频
  8. 骚操作——Word批量修改图片大小
  9. golang源代码阅读,sync系列-WaitGroup
  10. De-Sim示例分析(三)SIR传染病模型