点击上方“何俊林”,马上关注,每天早上8:50准时推送

真爱,请置顶或星标

Illustrations by Evgenij Kungur 文/ Python攻城狮

最近研究了一下itchat和matplotlib,目前实现了对微信好友头像、性别、区域、个性签名的采集及展示。

本文就来详细介绍一下这个库的用法和一些核心逻辑实现。

1.微信登录

  • 三行代码实现登录,为了避免我们频繁扫描二维码登录,这里我们加入hotReload=True

import itchatitchat.auto_login(hotReload=True)
itchat.dump_login_status()
  • 好友信息获取

we_friend = itchat.get_friends(update=True)[:]

这里的we_friend是好友的信息的列表,每一个好友字典的 key 如下表

key 备注
UserName 微信系统内的用户编码标识
NickName 好友昵称
Sex 性别
Province 省份
City 城市
HeadImgUrl 微信系统内的头像URL
RemarkName 好友的备注名
Signature 个性签名

有了key对应的值,我们就好处理了。

2.好友性别

这里顺便提一下:如果sex=1则代表男性,sex=2代表女性

total = len(we_friend[1:])
for fri_info in we_friend[1:]:sex = fri_info['sex']# 如果sex=1 代表男性 sex=2代表女性if sex == 1:man += 1elif sex == 2:woman += 1else:other += 1

统计出男生、女生的以及总人数后,占比自然而然就出来了,为了更好的展示男女比例,我们以饼图展示。

  • 绘制饼图

man_ratio = int(man)/total * 100
woman_ratio = int(woman)/total * 100
other_ratio = int(other)/total * 100plt.rcParams['font.sans-serif'] = ['SimHei']    # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
plt.figure(figsize=(5, 5))  # 绘制的图片为正圆
sex_li = ['男', '女', '其他']
radius = [0.01, 0.01, 0.01]  # 设定各项距离圆心n个半径
colors = ['red', 'yellowgreen', 'lightskyblue']
proportion = [man_ratio, woman_ratio, other_ratio]plt.pie(proportion, explode=radius, labels=sex_li, colors=colors, autopct='%.2f%%')   # 绘制饼图# 加入图例 loc =  'upper right' 位于右上角 bbox_to_anchor=[0.5, 0.5] # 外边距 上边 右边 borderaxespad = 0.3图例的内边距
plt.legend(loc="upper right", fontsize=10, bbox_to_anchor=(1.1, 1.1), borderaxespad=0.3)# 绘制标题
plt.title('微信好友性别比例')    # 展示
plt.show()

微信好友性别比例

作为一个码农、程序猿,还能有这么多女性好友实属不易啊。敏感的我,看了这个比例深深地感觉到了不安,(此图女朋友不可见)另外,怎么还有一些未知生物的存在…


友情提醒:matplotlib中文乱码这个问题一直存在,这里记录下如何解决matplotlib中文乱码

  • 准备好想要使用的中文字体,这里我用的是SimHei,附下载地址:中文字体下载

  • 找到matplotlib的文件位置

import matplotlib
print(matplotlib.matplotlib_fname())    # 查看路径
  • 进入上方打印的路径

  • 把刚才下载的字体文件解压放入/usr/local/lib/python3.5/dist-packages/matplotlib/mpl-data/fonts/ttf 目录

  • 返回上级目录,修改matplotlibrc文件,取消相关注释,并在font.serif加入刚才下载的字体

font.family        : sans-serif
font.serif         : SimHei, DejaVu Serif, Bitstream Vera Serif, New Century Schoolbook, Century Schoolbook L, Utopia, ITC Bookman, Bookman, Nimbus Roman No9 L, Times New Roman, Times, Palatino, Charter, serif
  • 删除matplotlib缓存。

在terminal中:cd ~/.cache/matplotlib把.cache下面的matplotlib文件夹删除。$ rm -rf matplotlib

3.微信好友头像

这里其实看过我之前文章的应该知道,其实头像的拼接主要分为两部分

  • 1.采集所有好友头像保存本地,

import osnum = 0
pwd_path = os.path.abspath(os.path.dirname(os.getcwd()))
desc_photos = os.path.join(pwd_path, 'res/photos')
for i in friends:img = itchat.get_head_img(userName=i["UserName"])file_image = open(desc_photos + "/" + str(num) + ".jpg", 'wb')file_image.write(img)file_image.close()num += 1
  • 2.对所有头像进行拼接

ls = os.listdir(desc_photos)
each_size = int(math.sqrt(float(640 * 640) / len(ls)))  # 算出每张图片的大小多少合适
lines = int(640 / each_size)
image = Image.new('RGBA', (640, 640))   # 创建640*640px的大图
x = 0
y = 0for i in range(0, len(ls) + 1):try:img = Image.open(desc_photos + "/" + str(i) + ".jpg")except IOError:print("Error")else:img = img.resize((each_size, each_size), Image.ANTIALIAS)image.paste(img, (x * each_size, y * each_size))    # 粘贴位置x += 1if x == lines:  # 换行x = 0y += 1image.save(desc_full + "/好友头像拼接图.jpg")

密集恐惧症患者请忽略!!!

好友头像拼接

4.微信好友地区分布

获取区域及城市

prov_dict, city_dict = {}, {}
for fri_info in we_friend[1:]:prov = fri_info['province']city = fri_info['city']if prov and prov not in prov_dict.keys():prov_dict[prov] = 1elif prov:prov_dict[prov] += 1if city and city not in city_dict.keys():city_dict[city] = 1elif city:city_dict[city] += 1

由于城市太多,我们取好友数量排名前十的城市及区域进行展示,感兴趣的可以稍微改下代码,就可以展示所有区域人数。

排序这里我用了Python的sorted()函数,列表的每个元素都为二维元组,key参数传入了一个lambda函数,其x就代表列表里的每一个元素,然后分别利用索引返回元素内的第一个和第二个元素,这就代表了sorted()函数利用哪一个元素进行排列。而reverse决定是正序还是倒序,默认为False。

# 区域Top10
prov_dict_top10 = sorted(prov_dict.items(), key=lambda x: x[1], reverse=True)[0:10]
# 城市Top10
city_dict_top10 = sorted(city_dict.items(), key=lambda y: y[1], reverse=True)[0:10]
  • 区域、城市柱形图展示,由于思路代码是一致的,所以这里只展示区域的代码

prov_nm, prov_num = [], []  # 省会名 + 数量
for prov_data in prov_dict_top10:prov_nm.append(prov_data[0])prov_num.append(prov_data[1])pwd_path = os.path.abspath(os.path.dirname(os.getcwd()))
desc_full = os.path.join(pwd_path, 'res')
colors = ['#00FFFF', '#7FFFD4', '#F08080', '#90EE90', '#AFEEEE','#98FB98', '#B0E0E6', '#00FF7F', '#FFFF00', '#9ACD32']
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号index = range(len(prov_num))
plt.bar(index, prov_num, color=colors, width=0.5, align='center')plt.xticks(range(len(prov_nm)), prov_nm)  # 横坐轴标签
for x, y in enumerate(prov_num):# 在柱子上方1.2处标注值plt.text(x, y + 1.2, '%s' % y, ha='center', fontsize=10)
plt.ylabel('省会好友人数')  # 设置纵坐标标签
prov_title = '微信好友区域Top10'
plt.title(prov_title)    # 设置标题
plt.savefig(desc_full + '/微信好友区域Top10')  # 保存图片

微信好友区域Top10

微信好友城市Top10

通过柱形图展示,可以清晰看到我的好友主要分布在河南和上海,借此不难推测出我的工作地址以及户籍所在地。

5.微信好友个性签名情感分析及词云图展示

这里使用了常用的中文分词库jieba,词云图的背景采用了萌萌哒小猪佩奇(´๑•_•๑)

  • 分词

sign_li = []
rule = re.compile("1fd+w*|[<>/=]")    # 定义正则规则
for fri_info in we_friend[1:]:signature = fri_info['signature']if signature:sign_deal = signature.replace('
', '').replace('    ', '').replace(' ', '').replace("span", "").replace("class", "").replace("emoji", "")sign = rule.sub("", sign_deal)sign_li.append(sign)
  • 制作词云图

pwd_path = os.path.abspath(os.path.dirname(os.getcwd()))
conf_path = os.path.join(pwd_path, 'conf/')
comment_txt = ''
back_img = plt.imread(conf_path + '/peiqi.jpg')
cloud = WordCloud(font_path=conf_path + '/simhei.ttf',  # 若是有中文的话,这句代码必须添加,不然会出现方框,不出现汉字background_color="white",  # 背景颜色max_words=5000,  # 词云显示的最大词数mask=back_img,  # 设置背景图片max_font_size=100,  # 字体最大值random_state=42,width=360, height=591, margin=2,  # 设置图片默认的大小,但是如果使用背景图片的话,保存的图片大小将会按照其大小保存,margin为词语边缘距离)
for li in comment:comment_txt += ' '.join(jieba.cut(li, cut_all=False))
wc = cloud.generate(comment_txt)
image_colors = ImageColorGenerator(back_img)
plt.figure("wordc")
plt.imshow(wc.recolor(color_func=image_colors))
wc.to_file(res_full + '好友个性签名词云图.png')

好友个性签名词云图

最初,只想做一个简单的词云图,但是看到这个词云图中梦想、努力、专注、尊重、希望这个几个词以后,感觉到我的好友生活态度还是蛮积极向上的,就想不如再做一个简单的情感分析,说干就干。

sentimentslist = []
for li in comment:if len(li) > 0:s = SnowNLP(li)print(li, s.sentiments)sentimentslist.append(s.sentiments)
fig1 = plt.figure("sentiment")
plt.hist(sentimentslist, bins=np.arange(0, 1, 0.02))
plt.savefig(res_full + '好友签名情感分析')
plt.show()

好友签名情感分析

从图中可以看出,正向情感要远远多于负向情感的数据,积极乐观的人往往都在一个圈子,果然是物以类聚,人以群分啊。

本文完整源码

长按扫描下方二维码后回复"微信好友"获取

End

说句题外话,有不少人想加鱼哥微信,鱼哥姑且放出来,但是坑位有限哦

 推荐阅读

作为程序员,要保持工作和家庭平衡,就那么难么?

刷抖音上瘾后,决定探究如果做一款类似抖音短视频app

屌丝的眼泪,因为错过的初恋,才搞清楚PNG图片压缩原理

我用Python爬了点你们需要的电影,这些电影真的很不错~

喜欢就点个在看吧

用 Python 分析了所有微信好友,发现了一个秘密...相关推荐

  1. itchat和php,Python使用itchat 功能分析微信好友性别和位置

    这样就将你所有微信好友的信息都返回了,我们并不需要这么多的信息,我们选取一些信息存储到 csv 文件中 注意:返回的信息是一个 list,其中第一个是我自己的信息,所以要从第二项开始 存储的文件 2: ...

  2. 用python做头像_教你用python下载和拼接微信好友头像图片

    相信微信大家是用得再多也不过了.那么,对于python+微信,又能玩出什么新的花样呢?下面就给大家带来一个好玩的东西.用python下载所有的微信好友的头像,然后拼接成一张大图.这样,大家就可以转载到 ...

  3. python开发程序知道微信好友是否已读信息吗_基于Python+adb实现微信是否好友检测...

    本文介绍的基于Python+adb实现的微信好友检测,是通过adb操控手机,模拟人的点击.截屏.然后调用OCR接口实现好友检测,对应用无侵入,无需扫描登录即可实现好友检测.网上看到一些文章类似功能的实 ...

  4. 10分钟教你用python下载和拼接微信好友头像图片

    相信微信大家是用得再多也不过了.那么,对于python+微信,又能玩出什么新的花样呢?下面小编就给大家带来一个好玩的东西.用python下载所有的微信好友的头像,然后拼接成一张大图.这样,大家就可以转 ...

  5. 用 python 分析了微信上所有的微信好友,发现了一个秘密...

    最近研究了一下itchat和matplotlib,目前实现了对微信好友头像.性别.区域.个性签名的采集及展示. 本文就来详细介绍一下这个库的用法和一些核心逻辑实现. 1.微信登录 三行代码实现登录,为 ...

  6. python开发程序知道微信好友是否已读信息吗_微商成功神器,python程序员教你,一键分析微信好友近期所有信息...

    好友太多怎么保活 相信做微商的微信好友都会很多,多到很多都成了"僵尸"好友,但是想要成为一个成功的微商,要有两点: 1.好友多,基数决定高度 2."活的"好友多 ...

  7. 用 Python 基于 pyecharts 对微信好友进行分析

    参考博客在这里:https://blog.csdn.net/yaoyefengchen/article/details/79427475 Echarts 已经更新到了 ver.4 版本,原文用的是网页 ...

  8. python,爬取微信好友数据,看他一天天在干嘛

    前段时间发现了一个好玩的东西,一个python的第三方库itchat,它的功能很强大.只要你扫一下它所生成的二维码即可模拟登陆你的微信号,然后可以实现自动回复,爬取微信列表好友信息等功能.基于这个第三 ...

  9. Python爬取的微信好友信息里我看到了自律 | CSDN博文精选

    作者 | 吴小鹏 来源 | 数据札记倌(ID:Data_Groom) "stay hungry, stay foolish" "不舍爱与自由" "自律 ...

最新文章

  1. 在 IDEA 中使用 Debug,真是太厉害了!
  2. Linux日志系统-08:定时执行脚本
  3. c语言文学研究助手题目,各位达人,给小弟一个文学研究助手的c程序啊!急啊!谢谢大家啦!...
  4. Python 中 assert的使用位置及源码解析
  5. Java-Tomcat 5.5 下的JNDI
  6. NLP基础|中英文词向量评测理论与实践
  7. mac terminal update management pack
  8. python获取小王的ip地址_用Python获取本机的IP地址
  9. 5005.boost之asio简单反射型服务器客户端
  10. 三星Galaxy S22 Ultra更多细节:采用Note系列外观因素
  11. 力扣—剑指 Offer 45. 把数组排成最小的数
  12. 学习Spring(一) -- 配置Spring
  13. 计算机体系结构在线读,计算机体系结构new.ppt
  14. 【5分钟 Paper】Continuous Control With Deep Reinforcement Learning
  15. 最近火爆全网的猫猫回收站教程,小七给你们搞来了
  16. Windows网络共享方式
  17. 苹果与华为领衔 全球科技巨头进军AI手机领域
  18. Linux命令窗口如何调节大小
  19. 不小心点了计算机一键还原怎么操作,电脑一键还原的恢复方法步骤
  20. 水位传感器(Water Sensor)原理图

热门文章

  1. php 报警声,php 报警 [NOTICE] fpm_children_bury()
  2. 网络工程计算机文科可以报考么,文科生可以报考网络工程专业吗
  3. 【自建分布式数据库详细指南】(四)设计:CITUS分布式数据仓库OLAP/OLTP的架构选择及PG数据库优化方法策略
  4. 今日简报 每日精选12条新闻简报 每天一分钟 知晓天下事 4月24日
  5. ajax的get/post请求及其封装,以及ajaxHTTP状态码是啥子意思
  6. 罗技 连点 脚本_罗技发布无线版的Pro X游戏耳机,拥有20小时续航时间
  7. 车联网通信安全之 SSL/TLS 协议
  8. Day01-Oracle的连接与账户
  9. ffmpeg sws_scale详细分析
  10. Android Amazon S3 功能接入