一、背景
上一篇文章我們講解了微信機器人,主要使用了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下載
需要完整源碼的可以下載:微信好友信息統計-圖、詞雲和熱圖