1. 程式人生 > 程式設計 >用 python 進行微信好友資訊分析

用 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("各市微信好友分佈",height=800)
    map.add("",CityList,CityNum,maptype="廣東",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,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','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:"男",None)
      # 獲取省份
      Province = aFriend.raw.get(self.infoTitle[3],None)
      # 獲取城市
      City = aFriend.raw.get(self.infoTitle[4],None)
      lisTmp = [NickName,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,value=self.infoTitle[_])
    # 填充微信好友資訊,從第二行開始
    for i in range(self.allFriends_Num):
      for j in range(len(self.infoTitle)):
        sheet.cell(row=i+2,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,[]
    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("各省微信好友分佈",visual_text_color='#000')
    # 若檔名非空,則儲存到該路徑下
    if MapFile != "":
      #map.show_config()
      map.render(MapFile)
      print(">>> Creat WeChat Map of Provinces seccessfully!")

  '''===================== 7. 產生city地圖 ====================='''
  def creatMapCity(self,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,ToMapFileCity)

以上就是用 python 進行微信好友資訊分析的詳細內容,更多關於python 微信資訊分析的資料請關注我們其它相關文章!