用 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函数很简短,哈哈,没错,就是这么简!

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

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

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

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

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

完整代码

# -*- 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 微信信息分析的资料请关注我们其它相关文章!

(0)

相关推荐

  • 基于Python采集爬取微信公众号历史数据

    鲲之鹏的技术人员将在本文介绍一种通过模拟操作微信App的方式采集指定公众号的所有历史数据的方法. 通过我们抓包分析发现,微信公众号的历史数据是通过HTTP协议加载的,对应的API接口如下图所示,其中有四个关键参数(__biz.appmsg_token.pass_ticket以及Cookie). 为了能够拿到这四个参数,我们需要模拟操作App,让其产生这些参数,然后我们再抓包获取.对于模拟App操作,前面我们曾介绍过通过Python模拟安卓App的方法(详见http://www.site-digg

  • Python使用20行代码实现微信聊天机器人

    近来,打开微信群发消息,就会秒收到一些活跃分子的回复,有的时候感觉对方回答很在理,但是有的时候发现对方的回答其实是驴唇不对马嘴,仔细深究发现,原来对方是机器人.今天,小编就带大家用20行代码,带你一起打造一个微信聊天机器人,让你的微信群一直嗨不停~~ 首先我们需要安装一个微信相关的第三方库,itchat,在Windows上通过命令:pip install itchat,就可以将其安装. 其二,我们需要去图灵机器人官网:http://www.tuling123.com,注册一下,即可获得一个机器人

  • Python爬取微信小程序通用方法代码实例详解

    背景介绍 最近遇到一个需求,大致就是要获取某个小程序上的数据.心想小程序本质上就是移动端加壳的浏览器,所以想到用Python去获取数据.在网上学习了一下如何实现后,记录一下我的实现过程以及所踩过的小坑.本文关键词:Python,小程序,Charles抓包 目标小程序: 公众号"同城商圈网"左下角"找商家"->汽车维修->小车维修->所有的商家信息,如下图所示: 环境 PC端:Windows 10 移动端:iPhone 软件:Charles Char

  • python修改微信和支付宝步数的示例代码

    项目意义 如果你想在支付宝蚂蚁森林收集很多能量种树,为环境绿化出一份力量,又或者是想每天称霸微信运动排行榜装逼,却不想出门走路,那么该python脚本可以帮你实现. 实现方法 手机安装第三方软件乐心健康,注册账号登录,将运动数据同步到微信和支付宝.用python脚本远程修改乐心健康当前登录账号的步数即可. 第一步:在手机上安装乐心健康app. 安卓版下载地址:乐心健康安卓版 苹果版下载地址:乐心健康iOS版 乐心运动app for android v3.0 安卓版 第二步:注册账号登录,并设置登

  • python向企业微信发送文字和图片消息的示例

    吐槽一下企业微信的api文档真的不好读······ 企业微信本来是有功能,可以直接把图片显示到正文的,但是那个api我调用一直出错,各种折腾也没解决.后来感觉就算了,没必要,用url拼接在文字中也行,这样的好处就是以后可以换图床,不局限在企业微信内部(好像免费版一天之内可以上传200张图片,所以如果需求比较大的话可以采用第三方图床) 我把上传部分封装了一个使用新线程的方法,以防使用的时候因为上传卡住主线程(亲测如果不这样的话确实会卡住) import requests import json f

  • Python Flask微信小程序登录流程及登录api实现代码

    一.先来看看效果 接口请求返回的数据: 二.官方登录流程图 三.小程序登录流程梳理: 1.小程序端调用wx.login 2.判断用户是否授权 3.小程序端访问 wx.getUserInfo 4.小程序端js代码: wx.login({ success: resp => { // 发送 res.code 到后台换取 openId, sessionKey, unionId console.log(resp); var that = this; // 获取用户信息 wx.getSetting({ su

  • python实现企业微信定时发送文本消息的实例代码

    企业微信定时发送文本消息 使用工具:企业微信机器人+python可执行文件+计算机管理中的任务计划程序 第一步:创建群机器人 选择群聊,单击鼠标右键,添加群机器人. 建立群机器人后,右键查看机器人,如下 复制机器人的链接. 第二步:编辑python程序 import requests from datetime import datetime url = 'https://qyapi.we......' #机器人的webhook地址 headers = {'Content-type':'appl

  • Python实现清理微信僵尸粉功能示例【基于itchat模块】

    本文实例讲述了Python实现清理微信僵尸粉功能.分享给大家供大家参考,具体如下: 原理 通过Pyhton调用itchat模块登录网页版微信,给你所有好友发送特殊符号,对方收不到这个特殊符号,只要有人删了你,你的微信就会显示被删的人. 所需环境 Python3 itchat模块 安装 pip install itchat 使用 新建qf.py文件,拷贝下面代码,保存 import itchat import time itchat.auto_login(hotReload=True) # 热加载

  • Python 实现微信自动回复的方法

    众所周知QQ上面是可以设置自动回复的,但是微信上面并不可以.最近在学习Python,发现Python的适用范围是真的很广,这里使用itchat组件实现微信的自动回复 1:安装itchat pip install itchat 2:简单实例: (1):发送信息 import itchat itchat.auto_login() name = itchat.search_friends(name=u'XX') #XX表示昵称或用户名 userName = name[0]["UserName"

  • python操作微信自动发消息的实现(微信聊天机器人)

    前言 最近在学习python,发现一个微信自动发消息的小demo感觉很有意思,试了一下,不成功,因为demo中用的是itchat这个库来操作微信,而这个库是通过微信网页版来操作微信的,现在微信网页版已经不能登录了所以失败,我又试了第二种方法,我试图找到微信界面上的搜索框控件,使用搜索框控件找到想法消息的人,然后发送消息,结果就是又失败了,为啥呢?经过我翻翻翻,找找找,发现微信的界面是使用duilib实现的,界面都是画上去的,控件只是逻辑上存在,而实际没有,我们根本获取不到,然后我只能通过手动移动

  • Python selenium爬取微信公众号文章代码详解

    参照资料:selenium webdriver添加cookie: https://www.jb51.net/article/193102.html 需求: 想阅读微信公众号历史文章,但是每次找回看得地方不方便. 思路: 1.使用selenium打开微信公众号历史文章,并滚动刷新到最底部,获取到所有历史文章urls. 2.对urls进行遍历访问,并进行下载到本地. 实现 1.打开微信客户端,点击某个微信公众号->进入公众号->打开历史文章链接(使用浏览器打开),并通过开发者工具获取到cookie

  • Python爬虫爬取微信朋友圈

    接下来,我们将实现微信朋友圈的爬取. 如果直接用 Charles 或 mitmproxy 来监听微信朋友圈的接口数据,这是无法实现爬取的,因为数据都是被加密的.而 Appium 不同,Appium 作为一个自动化测试工具可以直接模拟 App 的操作并可以获取当前所见的内容.所以只要 App 显示了内容,我们就可以用 Appium 抓取下来. 1. 本节目标 本节我们以 Android 平台为例,实现抓取微信朋友圈的动态信息.动态信息包括好友昵称.正文.发布日期.其中发布日期还需要进行转换,如日期

随机推荐