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

人工智能49

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

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()

运行效果如下图:

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

在这张图中,我们可以看到,数量最多的城市是上海,而学位数量最多的是本科。

[En]

In this picture, we can see that the largest number of cities is Shanghai, while the largest number of degrees is undergraduate.

(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()

运行效果如下图:

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

图为上海、北京、天津、大连、广州就业人数最多,说明一二线城市就业机会较多。

[En]

This picture shows that Shanghai, Beijing, Tianjin, Dalian and Guangzhou have the largest number of jobs, which shows that there are more opportunities to find a job in first-or second-tier cities.

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

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

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

从这张图表可以看出,本科学历的人数最多,而硕士学历的人数最少,这表明目前大多数人拥有本科学历,但拥有硕士学位的人很少。

[En]

From this chart, we can see that the number of people with bachelor's degree is the largest, while the number of people with master's degree is the least, which shows that at present, most people have undergraduate degree, but very few people have master's degree.

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

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

四、总结

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

Original: https://blog.csdn.net/giaohu/article/details/121948130
Author: giaohu
Title: 项目:招聘网站信息(获取数据+数据分析+数据可视化)



相关阅读

Title: Ubuntu anaconda换源(最新最全亲测)

文章目录

前言

其他的热门教程时间跳过久远,部分链接已经失效。
下面就是换源的全部流程。本文写于 2021.07.15保证时效性,亲测可用。

提示:以下是本篇文章正文内容,下面案例可供参考

一、anaconda换源(适用linux和window)

换源的原因:anacond默认的源下载python包太慢,时间太长。所以需要更换国内的源。

方法一:命令行换源

终端输入以下命令回车:注:以添加清华源为例

conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/msys2
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/bioconda
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/menpo
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/simpleitk

检查是否换源成功!!!终端输入以下命令:

conda config --set show_channel_urls yes
conda info

项目:招聘网站信息(获取数据+数据分析+数据可视化)
注:可以看到此时 channel URLs 已经全部更换为清华源。

如果需要更换中科大源可使用以下命令:

conda config --add channels https://mirrors.ustc.edu.cn/anaconda/pkgs/main/
conda config --add channels https://mirrors.ustc.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.ustc.edu.cn/anaconda/cloud/conda-forge/
conda config --add channels https://mirrors.ustc.edu.cn/anaconda/cloud/msys2/
conda config --add channels https://mirrors.ustc.edu.cn/anaconda/cloud/bioconda/
conda config --add channels https://mirrors.ustc.edu.cn/anaconda/cloud/menpo/
conda config --add channels https://mirrors.ustc.edu.cn/anaconda/cloud/pytorch/

检查步骤同上

最后 建议删除defaut的默认源(推荐) 删除方法见下方。[不删除的话,下载python包的速度有可能仍然会很慢]
项目:招聘网站信息(获取数据+数据分析+数据可视化)
注:使用conda info 可以看到anaconda的默认源 仍然存在,但是排放在下面。

方法二:可视化界面换源(推荐新手)

终端输入 anaconda-navigator启动可视化界面 轻松完成channel源的添加,删除,检查。 在换国内源的时候,将网址一条条输入 后 update即可。
项目:招聘网站信息(获取数据+数据分析+数据可视化)

; 二、anaconda删除源

方法一:命令行删除

在终端输入如下命令:注意:以删除清华源为例,在命令后面加上相应的URL。逐一删除

[En]

Enter the following command at the terminal: note: take deleting Tsinghua source as an example, put the corresponding URL after the command. Delete one by one

conda config --remove channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/

方法二:可视化界面删除(推荐新手)

这个很简单,没啥好说的。上面有提及,删除对应网址即可。

三、anaconda还原默认源

注:常用语重置下载源,省去逐个删除URLs的时间
终端输入以下命令: conda config --remove-key channels

总结

提示:以上就是换源的全部流程。本文写于 2021.07.15保证时效性,亲测可用。

anaconda常用命令
anaconda配置Pytorch环境
anaconda配置Tensorflow环境

如果这个图文教程有帮助到你的话,能点个免费的赞吗n(≧▽≦)n。其他问题也请留言在评论区哦,博主看到会回复的。O(∩_∩)O~

如果想要安装配置特殊环境如pytorch或者TensorFlow等或者可以学习anaconda的使用,后续可以查阅博主的其他博客。

Original: https://blog.csdn.net/KIK9973/article/details/118776314
Author: 向日葵骑士Faraday
Title: Ubuntu anaconda换源(最新最全亲测)

相关文章
YOLOv5的输出端(Head)详解|CSDN创作打卡 人工智能

YOLOv5的输出端(Head)详解|CSDN创作打卡

深度学习入门小菜鸟,希望像做笔记记录自己学的东西,也希望能帮助到同样入门的人,更希望大佬们帮忙纠错啦~侵权立删。 注:因为有些朋友喜欢的是逐句逐句的看代码解析,所以我整理了两份,一份是逐份逐份分析代码...
DataFrame 人工智能

DataFrame

1:获取dataFrame的行数和列数  行数:dataframe.shape[0]或len(DataFrame.index)  列数:dataframe.shape[1]或len(DataFrame...
预训练语言模型合辑~ 人工智能

预训练语言模型合辑~

重磅推荐专栏:《Transformers自然语言处理系列教程》 手把手带你深入实践Transformers,轻松构建属于自己的NLP智能应用! ERNIE 1.0 实体级别连续MASK 针对有两个及两...