一、背景
上一篇文章我们讲解了微信机器人,主要使用了wxpy这个库,如果还不会登录机器人的话可以可以快速浏览上一篇文章,微信聊天机器人-存储好友分享消息。这篇文章我们继续使用wxpy统计微信账号好友信息。主要包括:好友信息词云、好友所在省份分布、城市分布、好友性别和好友地理位置热力图等
二、效果展示
1、好友信息:男女比例柱状图、好友省份饼图、好友城市饼图
2、好友个性签名词云
3、好友所在位置热力图
三、wordcloud
wordcloud是生成词云的包,使用起来也是比较简单
1、安装wordcloud包
1 pip install wordcloud
2、导入词云包
1 from wordcloud import WordCloud, ImageColorGenerator
3、构造WordCloud对象
1 wc = WordCloud( 2 background_color = p_background 3 , max_words = p_max_words #显示最大词数 4 , font_path = "msyh.ttf" 5 , min_font_size = p_min_font_size 6 , max_font_size = p_max_font_size 7 , width = p_width #图幅宽度 8 , height = p_height 9 , mask = cloud_mask 10 )
4、生成词云结果
1 result = wc.generate(cloud_text)
5、保存词云结果为图片
1 wordCloudFile = os.getcwd() + "\wordCloud.png" 2 if os.path.exists(wordCloudFile) : 3 os.remove(wordCloudFile) 4 result.to_file(wordCloudFile)
四、jieba
jieba是一个分词工具,可以把已知文本串进行分词,分词的结果是一个列表,wordcloud正好需要这么一个列表
1、安装jieba包
1 pip install jieba
2、导入分词工具包
1 import jieba
3、添加建议词组,即不被分割的词组
1 jieba.suggest_freq(('微博'), True)
4、加载用户自定义词组
1 jieba.load_userdict(os.getcwd() + "\jieba_user_dict.txt")
5、分词
1 segs = jieba.cut(text)
五、matplotlib
matplotlib是一个python图表包,包含各种图表控件,本文中主要使用了饼图和柱状图
1、安装matplotlib
1 pip install matplotlib
2、导入图表控件
1 import matplotlib.pyplot as plt
3、构造一个figure对象
1 fig = plt.figure(num = bot.self.name + u'的好友签名词云', figsize=(6.5, 6))
4、添加plot
1 plt.plot() 2 plt.axis('off') 3 plt.title(bot.self.name + u"的好友个性签名词云") 4 plt.imshow(result)
5、为了解决乱码问题,需要在构造figure前设置下编码
1 plt.rcParams['font.sans-serif'] = ['SimHei']
6、显示
1 plt.show()
六、pyecharts
pyecharts是热力图包,需要在浏览器中查看
1、安装pyecharts包
1 pip install pyecharts
2、导入
1 from pyecharts import Map, Page
3、构造一个Map对象
1 friends_map = Map("微信好友全国分布图", width = 1200, height=600)
4、添加好友省份数据
1 friends_map.add( 2 "" 3 , province_dict.keys() 4 , province_dict.values() 5 , is_label_show = True 6 , is_visualmap = True 7 , maptype='china' 8 , visual_range = [0, max(province_dict.values())] 9 , visual_text_color = 'red' 10 , visual_range_text = ['少', '多'] 11 , visual_range_color = ['#FFFF00', '#D6292B'] # [黄,红]由低到高 12 )
5、渲染,会生成一个index.html文件在同目录下,使用浏览器打开即可
6、如果发现地图上没有数据,需要下载地图数据包
1 echarts-countries-pypkg 是全球国家地图,echarts-china-provinces-pypkg是中国省级地图, echarts-china-cities-pypkg是中国城市地图 2 3 pip install echarts-countries-pypkg 4 5 pip install echarts-china-provinces-pypkg 6 7 pip install echarts-china-cities-pypkg
七、关键步骤
1、获取好友男女信息
1 #获取好友性别、省份 2 def generateInfo(): 3 male = female = other = 0 4 for sex, count in friends_stat["sex"].items(): 5 # 1代表MALE, 2代表FEMALE 6 if sex == 1: 7 male = count 8 print ("MALE %d" % count) 9 elif sex == 2: 10 female = count 11 print ("FEMALE %d" % count) 12 else : 13 other = count 14 print ("other %d" % count) 15 16 total = male + female + other 17 print ("男性朋友:%.2f%%" % (float(male) / total * 100)) 18 print ("女性朋友:%.2f%%" % (float(female) / total * 100)) 19 print ("其他:%.2f%%" % (float(other) / total * 100))
2、好友省份
1 province_dict = {} 2 friend_privince = [] 3 for province, count in friends_stat["province"].items(): 4 if province != "": 5 friend_privince.append([province, count]) 6 province_dict[province] = count
3、好友城市
1 friend_city = [] 2 for city, count in friends_stat["city"].items(): 3 if city != "": 4 friend_city.append([city, count])
4、签名数据清洗
1 fs = bot.friends() 2 for f in fs : 3 pattern = re.compile(r'[一-龥]+') 4 filterdata = re.findall(pattern, f.signature) 5 text = text + ''.join(filterdata)
八、打包成exe时遇到的问题
1、jieba包在打包成exe,运行时可能会报找不到dict.txt文件,因此导入jieba包时执行以下代码,并将dict.txt文件拷贝到exe目录下
1 import jieba 2 jieba.set_dictionary(".dict.txt") 3 jieba.initialize()
或者看源码目录里的log.txt文件解决方案
2、wordcloud打包时,也会遇到stopwords文件缺失,解决办法是修改源码
wordcloud.py文件中30行代码修改
to :STOPWORDS = set(map(str.strip, open(os.path.join(os.path.dirname(sys.executable), 'stopwords')).readlines()))
from :STOPWORDS = set(map(str.strip, open(os.path.join(FILE, 'stopwords')).readlines()))
打包完毕,开发时需要还原
九、demo下载
需要完整源码的可以下载:微信好友信息统计-图、词云和热图