随着微信的普及,越来越多的人开始使用微信。微信已经从一个简单的社交软件逐渐变成了一种生活方式。人们日常交流需要微信,工作交流也需要微信。微信上的每一个好友都代表着人们在社会中扮演的不同角色。今天的文章将基于Python分析微信好友的数据。这里选择的维度主要包括:性别、头像、签名、所在地。结果主要以两种形式呈现:图表和词云。其中,文本信息会用到词频分析和情感分析两种方法。俗话说:工欲善其事,必先利其器。在本文正式开始之前,先简单介绍一下本文使用的第三方模块:itchat:微信网页版接口封装了Python版本,用于本文获取微信好友信息。jieba:结巴分词的Python版,本文使用它来处理文本信息的分词。matplotlib:Python中的图表绘制模块,本文用于绘制柱状图和饼图。snownlp:Python中的一个中文分词模块,在本文中用于对文本信息进行情感判断。PIL:Python中的一个图像处理模块,本文用来处理图像。numpy:Python中的一个数值计算模块,与本文的wordcloud模块配合使用。wordcloud:Python中的词云模块,本文用来绘制词云图。TencentYoutuyun:腾讯优图提供的Python版SDK,本文用于人脸识别和图像标签信息提取。以上模块可以通过pip安装。各个模块的详细使用说明请参考各自的文档。如果你也想学好Python,我最近整理了一套编程学习资料分享给大家。都是干货,包括教程视频、电子书、源码笔记、学习路线图、实战项目、面试题等,关注gzh【Python编程学习圈】即可免费获取,回复即可关键词【学习资料】,抓紧时间!01数据分析分析微信好友数据的前提是获取好友信息。通过使用itchat模块,这一切都会变得非常简单。我们可以通过下面两行代码来实现:itchat.auto_login(hotReload=True)friends=itchat.get_friends(update=True)和登录网页版微信一样。我们可以用手机扫描二维码登录。这里返回的friends对象是一个集合,第一个元素是当前用户。因此,在下面的数据分析过程中,我们始终以friends[1:]作为原始输入数据,集合中的每个元素都是一个字典结构。以我为例,大家可以注意到有Sex,City,Province,HeadImgUrl,Signature这四个字段。我们接下来的分析将从这四个字段入手:02好友性别要分析好友性别,我们首先需要获取所有好友的性别信息。这里我们将每个好友信息的Sex字段提取出来,然后分别统计Male、Female和Unkonw的数量。我们将这三个值组装成一个列表,然后使用matplotlib模块绘制饼图。代码实现如下:defanalyzeSex(firends):sexs=list(map(lambdax:x['Sex'],friends[1:]))counts=list(map(lambdax:x[1],Counter(sexs).items()))labels=['Unknow','Male','Female']colors=['red','yellowgreen','lightskyblue']plt.figure(figsize=(8,5),dpi=80)plt.axes(aspect=1)plt.pie(counts,#性别统计结果labels=labels,#性别显示标签colors=colors,#饼图区域配色labeldistance=1.1,#标签距离dotdistanceautopct='%3.1f%%',#饼图区域文字格式shadow=False,#饼图是否显示阴影startangle=90,#饼图起始角度pctdistance=0.6#饼图区域文字距离点)plt.legend(loc='右上',)plt.title(gendercompositionofu'%s'WeChatfriends'%friends[0]['NickName'])plt.show()这里简单解释一下这段代码,微信中的gender字段有3个值:Unkonw,Male和雌性物种,它们对应的值分别为0、1、2。通过Collection模块中的Counter()对这三个不同的值进行统计,其items()方法返回一组元组。元组的第一维元素表示key,即0,1,2,元组的第二维元素表示数,对元组的集合进行排序,即key按照顺序的0,1,2是按顺序排列的,所以这三个不同值的个数可以通过map()方法得到,我们可以传给matplotlib进行绘图。这三个不同值的百分比是通过matplotlib计算出来的。下图是matplotlib绘制的好友性别分布图:03好友头像分析从两个方面分析好友头像。第一,在这些朋友头像中,使用人脸头像的朋友比例是多少;第二,从这些好友头像中,可以从好友头像中提取出哪些有价值的关键词。这里需要根据HeadImgUrl字段将头像下载到本地,然后使用腾讯优图提供的人脸识别相关API接口检测头像图片中是否有人脸,提取图片中的标签。其中,前者是分类汇总,我们用饼图来呈现结果;后者是对文本进行分析,我们用词云来呈现结果。关键代码如下所示:defanalyseHeadImage(frineds):#InitPathbasePath=os.path.abspath('.')baseFolder=basePath+'\HeadImages\'if(os.path.exists(baseFolder)==False):os.makedirs(baseFolder)#分析图像faceApi=FaceAPI()use_face=0not_use_face=0image_tags=''forindexinrange(1,len(friends)):friend=friends[index]#保存头像imgFile=baseFolder+'\Image%s.jpg'%str(index)imgData=itchat.get_head_img(userName=friend['UserName'])if(os.path.exists(imgFile)==False):withopen(imgFile,'wb')asfile:file.write(imgData)#检测人脸time.sleep(1)result=faceApi.detectFace(imgFile)ifresult==True:use_face+=1else:not_use_face+=1#提取标签result=faceApi.extractTags(imgFile)image_tags+=','.join(list(map(lambdax:x['tag_name'],result)))labels=[u'使用人脸头像',u'不使用人脸头像']counts=[use_face,not_use_face]colors=['red','yellowgreen','lightskyblue']plt.figure(figsize=(8,5),dpi=80)plt.axes(aspect=1)plt.pie(counts,#性别统计结果labels=labels,#性别显示标签colors=colors,#饼图区域colormatchinglabeldistance=1.1,#label与圆点的距离autopct='%3.1f%%',#饼图区域的文字格式shadow=False,#饼图是否显示阴影startangle=90,#饼图起始角度pctdistance=0.6#饼图区域文字与圆点的距离)plt.legend(loc='右上',)plt.title(u'%s微信好友用脸avatars'%friends[0]['NickName'])plt.show()image_tags=image_tags.encode('iso8859-1').decode('utf-8')back_coloring=np.array(Image.open('face.jpg'))wordcloud=WordCloud(font_path='simfang.ttf',background_color=
