网络编程
位置:首页>> 网络编程>> Python编程>> 用 python 进行微信好友信息分析

用 python 进行微信好友信息分析

作者:步平凡  发布时间:2022-03-29 15:52:44 

标签:python,微信

1. 使用到的库

① wxpy:初始化微信机器人

② openpyxl:保存微信好友数据为Excel表格

③ pyecharts:生成可视化的地图

④ wordcloud、matplotlib、jieba:生成词云图

【特别提醒】:pyecharts 库用的是0.5.x版本,而在 pip 中安装的为1.x.x版本,因此需要自行到【官网】中下载。

2. 基本功能

① 分析微信好友数据

② 生成词云图

③ 生成地图展示

3. 代码实现

此处使用类来实现

(1) 导入模块


# 导入模块
from wxpy import Bot
import openpyxl
from pyecharts import Map
from wordcloud import WordCloud
import matplotlib.pyplot as plt
import jieba

(2) 初始化机器人和获取微信好友的源信息

此处调用 Bot() 方法,需要扫码登陆微信网页版,后续操作才能进行。


def __init__(self, ToExcelFile="", ToCityFile="", ToMapProvinceFile="", ToMapCityFile=""):
 ''' 初始化机器人和其他参数 '''
 # 初始化机器人,需要扫码
 self.bot = Bot()
 # 获取我所有的微信好友信息 - 存储基础信息(未处理)
 self.allFriends_Info = self.bot.friends()
 # 我的微信好友个数
 self.allFriends_Num = len(self.allFriends_Info)
 # 保存微信好友信息的表格文件路径(.xlsx)
 self.ExcelFile = ToExcelFile
 # 保存城市词云图的文件路径(.png/.jpg)
 self.WCOfCityFile = ToCityFile
 # 保存省份地图的文件路径(.html)
 self.MapProvinceFile = ToMapProvinceFile
 # 其他可用参数
 self.MapCityFile = ToMapCityFile
 # 自动调用run方法,使得在实例化对象后自动运行其他函数
 self.run()

(3) 统计和处理微信好友的信息

除了列出的还有 个性签名、头像等其他属性。


def getFriendsInfo(self):
 ''' 获取微信好友的全部信息 '''
 # 存储微信好友的信息(经过信息处理的)
 self.friendsInfo = []
 # 定义列标题
 self.infoTitle = ['NickName', 'RemarkName', 'Sex', 'Province', 'City']
 for aFriend in self.allFriends_Info:
   # 获取昵称
   NickName = aFriend.raw.get(self.infoTitle[0], None)
   # 获取备注
   RemarkName = aFriend.raw.get(self.infoTitle[1], None)
   # 获取性别
   Sex = {1:"男", 2:"女", 0:"其他"}.get(aFriend.raw.get(self.infoTitle[2], None), None)
   # 获取省份
   Province = aFriend.raw.get(self.infoTitle[3], None)
   # 获取城市
   City = aFriend.raw.get(self.infoTitle[4], None)
   lisTmp = [NickName, RemarkName, Sex, Province, City]
   self.friendsInfo.append(lisTmp)

(4) 保存微信好友的信息

在这保存为Excel表格,在代码中插入表头行,为了便于阅读。


def saveFriendsInfoAsExcel(self, ExcelName):
 ''' 保存微信好友的信息到 Excel 表格中 '''
 # 生成openpyxl对象
 workbook = openpyxl.Workbook()
 # 激活表格
 sheet = workbook.active
 # 设置表格标题
 sheet.title = 'WeChatFriendsInfo'
 # 填充列标题到第一行
 for _ in range(len(self.infoTitle)):
   sheet.cell(row=1, column=_+1, value=self.infoTitle[_])
 # 填充微信好友信息,从第二行开始
 for i in range(self.allFriends_Num):
   for j in range(len(self.infoTitle)):
     sheet.cell(row=i+2, column=j+1, value=str(self.friendsInfo[i][j]))
 # 若文件名非空,则保存到该路径下
 if ExcelName != "":
   workbook.save(ExcelName)
   print(">>> Save WeChat friends' information successfully!")

(5) 分析微信好友的信息


def quiteAnalyzeFriendsInfo(self):
  ''' 分析数据,一步到位,直接了当 '''
  print(self.allFriends_Info.stats_text())

(6) 生成city词云图


def creatWordCloudOfCity(self, CityName):
 ''' 使用获取的数据生成city词云图 '''
 # 获取所有的城市
 cityStr = ""
 for i in range(self.allFriends_Num):
   if self.friendsInfo[i][4] not in cityStr:
     cityStr += " " + self.friendsInfo[i][4]
 #jieba库精确模式分词
 wordlist = jieba.lcut(cityStr)
 cityStr = ' '.join(wordlist)
 # 加载背景图片
 #cloud_mask = np.array(Image.open(BackGroundFile))
 #设置词云图属性
 font = r'C:\Windows\Fonts\simfang.ttf' # 设置字体路径
 wc = WordCloud(
   background_color = 'black',   # 背景颜色
   #mask = cloud_mask,       # 背景图片
   max_words = 100,        # 设置最大显示的词云数
   font_path = font,        # 设置字体形式(在本机系统中)
   height = 300,          # 图片高度
   width = 600,          # 图片宽度
   max_font_size = 100,      # 字体最大值
   random_state = 100,       # 配色方案的种类
   )
 # 生成词云图
 myword = wc.generate(cityStr)
 #展示词云图
 plt.imshow(myword)
 plt.axis('off')
 plt.show()
 # 若文件名非空,则保存到该路径下
 if CityName != "":
   #保存词云图
   wc.to_file(CityName)
   print(">>> Creat WeChat wordcloud of city successfully!")

(7) 生成province地图


def creatMapProvince(self, MapFile):
 ''' 使用获取的数据生成province地图 '''
 # 获取所有省份
 provinceList, provinceNum = [], []
 for i in range(self.allFriends_Num):
   if self.friendsInfo[i][3] not in provinceList:
     provinceList.append(self.friendsInfo[i][3])
     provinceNum.append(0)
 for i in range(self.allFriends_Num):
   for j in range(len(provinceList)):
     if self.friendsInfo[i][3] == provinceList[j]:
       provinceNum[j] += 1
 # 生成 Map
 map = Map("各省微信好友分布", width=1000, height=800)
 map.add("", provinceList, provinceNum, maptype="china", is_visualmap=True, visual_text_color='#000')
 # 若文件名非空,则保存到该路径下
 if MapFile != "":
   map.render(MapFile)
   print(">>> Creat WeChat Map of Provinces seccessfully!")

(8) 生成city地图


def creatMapCity(self, MapFile):
   ''' 使用获取的数据生成city地图 '''
   # 获取所有省份
   CityList, CityNum = [], []
   for i in range(self.allFriends_Num):
     if self.friendsInfo[i][4] not in CityList:
       CityList.append(self.friendsInfo[i][4])
       CityNum.append(0)
   for i in range(self.allFriends_Num):
     for j in range(len(CityList)):
       if self.friendsInfo[i][4] == CityList[j]:
         CityNum[j] += 1
   for i in range(len(CityList)):
     CityList[i] += '市'
   # 生成 Map
   map = Map("各市微信好友分布", width=1000, height=800)
   map.add("", CityList, CityNum, maptype="广东", is_visualmap=True, visual_text_color='#000')
   # 若文件名非空,则保存到该路径下
   if MapFile != "":
     map.render(MapFile)
     print(">>> Creat WeChat Map of Cities seccessfully!")

有了上述实现各个功能的方法,那么就差一个调用各种方法的方法了。

(9) run方法


def run(self):
 # 获取微信好友信息
 self.getFriendsInfo()
 print(">>> Get WeChat friends' information successfully!")
 print(">>> Members:", self.allFriends_Num)
 # 保存微信好友信息
 self.saveFriendsInfoAsExcel(self.ExcelFile)
 # 分析微信好友信息
 self.quiteAnalyzeFriendsInfo()
 # 使用微信好友的 city 产生词云图
 self.creatWordCloudOfCity(self.WCOfCityFile)
 # 生成微信好友的 province 地图
 self.creatMapProvince(self.MapProvinceFile)
 # 生成微信好友的 city 地图
 self.creatMapCity(self.MapCityFile)

对于文件路径,在main函数中传递即可。【注】:上述代码都在类中,在此处结束,下面为main函数


if __name__ == "__main__":
 ToExcelFile = "./WeChatAnalyze//FriendsInfo.xlsx"   # 微信好友信息的Excel表格保存路径
 ToPictureFile = "./WeChatAnalyze//CityWordCloud.png"  # 微信好友信息city词云图保存路径
 ToMapFileProvince = "./WeChatAnalyze//WeChatProvinceMap.html" # 微信好友信息province地图保存路径
 ToMapFileCity = "./WeChatAnalyze//WeChatCityMap.html" # 微信好友信息city地图保存路径
 # WeChatRobot对象实例化
 robot = WeChatRobot(ToExcelFile, ToPictureFile, ToMapFileProvince, ToMapFileCity)

是不是觉得Main函数很简短,哈哈,没错,就是这么简!

接下来看看实现的效果吧!

>>> 这个是终端显示效果

用 python 进行微信好友信息分析

>>> 这个是保存为Excel表格的内容

用 python 进行微信好友信息分析

 >>> 这个是微信好友各省的分布

用 python 进行微信好友信息分析

>>> 这个是微信好友各市的分布

用 python 进行微信好友信息分析

完整代码


# -*- coding: utf-8 -*-
'''
This is a program which can analyze datas of WeChat friends.
@author: bpf
'''

# 导入模块
from wxpy import Bot
import openpyxl
from pyecharts import Map
from wordcloud import WordCloud
import matplotlib.pyplot as plt
import jieba

class WeChatRobot:

'''====================== 1. 获取微信好友信息 ======================'''
 def __init__(self, ToExcelFile="", ToCityFile="", ToMapProvinceFile="", ToMapCityFile=""):
   ''' 初始化机器人和其他参数 '''
   # 初始化机器人,需要扫码
   self.bot = Bot()
   # 获取我所有的微信好友信息 - 存储基础信息(未处理)
   self.allFriends_Info = self.bot.friends()
   # 我的微信好友个数
   self.allFriends_Num = len(self.allFriends_Info)
   # 保存微信好友信息的表格文件路径(.xlsx)
   self.ExcelFile = ToExcelFile
   # 保存城市词云图的文件路径(.png/.jpg)
   self.WCOfCityFile = ToCityFile
   # 保存省份地图的文件路径(.html)
   self.MapProvinceFile = ToMapProvinceFile
   # 其他可用参数
   self.MapCityFile = ToMapCityFile
   # 自动调用run方法,使得在实例化对象后自动运行其他函数
   self.run()

'''====================== 2. 统计微信好友信息 ======================'''
 def getFriendsInfo(self):
   ''' 获取微信好友的全部信息 '''
   # 存储微信好友的信息(经过信息处理的)
   self.friendsInfo = []
   # 定义列标题
   self.infoTitle = ['NickName', 'RemarkName', 'Sex', 'Province', 'City']
   for aFriend in self.allFriends_Info:
     # 获取昵称
     NickName = aFriend.raw.get(self.infoTitle[0], None)
     # 获取备注
     RemarkName = aFriend.raw.get(self.infoTitle[1], None)
     # 获取性别
     Sex = {1:"男", 2:"女", 0:"其他"}.get(aFriend.raw.get(self.infoTitle[2], None), None)
     # 获取省份
     Province = aFriend.raw.get(self.infoTitle[3], None)
     # 获取城市
     City = aFriend.raw.get(self.infoTitle[4], None)
     lisTmp = [NickName, RemarkName, Sex, Province, City]
     self.friendsInfo.append(lisTmp)

'''====================== 3. 保存微信好友信息 ======================'''
 def saveFriendsInfoAsExcel(self, ExcelName):
   ''' 保存微信好友的信息到 Excel 表格中 '''
   # 生成openpyxl对象
   workbook = openpyxl.Workbook()
   # 激活表格
   sheet = workbook.active
   # 设置表格标题
   sheet.title = 'WeChatFriendsInfo'
   # 填充列标题到第一行
   for _ in range(len(self.infoTitle)):
     sheet.cell(row=1, column=_+1, value=self.infoTitle[_])
   # 填充微信好友信息,从第二行开始
   for i in range(self.allFriends_Num):
     for j in range(len(self.infoTitle)):
       sheet.cell(row=i+2, column=j+1, value=str(self.friendsInfo[i][j]))
   # 若文件名非空,则保存到该路径下
   if ExcelName != "":
     workbook.save(ExcelName)
     print(">>> Save WeChat friends' information successfully!")

'''====================== 4. 分析微信好友信息 ======================'''
 def quiteAnalyzeFriendsInfo(self):
   ''' 分析数据,一步到位,直接了当 '''
   print(self.allFriends_Info.stats_text())

'''====================== 5. 产生city词云图 ======================'''
 def creatWordCloudOfCity(self, CityName):
   ''' 使用获取的数据生成city词云图 '''
   # 获取所有的城市
   cityStr = ""
   for i in range(self.allFriends_Num):
     if self.friendsInfo[i][4] not in cityStr:
       cityStr += " " + self.friendsInfo[i][4]
   #jieba库精确模式分词
   wordlist = jieba.lcut(cityStr)
   cityStr = ' '.join(wordlist)
   # 加载背景图片
   #cloud_mask = np.array(Image.open(BackGroundFile))
   #设置词云图属性
   font = r'C:\Windows\Fonts\simfang.ttf' # 设置字体路径
   wc = WordCloud(
     background_color = 'black',   # 背景颜色
     #mask = cloud_mask,       # 背景图片
     max_words = 100,        # 设置最大显示的词云数
     font_path = font,        # 设置字体形式(在本机系统中)
     height = 300,          # 图片高度
     width = 600,          # 图片宽度
     max_font_size = 100,      # 字体最大值
     random_state = 100,       # 配色方案的种类
     )
   # 生成词云图
   myword = wc.generate(cityStr)
   #展示词云图
   plt.imshow(myword)
   plt.axis('off')
   plt.show()
   # 若文件名非空,则保存到该路径下
   if CityName != "":
     #保存词云图
     wc.to_file(CityName)
     print(">>> Creat WeChat wordcloud of city successfully!")

'''===================== 6. 产生province地图 ====================='''
 def creatMapProvince(self, MapFile):
   ''' 使用获取的数据生成province地图 '''
   # 获取所有省份
   provinceList, provinceNum = [], []
   for i in range(self.allFriends_Num):
     if self.friendsInfo[i][3] not in provinceList:
       provinceList.append(self.friendsInfo[i][3])
       provinceNum.append(0)
   for i in range(self.allFriends_Num):
     for j in range(len(provinceList)):
       if self.friendsInfo[i][3] == provinceList[j]:
         provinceNum[j] += 1
   # 生成 Map
   map = Map("各省微信好友分布", width=1000, height=800)
   map.add("", provinceList, provinceNum, maptype="china", is_visualmap=True, visual_text_color='#000')
   # 若文件名非空,则保存到该路径下
   if MapFile != "":
     #map.show_config()
     map.render(MapFile)
     print(">>> Creat WeChat Map of Provinces seccessfully!")

'''===================== 7. 产生city地图 ====================='''
 def creatMapCity(self, MapFile):
   ''' 使用获取的数据生成city地图 '''
   # 获取所有省份
   CityList, CityNum = [], []
   for i in range(self.allFriends_Num):
     if self.friendsInfo[i][4] not in CityList:
       CityList.append(self.friendsInfo[i][4])
       CityNum.append(0)
   for i in range(self.allFriends_Num):
     for j in range(len(CityList)):
       if self.friendsInfo[i][4] == CityList[j]:
         CityNum[j] += 1
   for i in range(len(CityList)):
     CityList[i] += '市'
   # 生成 Map
   map = Map("各市微信好友分布", width=1000, height=800)
   map.add("", CityList, CityNum, maptype="广东", is_visualmap=True, visual_text_color='#000')
   # 若文件名非空,则保存到该路径下
   if MapFile != "":
     map.render(MapFile)
     print(">>> Creat WeChat Map of Cities seccessfully!")

'''===================== 8. 自动执行函数 ====================='''
 def run(self):
   # 获取微信好友信息
   self.getFriendsInfo()
   print(">>> Get WeChat friends' information successfully!")
   print(">>> Members:", self.allFriends_Num)
   # 保存微信好友信息
   self.saveFriendsInfoAsExcel(self.ExcelFile)
   # 分析微信好友信息
   self.quiteAnalyzeFriendsInfo()
   # 使用微信好友的 city 产生词云图
   self.creatWordCloudOfCity(self.WCOfCityFile)
   # 生成微信好友的 province 地图
   self.creatMapProvince(self.MapProvinceFile)
   # 生成微信好友的 city 地图
   self.creatMapCity(self.MapCityFile)

if __name__ == "__main__":
 ToExcelFile = "./WeChatAnalyze//FriendsInfo.xlsx"   # 微信好友信息的Excel表格保存路径
 ToPictureFile = "./WeChatAnalyze//CityWordCloud.png"  # 微信好友信息city词云图保存路径
 ToMapFileProvince = "./WeChatAnalyze//WeChatProvinceMap.html" # 微信好友信息province地图保存路径
 ToMapFileCity = "./WeChatAnalyze//WeChatCityMap.html" # 微信好友信息city地图保存路径
 # WeChatRobot对象实例化
 robot = WeChatRobot(ToExcelFile, ToPictureFile, ToMapFileProvince, ToMapFileCity)

来源:https://www.cnblogs.com/bpf-1024/p/10962332.html

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com