最近发现了一个非常好玩的python库——itchat,itchat是一个开源的微信个人号接口,可以使用python非常简单的调用微信。详细文档请移步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')
等等,那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')
结果见下图:
看来我的好友签名还是比较和谐的,各位朋友,你能找到你的签名在哪吗?
欢迎加入我的wanpython交流群:851288964
大家一起发现python之美,共同学习,共同交流,共同进步!