1 #-*- coding: utf-8 -*-
2 """
3 Created on Wed Jun 5 12:33:27 20194
5 @author: m13536 """
7
8 from wxpy import Bot9 import openpyxl10 from pyecharts import Map11 from wordcloud import WordCloud12 import matplotlib.pyplot as plt13 import jieba14
15 class WeChatRobot:16
17 '''====================== 1. 获取微信好友信息 ======================'''18 def __init__(self, ToExcelFile="", ToCityFile="", ToMapProvinceFile="", ToMapCityFile=""):19 ''' 初始化机器人和其他参数 '''20 #初始化机器人,需要扫码
21 self.bot =Bot()22 #获取我所有的微信好友信息 - 存储基础信息(未处理)
23 self.allFriends_Info =self.bot.friends()24 #我的微信好友个数
25 self.allFriends_Num =len(self.allFriends_Info)26 #保存微信好友信息的表格文件路径(.xlsx)
27 self.ExcelFile =ToExcelFile28 #保存城市词云图的文件路径(.png/.jpg)
29 self.WCOfCityFile =ToCityFile30 #保存省份地图的文件路径(.html)
31 self.MapProvinceFile =ToMapProvinceFile32 #其他可用参数
33 self.MapCityFile =ToMapCityFile34 #自动调用run方法,使得在实例化对象后自动运行其他函数
35 self.run()36
37 '''====================== 2. 统计微信好友信息 ======================'''38 def getFriendsInfo(self):39 ''' 获取微信好友的全部信息 '''40 #存储微信好友的信息(经过信息处理的)
41 self.friendsInfo =[]42 #定义列标题
43 self.infoTitle =['NickName', 'RemarkName', 'Sex', 'Province', 'City']44 for aFriend inself.allFriends_Info:45 #获取昵称
46 NickName = aFriend.raw.get(self.infoTitle[0], None)47 #获取备注
48 RemarkName = aFriend.raw.get(self.infoTitle[1], None)49 #获取性别
50 Sex = {1:"男", 2:"女", 0:"其他"}.get(aFriend.raw.get(self.infoTitle[2], None), None)51 #获取省份
52 Province = aFriend.raw.get(self.infoTitle[3], None)53 #获取城市
54 City = aFriend.raw.get(self.infoTitle[4], None)55 lisTmp =[NickName, RemarkName, Sex, Province, City]56 self.friendsInfo.append(lisTmp)57
58 '''====================== 3. 保存微信好友信息 ======================'''59 def saveFriendsInfoAsExcel(self, ExcelName):60 ''' 保存微信好友的信息到 Excel 表格中 '''61 #生成openpyxl对象
62 workbook =openpyxl.Workbook()63 #激活表格
64 sheet =workbook.active65 #设置表格标题
66 sheet.title ='WeChatFriendsInfo'67 #填充列标题到第一行
68 for _ inrange(len(self.infoTitle)):69 sheet.cell(row=1, column=_+1, value=self.infoTitle[_])70 #填充微信好友信息,从第二行开始
71 for i inrange(self.allFriends_Num):72 for j inrange(len(self.infoTitle)):73 sheet.cell(row=i+2, column=j+1, value=str(self.friendsInfo[i][j]))74 #若文件名非空,则保存到该路径下
75 if ExcelName != "":76 workbook.save(ExcelName)77 print(">>> Save WeChat friends' information successfully!")78
79 '''====================== 4. 分析微信好友信息 ======================'''80 def quiteAnalyzeFriendsInfo(self):81 ''' 分析数据,一步到位,直接了当 '''82 print(self.allFriends_Info.stats_text())83
84 '''====================== 5. 产生city词云图 ======================'''85 def creatWordCloudOfCity(self, CityName):86 ''' 使用获取的数据生成city词云图 '''87 #获取所有的城市
88 cityStr = ""
89 for i inrange(self.allFriends_Num):90 if self.friendsInfo[i][4] not incityStr:91 cityStr += " " + self.friendsInfo[i][4]92 #jieba库精确模式分词
93 wordlist =jieba.lcut(cityStr)94 cityStr =' '.join(wordlist)95 #加载背景图片
96 #cloud_mask = np.array(Image.open(BackGroundFile))
97 #设置词云图属性
98 font = r'C:\Windows\Fonts\simfang.ttf' #设置字体路径
99 wc =WordCloud(100 background_color = 'black', #背景颜色
101 #mask = cloud_mask, # 背景图片
102 max_words = 100, #设置最大显示的词云数
103 font_path = font, #设置字体形式(在本机系统中)
104 height = 300, #图片高度
105 width = 600, #图片宽度
106 max_font_size = 100, #字体最大值
107 random_state = 100, #配色方案的种类
108 )109 #生成词云图
110 myword =wc.generate(cityStr)111 #展示词云图
112 plt.imshow(myword)113 plt.axis('off')114 plt.show()115 #若文件名非空,则保存到该路径下
116 if CityName != "":117 #保存词云图
118 wc.to_file(CityName)119 print(">>> Creat WeChat wordcloud of city successfully!")120
121 '''===================== 6. 产生province地图 ====================='''122 def creatMapProvince(self, MapFile):123 ''' 使用获取的数据生成province地图 '''124 #获取所有省份
125 provinceList, provinceNum =[], []126 for i inrange(self.allFriends_Num):127 if self.friendsInfo[i][3] not inprovinceList:128 provinceList.append(self.friendsInfo[i][3])129 provinceNum.append(0)130 for i inrange(self.allFriends_Num):131 for j inrange(len(provinceList)):132 if self.friendsInfo[i][3] ==provinceList[j]:133 provinceNum[j] += 1
134 #生成 Map
135 map = Map("各省微信好友分布", width=1000, height=800)136 map.add("", provinceList, provinceNum, maptype="china", is_visualmap=True, visual_text_color='#000')
137 #若文件名非空,则保存到该路径下
138 if MapFile != "":139 #map.show_config()
140 map.render(MapFile)141 print(">>> Creat WeChat Map of Provinces seccessfully!")142
143 '''===================== 7. 产生city地图 ====================='''144 def creatMapCity(self, MapFile):145 ''' 使用获取的数据生成city地图 '''146 #获取所有省份
147 CityList, CityNum =[], []148 for i inrange(self.allFriends_Num):149 if self.friendsInfo[i][4] not inCityList:150 CityList.append(self.friendsInfo[i][4])151 CityNum.append(0)152 for i inrange(self.allFriends_Num):153 for j inrange(len(CityList)):154 if self.friendsInfo[i][4] ==CityList[j]:155 CityNum[j] += 1
156 for i inrange(len(CityList)):157 CityList[i] +='市'158 #生成 Map
159 map = Map("各市微信好友分布", width=1000, height=800)160 map.add("", CityList, CityNum, maptype="广东", is_visualmap=True, visual_text_color='#000')
161 #若文件名非空,则保存到该路径下
162 if MapFile != "":163 map.render(MapFile)164 print(">>> Creat WeChat Map of Cities seccessfully!")165
166 '''===================== 8. 自动执行函数 ====================='''167 def run(self):168 #获取微信好友信息
169 self.getFriendsInfo()170 print(">>> Get WeChat friends' information successfully!")171 print(">>> Members:", self.allFriends_Num)172 #保存微信好友信息
173 self.saveFriendsInfoAsExcel(self.ExcelFile)174 #分析微信好友信息
175 self.quiteAnalyzeFriendsInfo()176 #使用微信好友的 city 产生词云图
177 self.creatWordCloudOfCity(self.WCOfCityFile)178 #生成微信好友的 province 地图
179 self.creatMapProvince(self.MapProvinceFile)180 #生成微信好友的 city 地图
181 self.creatMapCity(self.MapCityFile)182
183 if __name__ == "__main__":184 ToExcelFile = "D:\\python wexin\\微信好友1.xlsx" #微信好友信息的Excel表格保存路径
185 ToPictureFile = "D:\\python wexin\\微信好友2.png" #微信好友信息city词云图保存路径
186 ToMapFileProvince = "D:\\python wexin\\微信好友3.html" #微信好友信息province地图保存路径
187 ToMapFileCity = "D:\\python wexin\\微信好友4.html" #微信好友信息city地图保存路径
188 #WeChatRobot对象实例化
189 robot = WeChatRobot(ToExcelFile, ToPictureFile, ToMapFileProvince, ToMapFileCity)