前言

每天都在使用微信,在移动互联网到来之时,腾讯内部组建了三支团队,同时开发同样的产品————微信,最后是广州做邮箱出身的团队赢了,杀入了移动互联网这片红海。

微信第一次出现在我们面前的时候,是在 2011 年,那时候更多人是使用 QQ ,对微信没什么好感,直到附近的人摇一摇这些约炮功能的出现,让人们爱不释手,如果说这是资本原罪,那么朋友圈这个功能的出现,着实满足了用户内心深处的窥探欲望,再到公众号的出现,微信已经牛的一批了。

我的微信好友中,有些朋友是熟悉的,有些朋友是不太熟悉的,比如看了我的文章或 blog 添加的我,不过没关系,在茫茫人海中相遇便是缘。那么我在想,把我的微信好友的数据用 Python 爬取下来,分析一下,应该会很有趣。

微信有个网页版的登录,那么可以从这里入手,有个牛逼的itchat模块,两行代码,就能让我们登录并且获取好友信息了:

1
2
3
# 微信登录
itchat.auto_login(hotReload=True)
friends = itchat.get_friends(update=True)

当我扫码登录完之后呢,就可以获取到我的好友数据了:

我微信好友中的性别比例

在返回的数据中,有一个叫做 Sex 的字段,就是性别,简单的分析可以知道 0未知 1男 2女 ,将所有好友中的性别数据提取出来,接着使用 matplotlib 画个饼图:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
sexs = list(map(lambda x:x['Sex'],friends[1:]))
counts = Counter(sexs).items()
counts = sorted(counts, key=lambda x:x[0], reverse=False)
counts = list(map(lambda x:x[1],counts))
# 0未知 1男 2女
labels = ['未知','小哥哥','小姐姐']
colors = ['yellowgreen','darkslateblue','orangered']
plt.figure(figsize=(8,5), dpi=80)
plt.axes(aspect=1)
plt.pie(counts,
labels=labels,
colors=colors,
labeldistance = 1.1,
autopct = '%3.1f%%',
shadow = False,
startangle = 90,
pctdistance = 0.6
)
plt.legend(loc='upper right',)
plt.title(u'%s的微信好友性别比例' % friends[0]['NickName'])
plt.show()

得出结果:

挖槽,小哥哥那么多,我的妹纸们呢?女神呢?

不过想想,我的微信好友大多是程序员/破涕为笑,也就平复下心情了,妹纸快加我微信啊,让我的饼图好看一些 - -

我微信好友中的态度

微信有个个性签名的东西,每个人会把自己的座右铭,或者喜欢的话语写上,试着来分析一下我的好友中用到最多的词是什么,把语句进行结巴分词,然后搞一张云词出来,应该不错。

在获取到好友的数据中,有个 signature 的字段,就是好友的个签了,有些朋友会加上一些表情什么的,先把它们过滤掉,然后再使用 SnowNLP 分析,通过结巴分词分析完就可以用 wordcloud 生成云图了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
def analyseSignature(friends):
signatures = ''
emotions = []

for friend in friends:
# 获取好友的签名
signature = friend['Signature']
if (signature != None):
# 过滤掉标签和表情
signature = signature.strip().replace('span', '').replace('class', '').replace('emoji', '')
signature = re.sub(r'1f(\d.+)', '', signature)

if (len(signature) > 0):
# 分析标签
nlp = SnowNLP(signature)
# 获取情绪值
emotions.append(nlp.sentiments)
# 结巴分析
signatures += ' '.join(jieba.analyse.extract_tags(signature, 5))

back_coloring = np.array(Image.open('baseketball.jpg'))
wordcloud = WordCloud(
...
)

# 生成云词
wordcloud.generate(signatures)
plt.imshow(wordcloud)
plt.axis("off")
plt.show()
wordcloud.to_file('signatures.jpg')

生成结果:

可以看得出来,我的朋友们还是挺正能量,努力,坚持,生活,人生是出现的比较多的词。多跟正能量的人在一起,互相传递能量,挺好。

我微信好友中的情感

SnowNLP 可以获取 sentiments,我理解为情绪值,从0到1,值越高说明越正能量,可以通过这个值,画一个图,看看我微信好友们的情感是怎么样的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
count_good = len(list(filter(lambda x: x > 0.66, emotions)))
count_normal = len(list(filter(lambda x: x >= 0.33 and x <= 0.66, emotions)))
count_bad = len(list(filter(lambda x: x < 0.33, emotions)))
labels = [u'负能量', u'中性', u'正能量满满']
values = (count_bad, count_normal, count_good)
plt.rcParams['font.sans-serif'] = ['simHei']
plt.rcParams['axes.unicode_minus'] = False
plt.xlabel(u'情感判断')
plt.ylabel(u'频数')
plt.xticks(range(3), labels)
plt.legend(loc='upper right', )
plt.bar(range(3), values, color='rgb')
plt.title(u'%s的微信好友签名信息情感分析' % friends[0]['NickName'])
plt.show()

结果:

可以看到,负能量的人还是少数的,大多都正能量满满,我喜欢。

我微信好友都住在哪里

在返回的微信好友数据中,有一个 Province 字段,用来说明用户所处的省份,那么用这个字段,就可以统计出,我的微信好友在哪里,把这些数据统计出来,然后显示在中国地图上,应该会很直观,这里我使用到了 pyecharts 模块来进行地图可视化:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

def analyseLocation(friends):
keys = []
values = []
province = list(map(lambda x: x['Province'], friends[1:]))

for i in set(province):
keys.append(i)
values.append(province.count(i))

maps = Map("中国地图", '中国地图', width=1200, height=600)
maps.add("", keys, values, visual_range=[0, 50], maptype='china', is_visualmap=True,
visual_text_color='#000')
maps.show_config()
maps.render(path="localtion.html")

结果如下:

哇塞!我的好友快要遍布整个中国了,就差新疆,青海,宁夏,天津和宝岛台湾了,以后我是不是就不用学习数理化也可以走遍中国都不怕了哈哈哈!

ok~ 我主要从微信好友的性别,态度,情感和位置进行了分析,除了觉得我的微信好友中女生比较少之外,其它都挺不错的,继续努力,希望以后我的朋友们越来越牛逼!

ps:如果你也想分析下你的微信好友,想要获取源码的话可以在公众号后台发送「微信」获取。

相关

  1. python3入门基础有趣的教程
  2. Python爬虫基础:爬取妹子图片并保存到本地
  3. python 爬虫应该学习什么知识点?
  4. python 爬取当当网最受欢迎的500本书