用 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使用scrapy采集数据时为每个请求随机分配user-agent的方法
Apr 08 Python
python写入xml文件的方法
May 08 Python
Python中不同进制的语法及转换方法分析
Jul 27 Python
python爬虫面试宝典(常见问题)
Mar 02 Python
将TensorFlow的模型网络导出为单个文件的方法
Apr 23 Python
Python 十六进制整数与ASCii编码字符串相互转换方法
Jul 09 Python
Python3.4 splinter(模拟填写表单)使用方法
Oct 13 Python
Python字符串的常见操作实例小结
Apr 08 Python
python实现简单聊天室功能 可以私聊
Jul 12 Python
python3实现往mysql中插入datetime类型的数据
Mar 02 Python
解决numpy矩阵相减出现的负值自动转正值的问题
Jun 03 Python
JupyterNotebook 输出窗口的显示效果调整实现
Sep 22 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
在普通HTTP上安全地传输密码
2007/07/21 PHP
采集邮箱的php代码(抓取网页中的邮箱地址)
2012/07/17 PHP
破解.net程序(dll文件)编译和反编译方法
2013/01/31 PHP
phpmailer发送邮件之后,返回收件人是否阅读了邮件的方法
2014/07/19 PHP
十大使用PHP框架的理由
2015/09/26 PHP
详解Yaf框架PHPUnit集成测试方法
2017/12/27 PHP
Laravel 框架返回状态拦截代码
2019/10/18 PHP
javascript对talbe进行动态添加、删除、验证实现代码
2012/03/29 Javascript
js格式化金额可选是否带千分位以及保留精度
2014/01/28 Javascript
js输出阴历、阳历、年份、月份、周示例代码
2014/01/29 Javascript
php实例分享之实现显示网站运行时间
2014/05/20 Javascript
AngularJS上拉加载问题解决方法
2016/05/23 Javascript
详解AngularJS脏检查机制及$timeout的妙用
2017/06/19 Javascript
Vue实现PopupWindow组件详解
2018/04/28 Javascript
vue项目中jsonp跨域获取qq音乐首页推荐问题
2018/05/30 Javascript
详解微信小程序input标签正则初体验
2018/08/18 Javascript
JavaScript实现多文件下载方法解析
2020/08/07 Javascript
详解python如何调用C/C++底层库与互相传值
2016/08/10 Python
django模板语法学习之include示例详解
2017/12/17 Python
Python用csv写入文件_消除空余行的方法
2018/07/06 Python
Flask框架信号用法实例分析
2018/07/24 Python
djang常用查询SQL语句的使用代码
2019/02/15 Python
实例讲解Python中整数的最大值输出
2019/03/17 Python
pandas的连接函数concat()函数的具体使用方法
2019/07/09 Python
python3获取文件中url内容并下载代码实例
2019/12/27 Python
python判断正负数方式
2020/06/03 Python
美国在线家装零售商:Build.com
2016/09/02 全球购物
Lookfantastic瑞典:英国知名美妆购物网站
2018/04/06 全球购物
weblogic面试题
2016/03/07 面试题
广州御银科技股份有限公司试卷(C++)
2016/11/04 面试题
艺术设计专业个人求职信范文
2013/12/11 职场文书
结婚邀请函范文
2014/01/14 职场文书
公司授权委托书
2014/04/04 职场文书
作风建设年度心得体会
2014/10/29 职场文书
Go中的条件语句Switch示例详解
2021/08/23 Golang
微信小程序结合ThinkPHP5授权登陆后获取手机号
2021/11/23 PHP