扒扒我的微信朋友圈

来源:互联网 发布:软件测试培训三个月 编辑:程序博客网 时间:2024/06/12 00:47

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


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

import itchatitchat.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 pltimport numpy as np%matplotlib inlineplt.rcParams['font.sans-serif']=['STHeiti'] #用来正常显示中文标签plt.rcParams['axes.unicode_minus'] = False #创建figurefig = 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 pdNickName = 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 resiglist = []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 jiebawordlist = jieba.cut(text , cut_all= True)word_space_split = " ".join(wordlist)
好了,进入画图阶段了,可以根据自己喜欢的图片、颜色、形状画出相似的图片,我这里用的是我自己的微信头像。
from wordcloud import WordCloud , ImageColorGeneratorimport numpy as npimport PIL.Image as Imagefig = 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()



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


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






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

原创粉丝点击