这是我首个Python上手娱乐项目,发现还是通过项目才能查缺补漏,看知识点是否熟悉,尤其是陌生的项目,不是那种书中原来的例子。之所以先拿这个开刀,首先是因为这个项目的趣味性,毕竟微信经常在用,从接近生活的开始,兴趣和学问并行。
这个项目是基于wxpy包实现的,因为我在学习数据分析,会用到numpy和pandas包,就顺便在这个项目里练习下。
我也是从网上看到这个例子,顺便学习实现的,不是我创造的。
在wxpy主页http://wxpy.readthedocs.io/zh/latest/index.html 上,介绍了两种安装方式:
# pip install -U wxpy
# pip install -U wxpy -i "https://pypi.doubanio.com/simple/"
在Anaconda Prompt中输入上述命令即可安装成功
wxpy主页上有很多例程,可以看着学习
# 导入wxpy与pandas模块
from wxpy import *
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体:解决plot不能显示中文问题
plt.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
# 初始化机器人,扫码登陆
bot = Bot()
运行之后会弹出带二维码的照片,用微信扫码登陆即可,登录成功显示:Login successfully as XXX
# 获取微信好友集合
my_friends = bot.friends()
print(type(my_friends))
bot.friends()生成的是wxpy.Chats的对象,该对象有两个方法,stats() 与 stats_text(),可用来统计好友或群成员的性别和地区分布
stats()生成一个分别统计各个city、province、sex的字典dict,分别统计了各个城市、省份、男女的人数
print(type(bot.friends().stats()))
print(type(bot.friends().stats()['sex']))
stats_text(),生成一段文本,分别显示男女总数、比例,以及前10位省份和城市的人数
print(type(bot.friends().stats_text()))
bot.friends().stats_text()
#该统计功能也可以自行实现
bot.enable_puid()
#puid 是 wxpy 特有的聊天对象/用户ID,不同于其他 ID 属性,puid 可始终被获取到,且具有稳定的唯一性
friend_data = []
for friend in my_friends:
# 统计性别
if friend.sex == 1:
sex = '男'
elif friend.sex == 2:
sex = '女'
else:
sex = '未知'
# name 该对象的友好名称,具体为: 从 备注名称、群聊显示名称、昵称(或群名称),或微信号中按序选取第一个可用的
# nick_name 该对象的昵称
# remark_name 该对象的备注名称
# sex 性别
# province 省份
# city 城市
# signature 签名
# get.avatar(path) 保存文件的后缀为jpg
# puid 持续有效,且稳定唯一的聊天对象/用户ID,适用于持久保存,puid 可始终被获取到,且具有稳定的唯一性
# uin 微信中的聊天对象ID,固定且唯一,测试无法获取到
# alias 用户设置的”微信号”,测试无法获取到
# wxid 该对象微信ID,测试无法获取到
# user_name 该聊天对象的内部 ID,通常不需要用到
# friend.get_avatar('E:\Docs\Python_Scripts\wxfile\wx_friends_avatar\{0}.jpg'.format(friend.puid))
friend_data.append([friend.name,friend.nick_name,friend.remark_name,sex,friend.province,friend.city,friend.signature,friend.puid])
#将每个friend包含的信息存储在一个DataFrame中,同时将空值部分填充为NaN
df_friends = pd.DataFrame(friend_data,columns = ['name','nick_name','remark_name','sex','province','city','signature','puid']).replace('',np.nan)
# 显示前10个,方便观察信息
df_friends.head(10)
df_friends['sex'].value_counts()
# 输入这句可以实现图表在jupyter中交互,例如缩放、平移等操作,点击图标右上侧按钮可以关闭
%matplotlib notebook
# 在jupyter输出窗口显示图表
%matplotlib inline
plt.figure('sex')
# 绘制性别分布饼图,简单的绘图可直接采用pandas自带的绘图,同样是基于matplotlib的
# kind = 'pie'选择绘图类型,pie代表饼图;figsize设置图形大小,autopct设置占比数值显示格式,%.2f%%显示为百分比格式,这里后面需要跟两个%
df_friends['sex'].value_counts().plot(kind = 'pie',figsize = (4,4),autopct = '%.2f%%')
plt.title('微信好友男女比例')
plt.figure('province')
df_friends['province'].dropna().value_counts(ascending = True)[-5:].plot(kind = 'barh',figsize = (3,3))
plt.title('好友人数前五省份')
plt.figure('city')
df_friends['city'].dropna().value_counts(ascending = True)[-5:].plot(kind = 'barh',figsize = (3,3))
plt.title('好友人数前五市区')
将生成的DataFrame转存成csv文档,方便以后使用,这样就不用每次,登陆微信获取了,此处地址需要修改为自己想存储的位置
df_friends.to_csv('E:\Docs\Python_Scripts\wx_friends_info.csv')
# 读取刚才存储的csv文档
df1 = pd.read_csv('E:\Docs\Python_Scripts\wx_friends_info.csv',encoding ='gbk')
# 会有1空行,删掉
del df1['Unnamed: 0']
df_friends = df1.copy()
df_friends.head()
还可以分析的是好友的签名,可以用词云的方式来分析,利用jieba库分词,利用wordcloud制作词云。
首先需要将所有的好友签名合并,直接合并肯定不可以,我们可以先截取一段签名看原始的签名样式,可以看出,这样的不能直接分析,主要存在问题如下:
# 安装jieba pip install -i https://pypi.tuna.tsinghua.edu.cn/simple jieba
# 安装wordcloud pip install -i https://pypi.tuna.tsinghua.edu.cn/simple wordcloud
# pip install 后加 -i https://pypi.tuna.tsinghua.edu.cn/simple 从清华国内镜像下载,速度快,防止安装失败
import re
s_list = []
for i in df_friends['signature'].dropna():
#signature = i.replace(" ", "").replace("span", "").replace("class", "").replace("emoji", "")
rep = re.compile("" )
signature = rep.sub("", i)
s_list.append(signature)
text = ''.join(s_list)
#print(text3)
import jieba
wordlist = jieba.cut(text,cut_all=True)
word_space_split = " ".join(wordlist).replace("\n","")
#print(word_space_split)
from wordcloud import WordCloud, ImageColorGenerator
import PIL.Image as Image
background_image = plt.imread('wechat.jpg')
my_wordcloud = WordCloud(
background_color="white",
#mask = background_image,
width = 400,
height = 300,
max_words=100,
max_font_size=60,
random_state=30,
scale = 2,
font_path='C:\Windows\Fonts\STZHONGS.TTF').generate(word_space_split)
plt.imshow(my_wordcloud.recolor())
plt.imshow(my_wordcloud)
plt.axis("off")
plt.savefig('wechat_sig.jpg')
plt.show()
# 如果对某个词语感兴趣,想知道含某个词语的签名是哪位好友发的,可以针对某个出现的词语进行搜索查找,这里以“人生”为例
name_sig = {}
# 针对DataFrame行迭代的方法:
for index in df_friends.index:
if '人生' in str(df_friends.loc[index]['signature']): # 因为有些签名为数字,需要转化为字符串
#name_sig.append(df_friends.loc[index]['名称'])# 因为有些签名为数值,需要转化为字符串
name_sig[str(df_friends.loc[index]['name'])] = str(df_friends.loc[index]['signature'])
name_sig
其实有了数据,就可以进行各种尝试,发现一些奇妙,这里也生成了csv的文档,嫌Python困难的,也可以用Excel进行一些基本的统计分析。