介绍
-
我们知道,python有很多支持的第三方库,有些库广泛用于数据分析,例如numpy和pandas,而用于方方面面的第三方库里面,一个比较有趣的库是itchat。
-
itchat是一个开源的微信个人号接口,使用python调用微信从未如此简单。
使用不到三十行的代码,你就可以完成一个能够处理所有信息的微信机器人。 -
itchat可以用来做自动回复聊天机器人,并且还可以自动添加好友等等,本次我们只获取好友信息并对其进行分析。
实现
-
这次我要讲的是利用itchat库来获取好友信息,并主要对其性别和个性签名进行分析。
-
Ps:主要是因为我的微信好友不多,然后好友城市等信息比较少,就没继续写了,暗示加波微信。
-
下面是效果图:(好像暴露了什么,emm女性好友少了点,可能解释了我为什么单身)
现在我们开始来实现它把。
-
环境:
Windows10、Anaconda(Python的IDE)、相关的库(itchat、jieba、WordCloud) -
如果没有安装Anaconda的请参考我的这篇文章Windows10下安装Anaconda3(64位)详细过程
-
首先我们打开Jupyter Notebook来新建一个文件,然后输入以下代码来导入库:
import itchat #提供微信接口的库 import jieba.analyse #结巴分词(中文分词) import codecs #编码格式用到的 from wordcloud import WordCloud #词云库 from scipy.misc import imread #读取图片的库 import matplotlib.pyplot as plt #画图的库 import matplotlib.font_manager as fm #加载中文字体的库 myfont=fm.FontProperties(fname='C:\Windows\msyh.ttc')
-
调用itchat的方法来获取好友的信息:
#登陆方法 hotReload参数设置成True的话第二次登陆只需要在手机上同意登陆就行了,而不需要再次扫码登陆 itchat.auto_login(hotReload=True) #爬取自己好友相关信息,返回一个json格式的信息 friends=itchat.get_friends(update=True)[0:] itchat.logout() #退出登录
-
观察结构
-
定义一个方法,用来解析各个变量
#解析数据包括好友昵称 备注 性别 省份 城市 个人简介 点赞数 def get_var(var): variable=[] for friend in friends: value=friend[var] if value=='': value='无' variable.append(value) return variable
-
调用函数得到各个变量,并转换成字典的格式
NickName=get_var('NickName')#昵称 RemarkName=get_var('RemarkName')#备注名称 Sex=get_var('Sex')#性别 Province=get_var('Province')#省 City=get_var('City')#市 Signature=get_var('Signature')#个性签名 AttrStatus=get_var('AttrStatus')#点赞数 data={'NickName':NickName,'RemarkName':RemarkName,'Sex':Sex,'Province':Province,'City':City,'Signature':Signature,'AttrStatus':AttrStatus}
-
将数据写入文件
with codecs.open("WeiXin.json","w",encoding='utf-8') as f: f.write(str(data))
-
分析自己好友的性别比例
#初始化计数器 male=female=other=0 #第一个是自己所以是datas[1:] for sex in data['Sex'][1:]: if sex==1: male+=1 elif sex==2: female+=1 else: other+=1 #计算朋友总数 total=male+female+other male=float(male)/total*100 female=float(female)/total*100 other=float(other)/total*100 #打印出自己的好友的性别比例 print("男性好友:%.2f%%"%(male)) print("女性好友:%.2f%%"%(female)) print("不明性别好友:%.2f%%"%(other))
-
将数据转化为柱状图,更直观的表现数据的特征
index=[0,1,2] #索引 values=[male,female,other]#值 fig,ax=plt.subplots() #导入简体中文字体,才能正确的显示中文 plt.title('性别分布',fontproperties=myfont) a=ax.bar(0,male,color='r') b=ax.bar(1,female,color='g') c=ax.bar(2,other,color='b') plt.xticks(index,['男','女','未知'],fontproperties=myfont) #添加数据标签 for x in a+b+c: h=x.get_height() ax.text(x.get_x()+x.get_width()/2,h,'%.2f%%'%h,ha='center',va='bottom') plt.show()
-
将好友的个性签名先通过结巴分词分割,分词后在用wordcloud画出词云图
#TODO个性签名词云图 siglist='' for Signature in data['Signature']: #将签名中的一些不正常的字符去掉 Signature=Signature.replace('span','').replace('\r\n','').replace('emoji','') Signature=Signature.replace('class','').replace('"','').replace('无','').replace('< = 1f61e>','') Signature=Signature.replace('< = 1f60c>','').replace('</>','').replace('< = 1f388>','') Signature=Signature.replace('\u3000','').replace('< = 1f4de>️','').replace('< = 1f343>','').replace('< = 2601>','') #结巴分词切割签名 siglist += ' '.join(jieba.analyse.extract_tags(Signature,5)) #读取背景图片 backgroud_Image = imread('1.png') #设置词云样式 创建WordCloud对象 wc = WordCloud(font_path=r'C:\Windows\msyh.ttc',background_color='white',max_words=2000,mask=backgroud_Image) #将词汇导入 wc.generate(siglist) #将结果存储到图片中 wc.to_file('test2.png') # 显示词云图 plt.figure(figsize=(15,15)) plt.imshow(wc,interpolation='bilinear') # 是否显示x轴、y轴下标 plt.axis('off') plt.show()
附:素材下载链接
总结:
这里我们首先用itchat的方法获得了好友的相关信息,然后对信息进行处理,通过计算或者切割来完成我们的目的,得到性别分布图和好友签名词云图。
当然itchat的功能不只这么一点,下次我会写一个在服务器上面部署微信自动聊天机器人的博客,欢迎大家交流
至此我们就大功告成了
我的个人博客网站是:www.coderyyn.cn
上面会不定期分享有关爬虫、算法、环境搭建以及有趣的帖子
欢迎大家一起交流学习
转载请注明