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

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

import requests

import time

import random

import json

import pandas

import matplotlib.pyplot

import csv

import numpy

import  WordCloud

import 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_url
        headers = {'user-agent':self.get_ua()}
        data = self.get_data(search_content,page_num)
        html = requests.post(url=url,headers=headers,data=data).text
        return html
    def 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_list
    def 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('万')])*10
        return 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('万')])*10
        return 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周,所实现的部分功能可能还不够完善,爬取到的数据可能并不是很多,数据分析也不够全面,在以后还会继续努力完善本项目,有经验的小伙伴可以来一起交流交流。

  • 13
    点赞
  • 110
    收藏
    觉得还不错? 一键收藏
  • 16
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值