在本次项目中,使用到的第三方库如下:
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换源(最新最全亲测)
文章目录
- 前言
- 一、anaconda换源(适用linux和window)
*
-
+ - 二、anaconda删除源
*
-
+ - 三、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创作打卡

【python 3.8 tensorflow】python3.8及以上安装tensorflow及keras方法

DataFrame

Mac m1芯片用Miniforge3安装tensorflow

卷积层(FCN)替换全连接层(FC)的意义

【机器学习算法】聚类算法-3 K均值聚类法,PAM法,神经网络聚类法SOM

【强化学习探索01】Win10 下gym安装

Tensorflow2.0与Tensorflow1.x不兼容问题

预训练语言模型合辑~

pfamscan 的使用_使用 HMMER 进行 PFAM 注释

Anaconda中如何安装Tensorflow

『参数初始化』开局一个神经网络,初始值全靠随机

Pre-train, Prompt, and Predict: A Systematic Survey of Prompting Methods in Natural Language Process

【安装库】tensorflow-gpu版本配置
