用 python 进行微信好友信息分析
作者:步平凡 发布时间:2022-03-29 15:52:44
标签: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)
来源:https://www.cnblogs.com/bpf-1024/p/10962332.html
0
投稿
猜你喜欢
- ASP生成柱型体,折线图,饼图源代码。一:纯ASP代码生成图表函数2——折线图;二:纯ASP代码生成图表函数1——柱状图 ;三:纯
- 之前有教大家制作日历,很多小伙伴都兴奋的告诉小编自己成功了。那么我们在日历中怎么去找到我们想要的那个时间点呢?其实有点类似于查询的功能,但是
- 运行的时候,有时候会出现语法错误: IndentationError: unexpected indent可以用如下方法
- 前言最近经常用到一个.py程序,但是每次在不同电脑上用,希望能把Python脚本发布为脱离Python平台运行的可执行程序,比如单个exe。
- 一个js代码,图片实时变形一幅图片,长度\宽度之大小与比例都不停地变化,如同哈哈镜的效果,很能引人注目,用在网页上,可以给人意外的惊喜!&l
- 1.什么是多线程?多线程是为了同步完成多项任务,不是为了提高运行效率,而是为了提高资源使用效率来提高系统的效率。线程是在同一时间需要完成多项
- 使用django的小伙伴们应该都知道我们是无法开心的处理PUT跟DELETE的$.ajax({ url: 'XXX
- JavaScript的对象都是实例化了的,只可以使用而不能够创建继承于这些对象的新的子类. window对象为所有对象的Parent win
- 如果直接从生成验证码的页面把验证码下载到本地后识别,再构造表单数据发送的话,会有一个验证码同步的问题,即请求了两次验证码,而识别出来的验证码
- 问题描述最近~ 发现对series里的元素操作挺复杂的,用for loop + Series.iloc[i]会发生卡死的状况,那么,lamb
- 本文实例为大家分享了Python人脸识别的具体代码,供大家参考,具体内容如下1.利用opencv库sudo apt-get install
- 方法一 :使用常规的思路def transpose(M): # 初始化转置后的矩阵 result = [] &nbs
- 使用layui的文件上传组件,可以方便的弹出文件上传界面。效果如下:点击【批量导入】按钮调用js脚本importData(config)就可
- 最近在学习python爬虫,使用requests的时候遇到了不少的问题,比如说在requests中如何使用cookies进行登录验证,这可以
- 时间久了,注册用户和朋友数据库里的废记录渐渐多了起来,尤其是电子邮件地址,请问有什么好的办法可以快速安全地将它们删除吗?试试下面这个办法,它
- 一、什么是线程?线程顾名思义,就是一条流水线工作的过程,一条流水线必须属于一个车间,一个车间的工作过程是一个进程。车间负责把资源整合到一起,
- 双向数据绑定指的是当对象的属性发生变化时能够同时改变对应的UI,反之亦然。换句话说,如果我们有一个user对象,这个对象有一个name属性,
- 本文实例讲述了Python HTML解析模块HTMLParser用法。分享给大家供大家参考,具体如下:简介先简略介绍一下。实际上,HTMLP
- 主成分分析,即Principal Component Analysis(PCA),是多元统计中的重要内容,也广泛应用于机器学习和其它领域。它
- 是不是很烦每次注册网站或填写相关资料时都要重来一遍?其实会有很多自动填写工具能代劳。比如使用 Mac, 在 Safari 的表单中,它可以足