记得2016年第一次开通微信的时候,我以及周围的大多数人还是重度的QQ用户,当时只是跟风开通了一下,也没觉得会改变什么。没想到才两年过去,我已经忘记了QQ的存在,每天起来第一件事就是查看微信,睡觉前也必然要看一下朋友圈有什么好玩有意义的事情,不得不说腾讯的产品策略绝对是一流的。那么我们能用python对微信做些什么呢?
还好微信官方有一个比较冷门的python库-itchat,这是微信提供的一个借口,我们可以借由它来实现对微信信息的提取,本文要做的是提取微信好友信息并对个性签名进行可视化处理。
首先安装我们所需要的库:
pip install itchat
pip install matplotlib.pyplot #用于生成2D图
pip install jieba #用于中文分词
pip install wordcloud #用于词云生成
第一步:提取好友信息:
调用itchat,通过扫码登陆网页微信获取返回的好友信息,代码如下:
def get_data():itchat.auto_login() #调用登陆模块friends=itchat.get_friends(update=True) #获取好友信息return friends
运行程序扫描生成的二维码登陆微信姐可以看到所有的好友信息,涉及隐私,这里就不放图了。
第二步:通过对返回的信息分析发现,每一行为一个好友的完整信息,用‘,’隔开顺序依次为:昵称,备注名,性别(1为男,2为女,0为不确定(什么鬼阿),省份,城市,个性签名,星标,特殊好友权限),这里定义一个函数将获取的数据存储到列表中,代码如下:
def prase_data(data):friends=[]for item in data[1:]:friend={'NickName':item['NickName'], #昵称'RemarkName':item['RemarkName'], #备注名'Sex':item['Sex'],#性别'Province':item['Province'],#省份'City':item['City'],#城市'Signature':item['Signature'].replace('\n',' ').replace(' ',' '), #处理换行问题'StarFriend':item['StarFriend'],#星标朋友'ContactFlag':item['ContactFlag'] #好友权限}friends.append(friend)return friends
第三步:再定义一个函数将获取的列表保存为.txt文件,代码如下:
def save_to_txt():friends=prase_data(get_data())for item in friends:with open ('jjdfriend.txt','a',encoding='utf-')as f:f.write('%s,%s,%d,%s,%s,%s,%d,%d\n'%(item['NickName'],item['RemarkName'],item['Sex'],item['Province'],item['City'],item['Signature'],item['StarFriend'],item['ContactFlag']))
第四步:接下来是最重要的部分,获取个性签名并生成词云,安装好所需要的库文件之后,代码如下:
from wordcloud import WordCloud,STOPWORDS
import matplotlib.pyplot as plt
import jiebasigns=[]
with open ('fkdfriend.txt','r',encoding='utf-8')as f:rows=f.readlines()for row in rows:sign=row.split(',')[5]if sign!="":signs.append(sign)split=jieba.cut(str(signs))#分词
words=' '.join(split)#以空格连接
stopwords=STOPWORDS.copy()#设置屏蔽词
stopwords.add('span')
stopwords.add('class')
stopwords.add('emoji1f334')
stopwords.add('emoji1f388')
stopwords.add('emoji1f33a')
stopwords.add('emoji1f33c')
stopwords.add('emoji1f3633')bg_image=plt.imread('ground.jpg')
wordcloud = WordCloud(mask=bg_image,background_color='white',scale=1.5,stopwords=stopwords).generate(words)
#image_colors=ImageColorGenerator(bg_image)
plt.imshow(wordcloud)
plt.axis('off')
plt.show()
wordcloud.to_file('word.jpg')
生成的图片如下:
问题来了,为什么生成的是乱码,查询资料后发现wordcloud是默认不支持中文的,所以我们需要进行一些操作,首先找到系统中的字体文件夹:位置为:C:\Windows\Font,打开后里有这些字体:
这里我选择了微软雅黑字体,接下来需要将字体文件复制到系统安装wordcloud位置,路径如下:C:\Users\Administrator\AppData\Local\Programs\Python\Python37\Lib\site-packages\wordcloud,将选择字体粘贴到文件夹内,如下图:
并且修改上面一句代码为:
wordcloud = WordCloud(mask=bg_image,background_color='white',font_path='msyhbd.ttc',scale=1.5,stopwords=stopwords).generate(words)#增加中文字体
运行成功,效果如下:
通过词云,你或许会恍然大悟,原来你们这样的人啊。是啊,在现在这个社会,我们似乎更像是一个行走的数据包,而且几乎每时每刻都在产生新数据,有很多人对大数据时代感到恐惧,认为隐私会被滥用之类。但事实上,每一次新技术的出现伊始都会有这样的声音,但我相信技术是无罪的,有问题的只是一部分人而已,并且这样的人无论什么时代都会存在,所以让我们敞开胸怀,拥抱这个美好的大数据时代。
当然,微信好友中能处理的信息还有很多,比如性别分布,地理位置都很有分析价值,有兴趣的可以尝试,这里推荐一个百度开源的python可视化库-pyecharts,这个库可以很大程度上替代matplotlib,pygal以及Geo。好了,就啰嗦这么多。
备注:本文中涉及的jieba库所用到的分词技术看起来好像是一个很神奇的东西,原来我也这么认为,但直到看来吴军先生的《数学之美》一书,发现它的解决依旧是使用了很常见的数学模型-马尔科夫链,感兴趣的可以阅读这一部分内容。