天天看点

小试牛刀——利用python分析微信好友,并实现数据可视化

最近发现了一个非常好玩的python库——itchat,itchat是一个开源的微信个人号接口,可以使用python非常简单的调用微信。详细文档请移步itchat官档。

本文不会详细展开,但是通过本文,你可以学到:

  1. 通过itchat获取微信好友的个人相关信息;
  2. 对获取到的相关信息进行分析,并将分析结果进行可视化展现。

首先获取微信好友的相关信息

话不多少,上代码

# 获取数据
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')
           

结果见下图:

小试牛刀——利用python分析微信好友,并实现数据可视化

等等,那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')
           

结果见下图:

小试牛刀——利用python分析微信好友,并实现数据可视化

由于地区太多,只取了前15个地区的数据作为显示。

长期在北京生活和工作,北京的好友自然就排在了第一位,不过Dubayy(迪拜)的好友是哪位?Dublin(都柏林)的朋友呢?

好友城市分布

此处就不贴详细代码了,将好友地区分布中的代码修改一下即可

for item in areas:
    province = item.split(',')[4]
    if province != '':
        area.append(province)
           

结果见下图:

小试牛刀——利用python分析微信好友,并实现数据可视化

除了海淀的好友,济南的朋友还有很多啊

好友签名数据分析
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分析微信好友,并实现数据可视化

看来我的好友签名还是比较和谐的,各位朋友,你能找到你的签名在哪吗?

感谢您能耐心看完这篇文章,以上只是python相关知识的小练习,大牛轻喷

欢迎加入我的wanpython交流群:851288964

大家一起发现python之美,共同学习,共同交流,共同进步!

小试牛刀——利用python分析微信好友,并实现数据可视化