最近发现了一个非常好玩的python库——itchat,itchat是一个开源的微信个人号接口,可以使用python非常简单的调用微信。详细文档请移步itchat官档。
本文不会详细展开,但是通过本文,你可以学到:
- 通过itchat获取微信好友的个人相关信息;
- 对获取到的相关信息进行分析,并将分析结果进行可视化展现。
首先获取微信好友的相关信息
话不多少,上代码
# 获取数据
def get_data():
# 可以在程序关闭一定时间内再次开启也不用重新扫码
itchat.auto_login(hotReload=True)
friends = itchat.get_friends(update=True)
return friends
看到代码后,不要问怎么运行,运行后得到什么。直接试一下,答案就出现了,你会发现程序运行后,自动生成了一张二维码图片并被打开,等待着你微信客户端的扫描(类似于微信电脑版扫码登录一样),登录成功后,这张二维码图片也被关闭了。
将我们需要的数据保存起来(为了后续分析方便)
第一步拿到的数据有30几个字段,但是,本文主要讨论的范围比较小,所以只取其中几个字段,并保存为txt文件
def parse_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(',', ' '),
}
friends.append(friend)
return friends
def save_to_txt():
friends = parse_data(get_data())
for item in friends:
with open('friends.txt', mode='a', encoding='utf-8') as f:
f.write('{},{},{},{},{},{}\n'.format(
item['NickName'],
item['RemarkName'],
item['Sex'],
item['Province'],
item['City'],
item['Signature']))
数据可视化展现
本文中主要使用了plotly、matplotlib两个库,另外还使用了jieba分词和wordcloud词云
分析微信好友性别比例
import plotly as py
import plotly.graph_objs as go
with open('friends.txt', encoding='utf-8')as f:
info = f.readlines()
sexs = []
for item in info:
sex = item.split(',')[2]
sexs.append(sex)
labels = ['男', '女', '未知']
values = [sexs.count('1'), sexs.count('2'), sexs.count('0')]
layout = go.Layout(title='我的微信好友男女比例图')
trace = [go.Pie(labels=labels, values=values, hole=0.5, textinfo='label+value+percent')]
config = go.Figure(data=trace, layout=layout)
py.offline.plot(config, filename='男女比例.html')
结果见下图:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2cs0TSU1keWhVYrZlMMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLxczNzETOyETM5ATMxgTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
等等,那8.49%的性别未知好友是什么鬼?
好友地区分布
import plotly as py
import plotly.graph_objs as go
from collections import Counter
with open('friends.txt', encoding='utf-8')as f:
areas = f.readlines()
area = []
for item in areas:
province = item.split(',')[3]
if province != '':
area.append(province)
dict_province = dict(Counter(area).most_common(15))
x = []
y = []
for i in dict_province.keys():
x.append(i)
y.append(dict_province[i])
trace = [go.Bar(x=x, y=y)]
layout = go.Layout(title='我的好友地区分布')
figure = go.Figure(data=trace, layout=layout)
py.offline.plot(figure, filename='地区分布.html')
结果见下图:
由于地区太多,只取了前15个地区的数据作为显示。
长期在北京生活和工作,北京的好友自然就排在了第一位,不过Dubayy(迪拜)的好友是哪位?Dublin(都柏林)的朋友呢?
好友城市分布
此处就不贴详细代码了,将好友地区分布中的代码修改一下即可
for item in areas:
province = item.split(',')[4]
if province != '':
area.append(province)
结果见下图:
除了海淀的好友,济南的朋友还有很多啊
好友签名数据分析
import jieba
from wordcloud import WordCloud, STOPWORDS
import matplotlib.pyplot as py
with open('friends.txt', encoding='utf-8')as f:
info = f.readlines()
signatures = []
for item in info:
signature = item.split(',')[5]
if signature != '':
signatures.append(signature)
split = jieba.cut(str(signatures), cut_all=False)
words = ' '.join(split)
stopwords = STOPWORDS.copy()
stopwords.add('span')
stopwords.add('class')
stopwords.add('emoji')
bg_img = py.imread('people.jpg')
wc = WordCloud(background_color='white', mask=bg_img, font_path='simhei.ttf',
stopwords=STOPWORDS, max_font_size=100, random_state=10)
wc.generate_from_text(words)
py.imshow(wc)
wc.to_file('好友签名词云图.jpg')
结果见下图:
看来我的好友签名还是比较和谐的,各位朋友,你能找到你的签名在哪吗?
感谢您能耐心看完这篇文章,以上只是python相关知识的小练习,大牛轻喷
欢迎加入我的wanpython交流群:851288964
大家一起发现python之美,共同学习,共同交流,共同进步!