Python利用wxpy库对微信好友的属性进行分析

微信好友分析

这是我首个Python上手娱乐项目,发现还是通过项目才能查缺补漏,看知识点是否熟悉,尤其是陌生的项目,不是那种书中原来的例子。之所以先拿这个开刀,首先是因为这个项目的趣味性,毕竟微信经常在用,从接近生活的开始,兴趣和学问并行。

项目介绍:

这个项目是基于wxpy包实现的,因为我在学习数据分析,会用到numpy和pandas包,就顺便在这个项目里练习下。
我也是从网上看到这个例子,顺便学习实现的,不是我创造的。

需要用到的工具

  1. Python 3.6(我使用的是Anaconda,使用里面的Jupyter Notebook,很方便)
  2. wxpy 第三方库
  3. pandas 第三方库
  4. jieba 第三方库(分析用)
  5. wordcloud第三方库(作词云)

wxpy的安装

在wxpy主页http://wxpy.readthedocs.io/zh/latest/index.html 上,介绍了两种安装方式:

  1. 从 PYPI 官方源下载安装 (在国内可能比较慢或不稳定):
# pip install -U wxpy
  1. 从豆瓣 PYPI 镜像源下载安装 (推荐国内用户选用):
# 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('微信好友男女比例')

Python利用wxpy库对微信好友的属性进行分析_第1张图片

plt.figure('province')
df_friends['province'].dropna().value_counts(ascending = True)[-5:].plot(kind = 'barh',figsize = (3,3))
plt.title('好友人数前五省份')

Python利用wxpy库对微信好友的属性进行分析_第2张图片

plt.figure('city')
df_friends['city'].dropna().value_counts(ascending = True)[-5:].plot(kind = 'barh',figsize = (3,3))
plt.title('好友人数前五市区')

Python利用wxpy库对微信好友的属性进行分析_第3张图片
将生成的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制作词云。
首先需要将所有的好友签名合并,直接合并肯定不可以,我们可以先截取一段签名看原始的签名样式,可以看出,这样的不能直接分析,主要存在问题如下:

  • 带很多空格,需要删除
  • 一些emoji表情会生成格式的文本,需要将其替换
# 安装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()

Python利用wxpy库对微信好友的属性进行分析_第4张图片

# 如果对某个词语感兴趣,想知道含某个词语的签名是哪位好友发的,可以针对某个出现的词语进行搜索查找,这里以“人生”为例
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进行一些基本的统计分析。

你可能感兴趣的:(Python)