1. 简介
微信是一个非常流行的社交媒体应用,在其中我们可以通过和好友互动来实现很多功能,如聊天、分享文章等。但是,对于这些好友,我们是否可以从中挖掘出一些有用的信息呢?针对这个问题,本文将使用Python对微信好友的特征数据进行分析和可视化,从而探索出一些有趣、有用的信息。
2. 准备工作
2.1 安装itchat
首先,为了实现对微信的数据爬取和分析,我们需要安装一个Python库itchat
,该库提供了一些方便的接口,可以用来获取和发送微信消息等。我们可以使用以下命令完成itchat
的安装:
!pip install itchat
安装完成后,我们需要运行下面的代码进行登录微信:
import itchat
itchat.auto_login() # 首次登录会自动弹出二维码,扫描即可
运行上述代码后,我们便成功地登陆了微信账号。
2.2 获取好友信息
在微信登录成功之后,我们可以通过以下代码获取我们的好友信息:
friends = itchat.get_friends()
print(friends)
运行上述代码后,我们便可以获得如下信息:
[{'Uin': 0,
'UserName': '@xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
'NickName': '张三',
'HeadImgUrl': '/cgi-bin/mmwebwx-bin/webwxgeticon...},
{'Uin': 0,
'UserName': '@yyyyyyyyyyyyyyyyyyyyyyyyyyyyyy',
'NickName': '李四',
'HeadImgUrl': '/cgi-bin/mmwebwx-bin/webwxgeticon...},
...]
上面的信息中,每个好友都有一个唯一的UserName
,可以用来获取其聊天记录等其他信息。
3. 好友数据分析
3.1 好友性别比例分析
我们可以对好友的性别进行统计和分析,用以下代码获取好友性别信息:
male = female = other = 0
for friend in friends[1:]:
sex = friend['Sex']
if sex == 1:
male += 1
elif sex == 2:
female += 1
else:
other += 1
total = len(friends[1:])
print("男性好友:{:.2%}".format(float(male)/total))
print("女性好友:{:.2%}".format(float(female)/total))
print("其他:{:.2%}".format(float(other)/total))
运行上述代码后,我们便可以得到如下结果:
男性好友:42.27%
女性好友:32.63%
其他:25.10%
我们可以使用以下代码对上述信息进行可视化:
import matplotlib.pyplot as plt
plt.figure(figsize=(6, 9))
labels = [u'男性好友', u'女性好友', u'其他']
sizes = [male, female, other]
explode = (0, 0.1, 0)
patches, l_text, p_text = plt.pie(sizes, explode=explode, labels=labels, labeldistance=1.1, autopct='%3.1f%%', shadow=False, startangle=90, pctdistance=0.6)
for t in l_text:
t.set_size = (30)
for t in p_text:
t.set_size = (20)
plt.axis('equal')
plt.legend(loc='upper left', bbox_to_anchor=(-0.1, 1))
plt.grid()
plt.show()
运行上述代码后,我们可以得到如下图形(图中为占比):
从上图中,我们可以看出男性好友人数最多,其次是女性好友,而其他性别的好友较少。
3.2 好友地理位置分析
我们同样可以统计好友所在地的分布情况,用以下代码实现:
# 获取好友所在地信息列表
provinces = []
for friend in friends:
province = friend['Province']
if province != '':
provinces.append(province)
# 统计各地区好友数量
data = {}
for province in provinces:
if province not in data.keys():
data[province] = 1
else:
data[province] += 1
# 对好友数量进行排序
data_list = list(data.items())
data_list.sort(key=lambda x: x[1], reverse=True)
# 输出前10个地区的好友信息
for i in range(10):
print(data_list[i][0], data_list[i][1])
运行上述代码后,我们可以得到如下结果(根据隐私保护,这里只展示前三个):
广东 122
上海 50
北京 40
...
我们可以将结果进行可视化展示,用以下代码实现:
from pyecharts.charts import Map
from pyecharts import options as opts
province = [province[0] for province in data_list]
count = [province[1] for province in data_list]
m = (
Map()
.add("", [list(z) for z in zip(province, count)], "china")
.set_global_opts(
title_opts=opts.TitleOpts(title="微信好友地理分布图"),
visualmap_opts=opts.VisualMapOpts(max_=max(count)),
)
)
m.render_notebook()
运行上述代码后,我们可以得到如下地图:
从上图中,我们可以看到广东好友人数最多,其次是上海和北京。
3.3 好友签名词云分析
我们可以通过分析好友的签名,从中得到一些有趣的信息。我们可以先把好友的签名信息提取出来,然后用jieba库进行分词处理,最后使用wordcloud库进行可视化展示。
我们先运行以下代码对好友的签名进行获取和处理(这里我们只对200个好友的签名进行处理):
import jieba
import re
from wordcloud import WordCloud
from PIL import Image
text = ''
for friend in friends[0:200]:
# 处理签名中的特殊字符
signature = friend['Signature'].strip().replace('span', '').replace('class', '').replace('emoji', '')
signature = re.sub(r'1f(\d.+)', '', signature)
signature = re.sub(r'\<.*?\>', '', signature)
# 签名为空值,表示该好友没有设置签名
if len(signature) == 0:
continue
# 对签名进行分词
signature = ' '.join(jieba.cut(signature, cut_all=True))
text += ' '.join(signature.split())
# 显示前200个字符
print(text[0:200])
运行上述代码后,我们可以得到如下结果:
此刻 时光 前行 不加悔恨 晚安
有趣 小清新 活泼 开朗 待人友善 喜欢交新朋友 却不想放弃了任正非。 ~ 上善若水,广...
...
接着,我们可以使用以下代码生成签名的词云图(词云图需要安装wordcloud库):
# 设置待生成词云图的背景图片
background_image = np.array(Image.open('./background.jpg'))
word_cloud = WordCloud(
# 设置字体路径和字体大小
font_path="./SourceHanSans-Regular.otf",
max_words=200,
width=2000,
height=1600,
# 设置背景颜色和背景图片
background_color="white",
mask=background_image,
).generate(text)
plt.imshow(word_cloud, interpolation="bilinear")
plt.axis("off")
plt.show()
运行上述代码后,我们可以得到如下图片:
从上图中,我们可以看出,一些词汇比如“好友”、“爱生活”、“努力”、“感恩”等比较常见,还有一些有趣幽默的词汇,如“单身狗”、“鸣锣开道”等。
4. 总结
在本文中,我们使用了Python对微信好友的特征数据进行了分析和处理,并通过可视化的方式展示了分析结果。从中我们可以看到好友性别占比、地理位置分布、签名特征等信息,为我们在日常生活中使用微信进行沟通提供了一些有用的参考。