在第一篇文章(python 爬虫学习:抓取智联招聘网站职位信息(一))中,我们介绍了爬取智联招聘网站上基于岗位关键字,及地区进行搜索的岗位信息,并对爬取到的岗位工资数据进行统计并生成直方图展示;同时进入每个职位明细页面提取出职位要求部分的页面内容,经数据清洗后将职位要求部分写入txt文件(FILEPATH+FILENAME + ‘-requirements.TXT’);接下来我们要对该txt文件中的数据进行分词及词频分析并生成词频统计图。
可以看到我们对深圳+广州地区的银行+客户经理岗位进行抓取到的数据文件中(深圳+广州地区银行+客户经理岗位统计结果-requirements.txt),显示的是所有岗位明细的要求数据:
因此我们需要使用python的分词库,jieba分词来对以上文本进行分词处理:
# 结巴分词
content = read_txt_file(path)
segment = jieba.lcut(content)
words_df = pd.DataFrame({'segment': segment})
# 剔除停止词
stopwords = pd.read_csv("stopwords.txt", index_col=False, quoting=3, sep=" ", names=['stopword'], encoding='utf-8')
words_df = words_df[~words_df.segment.isin(stopwords.stopword)]`
其中用到了“stopwords.txt”这个停止词文件(可以随便百度一个放到工程目录下即可)来剔除停止词,如果有需要也可以自行在其中添加本次分词中出现的不需要的词汇;
接下来对其进行词频统计:
#词频统计
words_stat = words_df.groupby(by=['segment'])['segment'].agg({"计数": numpy.size})
words_stat = words_stat.reset_index().sort_values(by=["计数"], ascending=False)
print(words_stat)
得到的words_stat对象就是一个单词及对应词频数的json格式数据,打印出来如下:
segment 计数
销售 37
2 30
行业 17
资格 15
银行 15
岗位 13
经理 12
接下来我们用python的wordcloud库来对以上词频进行可视化,生成词云;
# 生成词云, 可以用generate输入全部文本,也可以我们计算好词频后使用generate_from_frequencies函数
word_frequence = {x[0]: x[1] for x in words_stat.head(100).values}
word_frequence_dict = {}
for key in word_frequence:
word_frequence_dict[key] = word_frequence[key]
wordcloud.generate_from_frequencies(word_frequence_dict)
本篇所有的代码放在jieba_analysis.py文件中:
import pandas as pd
import numpy
import imageio
from wordcloud import WordCloud, ImageColorGenerator
import matplotlib.pyplot as plt
import os
from src.zhilian_config import *
def read_txt_file(path):
'''
读取txt文本
'''
with open(path, 'r', encoding='utf-8', newline='') as f:
return f.read()
def jieba_analysis(path):
# 结巴分词
content = read_txt_file(path)
segment = jieba.lcut(content)
words_df = pd.DataFrame({'segment': segment})
# 剔除停止词
stopwords = pd.read_csv("stopwords.txt", index_col=False, quoting=3, sep=" ", names=['stopword'], encoding='utf-8')
words_df = words_df[~words_df.segment.isin(stopwords.stopword)]
# 词频统计
words_stat = words_df.groupby(by=['segment'])['segment'].agg({"计数": numpy.size})
words_stat = words_stat.reset_index().sort_values(by=["计数"], ascending=False)
print(words_stat)
return words_stat
# 词云可视化
def wordcloud_show(words_stat):
# 设置词云属性
#设置生成词云的图片原型
color_mask = imageio.imread('python-img.jpg')
wordcloud = WordCloud(font_path="simhei.ttf", # 设置字体可以显示中文
background_color="white", # 背景颜色
max_words=200, # 词云显示的最大词数
mask=color_mask, # 设置背景图片
max_font_size=300, # 字体最大值
random_state=42,
width=1000, height=860, margin=2,
# 设置图片默认的大小,但是如果使用背景图片的话, # 那么保存的图片大小将会按照其大小保存,margin为词语边缘距离
)
# 生成词云, 可以用generate输入全部文本,也可以我们计算好词频后使用generate_from_frequencies函数
word_frequence = {x[0]: x[1] for x in words_stat.head(100).values}
word_frequence_dict = {}
for key in word_frequence:
word_frequence_dict[key] = word_frequence[key]
wordcloud.generate_from_frequencies(word_frequence_dict)
# 从背景图片生成颜色值
image_colors = ImageColorGenerator(color_mask)
# 重新上色
wordcloud.recolor(color_func=image_colors)
# 保存图片
wordcloud.to_file('result\output.png')
plt.imshow(wordcloud)
plt.axis("off")
plt.show()
# 主函数
if __name__ == '__main__':
words_stat = jieba_analysis(os.path.join(FILEPATH, FILENAME + '-requirements.txt'))
wordcloud_show(words_stat)
我们使用的词云图片原型(python-img.jpg)如下:
最后运行主函数后,生成的词云图片(路径:result\output.png)如下:
到此,我们对智联招聘网站的职位抓取以及数据分析基本完成。