用 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 相关文章推荐
Python代理抓取并验证使用多线程实现
May 03 Python
python处理json数据中的中文
Mar 06 Python
使用PDB简单调试Python程序简明指南
Apr 25 Python
Python写入数据到MP3文件中的方法
Jul 10 Python
Python的多维空数组赋值方法
Apr 13 Python
pandas多级分组实现排序的方法
Apr 20 Python
查看TensorFlow checkpoint文件中的变量名和对应值方法
Jun 14 Python
pyqt5 键盘监听按下enter 就登陆的实例
Jun 25 Python
Python基于paramunittest模块实现excl参数化
Apr 26 Python
如何利用python web框架做文件流下载的实现示例
Jun 02 Python
python3+PyQt5+Qt Designer实现界面可视化
Jun 10 Python
Python超详细分步解析随机漫步
Mar 17 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
mac下安装nginx和php
2013/11/04 PHP
Laravel 5框架学习之Laravel入门和新建项目
2015/04/07 PHP
Yii中实现处理前后台登录的新方法
2015/12/28 PHP
PHP获取真实客户端的真实IP
2017/03/07 PHP
脚本吧 - 幻宇工作室用到js,超强推荐base.js
2006/12/23 Javascript
jquery获得下拉框值的代码
2011/08/13 Javascript
javascript中的事件代理初探
2014/03/08 Javascript
7个去伪存真的JavaScript面试题
2016/01/07 Javascript
JavaScript+CSS实现的可折叠二级菜单实例
2016/02/29 Javascript
浅析Javascript中bind()方法的使用与实现
2016/05/30 Javascript
vue.js与element-ui实现菜单树形结构的解决方法
2018/04/21 Javascript
Vue 与 Vuex 的第一次接触遇到的坑
2018/08/16 Javascript
jQuery选择器之层次选择器用法实例分析
2019/02/19 jQuery
微信小程序--获取用户地理位置名称(无须用户授权)的方法
2019/04/29 Javascript
关于Layui Table隐藏列问题
2019/09/16 Javascript
JavaScript find()方法及返回数据实例
2020/04/30 Javascript
ES6函数实现排它两种写法解析
2020/05/13 Javascript
[02:19]DOTA2女子战队FOX视频专访:希望更多美眉一起加入
2013/10/15 DOTA
Python中列表(list)操作方法汇总
2014/08/18 Python
浅谈Python中的数据类型
2015/05/05 Python
python字典多键值及重复键值的使用方法(详解)
2016/10/31 Python
pyinstaller打包多个py文件和去除cmd黑框的方法
2019/06/21 Python
Nginx+Uwsgi+Django 项目部署到服务器的思路详解
2020/05/08 Python
5行Python代码实现图像分割的步骤详解
2020/05/25 Python
python查询MySQL将数据写入Excel
2020/10/29 Python
利用纯CSS3实现文字向右循环闪过效果实例(可用于移动端)
2017/06/15 HTML / CSS
财务学生的职业生涯发展
2014/02/11 职场文书
会计岗位描述
2014/02/22 职场文书
作风大整顿心得体会
2014/09/10 职场文书
2015年档案管理员工作总结
2015/05/13 职场文书
宾馆客房管理制度
2015/08/06 职场文书
导游带团欢迎词
2015/09/30 职场文书
小学班主任工作经验交流材料
2015/11/02 职场文书
pandas:get_dummies()与pd.factorize()的用法及区别说明
2021/05/21 Python
SpringBoot整合RabbitMQ的5种模式实战
2021/08/02 Java/Android
python区块链实现简版工作量证明
2022/05/25 Python