用 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中的hashlib和base64加密模块使用实例
Sep 02 Python
Python调用C语言开发的共享库方法实例
Mar 18 Python
Python注释详解
Jun 01 Python
CentOS中升级Python版本的方法详解
Jul 10 Python
详解Django中六个常用的自定义装饰器
Jul 04 Python
Python多线程编程之多线程加锁操作示例
Sep 06 Python
python中比较两个列表的实例方法
Jul 04 Python
django之对FileField字段的upload_to的设定方法
Jul 28 Python
用python爬取历史天气数据的方法示例
Dec 30 Python
Python使用scapy模块发包收包
May 07 Python
python使用pymysql模块操作MySQL
Jun 16 Python
Python实现视频中添加音频工具详解
Dec 06 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程序设计中的MVC编程思想
2014/07/28 PHP
PHP file_get_contents函数读取远程数据超时的解决方法
2015/05/13 PHP
PHP命令行执行整合pathinfo模拟定时任务实例
2016/08/12 PHP
PHP 中使用ajax时一些常见错误总结整理
2017/02/27 PHP
PHP 多任务秒级定时器的实现方法
2018/05/13 PHP
JavaScript中的值类型详细介绍
2014/12/29 Javascript
jQuery 1.9.1源码分析系列(十五)之动画处理
2015/12/03 Javascript
JS组件Bootstrap实现弹出框效果代码
2016/04/26 Javascript
详解PHP后期静态绑定分析与应用
2018/03/21 Javascript
AngularJS 应用模块化的使用
2018/04/04 Javascript
解决vue 中 echart 在子组件中只显示一次的问题
2018/08/07 Javascript
详解Vue 全局变量,局部变量
2019/04/17 Javascript
Vue-drag-resize 拖拽缩放插件的使用(简单示例)
2019/12/04 Javascript
python网络编程学习笔记(七):HTML和XHTML解析(HTMLParser、BeautifulSoup)
2014/06/09 Python
跟老齐学Python之关于循环的小伎俩
2014/10/02 Python
Python中的os.path路径模块中的操作方法总结
2016/07/07 Python
Python二叉树的定义及常用遍历算法分析
2017/11/24 Python
Python Datetime模块和Calendar模块用法实例分析
2019/04/15 Python
Python Flask框架扩展操作示例
2019/05/03 Python
Django之使用内置函数和celery发邮件的方法示例
2019/09/16 Python
对python中 math模块下 atan 和 atan2的区别详解
2020/01/17 Python
python yield和Generator函数用法详解
2020/02/10 Python
Python使用Pygame绘制时钟
2020/11/29 Python
HTML5样式控制示例代码
2013/11/27 HTML / CSS
美国糖果店:Sugarfina
2019/02/21 全球购物
经理秘书找工作求职信
2013/12/19 职场文书
高考备战决心书
2014/03/11 职场文书
自我鉴定总结
2014/03/24 职场文书
俞敏洪励志演讲稿
2014/04/29 职场文书
2014年学校德育工作总结
2014/12/05 职场文书
横空出世观后感
2015/06/09 职场文书
2016年5月份红领巾广播稿
2015/12/21 职场文书
2019年新郎保证书3篇
2019/10/17 职场文书
聘任书的格式及模板
2019/10/28 职场文书
Redis命令处理过程源码解析
2022/02/12 Redis
Python+Matplotlib图像上指定坐标的位置添加文本标签与注释
2022/04/11 Python