周末了,总想搞点事情,无意中了解到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()
从云词中可以看出,我的微信好友签名中有人为了生活而努力,奋不顾身;有人非常注重信用,有人渴望成功,也有脚踏实地专心做着贷款金融精英。。。还有一群管老婆叫大人的妻管严(真编不下去了)。
最后,附上本人帅气的微信头像,大家对比一下:
今天的搞事情系列就到这里,有兴趣的朋友可以试一试!更多更好玩的,敬请期待!