扒扒我的微信朋友圈

周末了,总想搞点事情,无意中了解到Python中的itchat包,可以抓取个人微信账号的信息。于是乎。。。


首先安装itchat 包,在通过ITCHAT登录微信,过程中会产生一个二维码,微信扫描即可登录。

import itchat
itchat.login()

#friends[0]是自己的信息,所以从friends[1]开始
friends = itchat.get_friends(update = True)[1:]


涉及到隐私,做一下去敏:

#关键信息去敏

Name = []
for x in NickName:
    x1 = x.replace(x,x[0]+"*"*(len(x)-1))
    Name.append(x1)
data = pd.DataFrame({'Name':Name, 'Sex':Sex, 'Province':Province, 'City':City, 'Signature':Signature})
data.head()

运行结果如下:



好了,我们瞅一眼就行。

1. 自己微信好友的男女比例

#初始化计数器
male = female = other = 0
#
for i in friends:
    sex = i['Sex']
    if sex ==1:
        male +=1
    elif sex ==2:
        female +=1
    else:
        other +=1
#计算朋友总数
total = len(friends[1:])
#打印出自己好友的性别比例
print('男性好友: %.2f%%' %(float(male)/total*100))
print('女性好友:%.2f%%' %(float(female)/total*100))
print( '不明性别的好友: %.2f%%' %(float(other)/total*100))

输出结果如下:

男性好友: 62.02%
女性好友:31.78%
不明性别的好友: 6.98%

   哎呀,女性好友也不少,然而为什么还是一只汪委屈。好了这不重要,我们看看分布图:

import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline

plt.rcParams['font.sans-serif']=['STHeiti'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False 
#创建figure
fig = plt.figure(figsize = (6,9))
labels =['男性好友', '女性好友', '不明性别的好友']
colors = ['red','yellowgreen','lightskyblue']
sizes = [male, female, other]
explode = (0.05,0,0)
plt.pie(sizes,explode=explode,labels=labels,colors=colors,
                                labeldistance = 1.1,autopct = '%3.1f%%',shadow = False,
                                startangle = 90,pctdistance = 0.6)
# patches,l_text,p_text = 
# for t in l_text:
#     t.set_size=(30)
# for t in p_text:
#     t.set_size=(20)
# 设置x,y轴刻度一致,这样饼图才能是圆的
plt.axis('equal')
plt.legend()
plt.show()


我竟然有这么多好友连自己的性别都不知道,那谁谁谁,自己看一下自己。


2. 自己微信好友的城市分布
再仔细观察friends列表,发现里面还包含了好友昵称、省份、城市、个人简介等等的数据,刚好可以用来分析好友城市分布,最好的方式是定义一个函数把数据都爬下来,存到数据框里,再进行分析。

#定义一个函数,爬去各个变量
def get_var(var):
    variable = []
    for i in friends:
        value = i[var]
        variable.append(value)
    return variable
# 调用函数得到想要的变量,保存在CSV文件中
import pandas as pd
NickName = get_var('NickName')
Sex = get_var('Sex')
Province = get_var('Province')
City = get_var('City')
Signature = get_var('Signature')
#省份这一列中有空字符串,我们用‘其他’字符串代替
province =[]
for each in Province:
    if each =='':
        province.append('其他')
    else:
        province.append(each)
        
data_new = pd.DataFrame({'Name':Name, 'Sex':Sex, 'Province':province, 'City':city, 'Signature':Signature})
print(data_new.head())
print(data_new.info())

#画出好友城市分布图
#先分组
province_dis = data_new.groupby('Province')['Province'].count().sort_values(ascending = False)
province_dis


再做一个分布图:

fig, ax = plt.subplots(figsize = (9,6))
labels = province_dis.index.tolist()
plt.bar(range(len(province_dis)),province_dis.values.tolist(),tick_label = labels,ec='k', lw=1, hatch='o',color = 'g')
ax.set_xticklabels(labels, rotation =65)
plt.show()




主要分布也是符合实际场景的,多在上海和江苏。哎呦,我还不知道,我的好友中有这么多‘歪果仁’’。


3. 微信好友个性签名的自定义词云图

import re
siglist = []
for i in friends:
    signature = i["Signature"].strip().replace("span","").replace("class","").replace("emoji","")
    rep = re.compile( "1fd+w*|[<>/=]")
    signature = rep.sub( "", signature)
    siglist.append(signature)

text = "".join(siglist)
这边用的是结巴分词库
import jieba
wordlist = jieba.cut(text , cut_all= True)
word_space_split = " ".join(wordlist)
好了,进入画图阶段了,可以根据自己喜欢的图片、颜色、形状画出相似的图片,我这里用的是我自己的微信头像。
from wordcloud import WordCloud , ImageColorGenerator
import numpy as np
import PIL.Image as Image
fig = plt.figure(figsize=(10,10))
coloring = np.array(Image.open( "./wechat.jpg"))
my_wordcloud = WordCloud( background_color= "black", max_words= 2000,
                         mask=coloring , max_font_size= 60, random_state= 42, 
                         scale= 2,font_path = "./华文仿宋.ttf").generate(word_space_split)
image_colors = ImageColorGenerator(coloring)
plt.imshow(my_wordcloud.recolor( color_func=image_colors))
plt.imshow(my_wordcloud)
plt.axis( "off")
plt.show()



从云词中可以看出,我的微信好友签名中有人为了生活而努力,奋不顾身;有人非常注重信用,有人渴望成功,也有脚踏实地专心做着贷款金融精英。。。还有一群管老婆叫大人的妻管严(真编不下去了)。


最后,附上本人帅气的微信头像,大家对比一下:






今天的搞事情系列就到这里,有兴趣的朋友可以试一试!更多更好玩的,敬请期待!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值