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


Posted in Python onNovember 28, 2020

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)

以上就是用 python 进行微信好友信息分析的详细内容,更多关于python 微信信息分析的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python3 能振兴 Python的原因分析
Nov 28 Python
Python编程中的反模式实例分析
Dec 08 Python
简述Python中的面向对象编程的概念
Apr 27 Python
举例讲解Python中字典的合并值相加与异或对比
Jun 04 Python
Python查找第n个子串的技巧分享
Jun 27 Python
正确理解Python中if __name__ == '__main__'
Jan 24 Python
Python定时任务工具之APScheduler使用方式
Jul 24 Python
wxpython布局的实现方法
Nov 01 Python
Python实现元素等待代码实例
Nov 11 Python
Python利用PyExecJS库执行JS函数的案例分析
Dec 18 Python
浅谈Python 中的复数问题
May 19 Python
python保存图片的四个常用方法
Feb 28 Python
Python离线安装各种库及pip的方法
Nov 28 #Python
python 实现汉诺塔游戏
Nov 28 #Python
Python读写锁实现实现代码解析
Nov 28 #Python
python解压zip包中文乱码解决方法
Nov 27 #Python
python 实现控制鼠标键盘
Nov 27 #Python
Python模拟键盘输入自动登录TGP
Nov 27 #Python
python操作toml文件的示例代码
Nov 27 #Python
You might like
浅谈PHP变量作用域以及地址引用问题
2013/12/27 PHP
php使用gd2绘制基本图形示例(直线、圆、正方形)
2017/02/15 PHP
一页面多XMLHttpRequest对象
2007/01/22 Javascript
csdn 博客中实现运行代码功能实现
2009/08/29 Javascript
如何确保JavaScript的执行顺序 之jQuery.html并非万能钥匙
2011/03/03 Javascript
判断某个字符在一个字符串中是否存在的js代码
2014/02/28 Javascript
jquery滚动加载数据的方法
2015/03/09 Javascript
jQuery处理json数据返回数组和输出的方法
2015/03/11 Javascript
KnockoutJS 3.X API 第四章之表单value绑定
2016/10/10 Javascript
canvas实现粒子时钟效果
2017/02/06 Javascript
微信小程序动态的加载数据实例代码
2017/04/14 Javascript
JavaScript表单即时验证 验证不成功不能提交
2017/08/31 Javascript
layui 关闭open弹出框 刷新table表格页面的方法
2019/09/16 Javascript
layui清除radio的选中状态实例
2019/11/14 Javascript
[02:03]《现实生活中的DOTA2》—林书豪&DOTA2职业选手出演短片
2015/08/18 DOTA
Python实现基本线性数据结构
2016/08/22 Python
利用Python生成文件md5校验值函数的方法
2017/01/10 Python
Python实现简单的文本相似度分析操作详解
2018/06/16 Python
Django实现登录随机验证码的示例代码
2018/06/20 Python
Python实现RGB与HSI颜色空间的互换方式
2019/11/27 Python
详解pycharm自动import所需的库的操作方法
2020/11/30 Python
python中的对数log函数表示及用法
2020/12/09 Python
英国护肤品购物网站:Beauty Expert
2016/08/19 全球购物
英国高街品牌:Miss Selfridge(塞尔弗里奇小姐)
2016/09/21 全球购物
Senreve官网:美国旧金山的奢侈手袋品牌
2019/03/21 全球购物
小小的船教学反思
2014/02/21 职场文书
好的旅游活动方案
2014/08/19 职场文书
2015出纳试用期工作总结
2014/12/12 职场文书
工作失误检讨书范文
2015/01/26 职场文书
小学英语教学经验交流材料
2015/11/02 职场文书
年终工作总结范文
2019/06/20 职场文书
nginx搭建图片服务器的过程详解(root和alias的区别)
2021/03/31 Servers
PHP新手指南
2021/04/01 PHP
pytorch 一行代码查看网络参数总量的实现
2021/05/12 Python
Java并发编程必备之Future机制
2021/06/30 Java/Android
十大冰系宝可梦排名,颜值最高的阿罗拉九尾,第三使用率第一
2022/03/18 日漫