之前的文章写到了requests + 多进程对Boss直聘网的职位进行爬取,这次就对之前爬取的数据,进行可视化分析。
- Boss直聘网爬虫的文章在这里:
https://blog.csdn.net/weixin_42350948/article/details/82288076
进入正题:本篇文章主要讲python + pyecharts + wordcloud对爬取的数据进行数据分析以及可视化展示:
上代码:
1、首先是各个包的导入以及,job_analysis类的的初始化:
import pyecharts
import pymongo
import os
import jieba.analyse
from scipy.misc import imread
import matplotlib.pyplot as plt
from wordcloud import WordCloud, ImageColorGenerator,STOPWORDS
class job_analysis():
def __init__(self):
self.client = pymongo.MongoClient("192.168.186.128:27017")
self.boss_db = self.client['Boss2']
self.coll = self.boss_db['boss_python']
#windows下为__file__,linux下为__name__
self.file = os.path.dirname(__name__)
self.city_list = ['北京','上海','广州','深圳','杭州','天津','西安','苏州','武汉','厦门','长沙','成都','郑州','重庆']
self.experience_list = ['应届生','经验不限','1年以内','1-3年','3-5年','5-10年','10年以上']
self.SZ_region_list = ['南山区','罗湖区','龙华区','盐田区','宝安区','龙岗区','福田区']
2、然后对数据库中的数据进行分类统计,包括各热门城市的数据数量,平均工资,要求工作经验进行统计:
统计各市的数据数量
def get_AnalysisNum(self):
AnalysisNum_list = []
for index,region in enumerate(self.city_list):
print(region)
num = self.coll.find({"job_address":region}).count()
AnalysisNum_list.append(num)
print(region,num)
return (self.city_list,AnalysisNum_list)
#统计各市的平均工资
def get_Avg_Salary(self):
Avg_Salary_list = []
for index,region in enumerate(self.city_list):
Avg_Salary_dic = self.coll.aggregate([{'$match':{'job_address':region}},{'$group':{'_id':'$job_address','counter':{'$sum':1},'avg_Salary':{'$avg':'$job_salary'}}}])
#print(int(list(Avg_Salary)[0]['avg_Salary']))
#这个地方Avg_Salary是迭代式,取完就没有了
avg_salary = round(list(Avg_Salary_dic)[0]['avg_Salary'],2)
Avg_Salary_list.append(avg_salary)
# print(region,salary)
return(self.city_list,Avg_Salary_list)
3、最后是对分类统计的数据进行可视化展示,主要运用了pyecharts和wordcloud库,部分代码如下:
# 展示条形图
def show_Bar(self,title,attr,value,path):
bar = pyecharts.Bar(background_color='white')
#bar.add(title,attr,value,is_convert=False, is_label_show=True, label_text_size=18, is_random=True)
#热门城市
#label_color=[]放在后面就只设置条形图的颜色 yaxis_max=350,
bar.add(title,attr,value,is_label_show=True,legend_text_size=18,label_text_color=["#000"],xaxis_label_textcolor='#000',yaxis_label_textcolo='#000',is_random=True,xaxis_line_width=1.5,yaxis_line_width=1.5)
bar.render(path=os.path.join(self.file,path))
# 展示饼图
def show_Pie(self, title, attr, value,path):
from pyecharts import Pie
pie = Pie(title,background_color='#fff')
#legend_top='center'图裂位于上下中间位置,radius为半径
pie.add(title,attr,value,radius=[40, 75],legend_top='center',is_label_show=True,legend_orient='vertical',legend_pos="left")
pie.render(os.path.join(self.file,path))
#pie.render()
def showWorkCloud(self,content,image_filename,font_filename,out_filename):
#d = os.path.dirname(__file__)
# content = open(path.join(d, filename), 'rb').read()
# 基于TF-IDF算法的关键字抽取, topK返回频率最高的几项, 默认值为20, withWeight为是否返回关键字的权重
tags = jieba.analyse.extract_tags(content, topK=100, withWeight=False)
text = " ".join(tags)
print(os.path.join(self.file, image_filename))
# 需要显示的背景图片
img = imread(os.path.join(self.file,image_filename))
# 指定中文字体, 不然会乱码的
wc = WordCloud(
# 解决显示口字型乱码问题
font_path=os.path.join(self.file,font_filename),
# 背景颜色
background_color='#fff',
# 词云形状,
mask=img,
# 允许最大词汇
max_words=450,
# 最大号字体,如果不指定则为图像高度
max_font_size=100,
# 画布宽度和高度,如果设置了msak则不会生效
# width=600,
# height=400,
margin=2,
#使用内置的屏蔽词,再添加'苟利国
#stopwords=STOPWORDS.add('岗位职责','岗位描述'),
# 词语水平摆放的频率,默认为0.9.即竖直摆放的频率为0.1
prefer_horizontal=0.9,
# 为每个词返回一个PIL颜色
random_state=42
)
wc.generate(text)
# 基于彩色图像生成相应彩色
img_color = ImageColorGenerator(img)
# 显示图片
plt.imshow(wc)
# 绘制词云
plt.figure()
plt.imshow(wc.recolor(color_func=img_color))
# 关闭坐标轴
plt.axis("off")
#plt.show()
wc.to_file(os.path.join(self.file, out_filename))
最后得到了数据可视化图:
1.各城市样本数量
2.各城市Python职位平均工资
3. 各城市python要求的工作经验占比
4.深圳各区python职位数量占比
5.深圳市对python职位的经验要求
6.对岗位职责,岗位描述等关键词生成的词云
数据可视化还有很多可以施展的地方,这里仅仅作为一个展示,具体其他的可以参照pyecharts的官方文档:https://mp.csdn.net/mdeditor