前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >手把手教你用itchat统计好友信息,了解一下?

手把手教你用itchat统计好友信息,了解一下?

作者头像
Python攻城狮
发布于 2019-03-22 08:09:28
发布于 2019-03-22 08:09:28
59000
代码可运行
举报
文章被收录于专栏:Python攻城狮Python攻城狮
运行总次数:0
代码可运行

初学Python的时候,就写过一篇利用Python的第三方库进行好友头像拼接,itchat itchat库初探--微信好友全头像的拼接,最近又研究了下itchat和matplotlib,目前实现了对微信好友头像、性别、区域、个性签名的采集及展示。

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

1.微信登录
  • 三行代码实现登录,为了避免我们频繁扫描二维码登录,这里我们加入hotReload=True
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import itchat

itchat.auto_login(hotReload=True)
itchat.dump_login_status()
  • 好友信息获取
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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代表女性

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
total = len(we_friend[1:])
for fri_info in we_friend[1:]:
    sex = fri_info['sex']
    # 如果sex=1 代表男性 sex=2代表女性
    if sex == 1:
        man += 1
    elif sex == 2:
        woman += 1
    else:
        other += 1

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

  • 绘制饼图
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
man_ratio = int(man)/total * 100
woman_ratio = int(woman)/total * 100
other_ratio = int(other)/total * 100

plt.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中文乱码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import matplotlib
print(matplotlib.matplotlib_fname())    # 查看路径
  • 进入上方打印的路径
  • 把刚才下载的字体文件解压放入/usr/local/lib/python3.5/dist-packages/matplotlib/mpl-data/fonts/ttf 目录
  • 返回上级目录,修改matplotlibrc文件,取消相关注释,并在font.serif加入刚才下载的字体
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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缓存。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
在terminal中:cd ~/.cache/matplotlib

把.cache下面的matplotlib文件夹删除。

$ rm -rf matplotlib

3.微信好友头像

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

  • 1.采集所有好友头像保存本地,
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import os

num = 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.对所有头像进行拼接
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 = 0

for 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 += 1
        if x == lines:  # 换行
              x = 0
              y += 1

image.save(desc_full + "/好友头像拼接图.jpg")

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

好友头像拼接

4.微信好友地区分布

-- 获取区域及城市

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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] = 1
    elif prov:
        prov_dict[prov] += 1
    if city and city not in city_dict.keys():
        city_dict[city] = 1
    elif city:
        city_dict[city] += 1

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 区域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]
  • 区域、城市柱形图展示,由于思路代码是一致的,所以这里只展示区域的代码
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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,词云图的背景采用了萌萌大小猪佩奇(´๑•_•๑)

  • 分词
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sign_li = []
rule = re.compile("1f\d+\w*|[<>/=]")    # 定义正则规则
for fri_info in we_friend[1:]:
    signature = fri_info['signature']
    if signature:
        sign_deal = signature.replace('\n', '').replace('\t', '').replace(' ', '')\
            .replace("span", "").replace("class", "").replace("emoji", "")
        sign = rule.sub("", sign_deal)
        sign_li.append(sign)
  • 制作词云图
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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')

好友个性签名词云图

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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()

好友签名情感分析

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

完整代码以上传Github,期待您的Star。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019.03.21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
2 条评论
热度
最新
可以 手机应用商店或者应用宝 下载 恢复大师软件找回,普通删除恢复的成功率还是挺高的
可以 手机应用商店或者应用宝 下载 恢复大师软件找回,普通删除恢复的成功率还是挺高的
回复回复点赞举报
我能查?
我能查?
回复回复点赞举报
推荐阅读
微信删除的聊天记录怎么找回?教你这样恢复
        微信删除的聊天记录怎么找回?最近使用微信的次数越来越频繁了,微信中又多了很多的聊天记录,而且还占用了微信里面的存储空间,然后去清理了一些文件,结果发现有些聊天记录被删除了,后悔了想将删除的聊天记录找回,有办法嘛?微信删除的聊天记录怎么找回?
科技第六人
2019/08/29
2.3K0
微信删除的聊天记录怎么找回?教你这样恢复
微信聊天记录删除怎么找回?这样恢复很简单
  微信聊天记录删除怎么找回?现如今已经开始太多人使用微信了,在我们微信中可以随处可见的聊天记录,有时偶尔还会去清理掉一些聊天记录或者文件,但是重要的聊天记录还是会有的,当我们发现微信里面的重要聊天记录删除了该怎么办?微信删除聊天记录怎么找回?
科技第六人
2019/10/29
2.1K0
微信聊天记录删除怎么找回?这样恢复很简单
怎么恢复删除的微信聊天记录?3种恢复技术你都了解几种
怎么恢复删除的微信聊天记录?大家是不是跟小编有着一样的烦恼,因为微信中有着很多重要的信息以及跟家人之间美好的回忆,由于自己的操作失误导致微信聊天记录删除。那么微信聊天记录删除能不能恢复呢?想必很多朋友都想知道,那么今天小编就把自己亲身经历的3种恢复技术告诉大家,不知道大家了解几种。
科技脑洞在线
2019/05/22
1.3K0
怎么恢复删除的微信聊天记录?3种恢复技术你都了解几种
微信聊天记录删除了怎么恢复?电脑手机都能恢复
  微信聊天记录删除了怎么恢复?使用微信遇到最常见的问题就是将手机里面的聊天记录删除了,虽然并没有什么比较重要的内容但还是想要恢复,手机中也会有很多垃圾文件,如果在清理手机内存的时候将聊天记录删除怎么办?微信聊天记录删除了怎么恢复?
科技第六人
2019/09/05
2.2K0
如何找回苹果手机删除的微信聊天记录
微信里把别人删了bai之后,自己手机du微信上的联系人、消息聊天窗口和记录都zhi会删除。
用户7475317
2020/06/18
3.1K0
微信聊天记录误删了怎么恢复?这样做几分钟找回
  微信聊天记录误删了怎么恢复?在手机上出现误删是必不可免的现象,有时候经常会出现一些失误导致操作不当将手机中的一些数据删除了,在微信里面当我们误删除了里面的聊天记录时可能就损失了数据,那么我们想要恢复聊天记录怎么办?微信聊天记录误删了怎么恢复?
科技第六人
2019/09/12
8550
微信聊天记录误删了怎么恢复?这样做几分钟找回
iOS 13怎样恢复微信聊天记录?教你这几招
  怎样恢复微信聊天记录?在手机中经常会有很多的聊天记录发生,微信是现在最主流的聊天工具之一了,我们手机手机都会有这样的一个社交工具,而且使用的人也较多,微信中的聊天记录也越来越多。不过有时候还是会去清理掉手机里面的聊天记录,那重要的聊天记录被清除了怎么办?怎样恢复微信聊天记录?
科技第六人
2019/10/24
1.4K0
iOS 13怎样恢复微信聊天记录?教你这几招
删除的微信聊天记录怎么恢复?原来这样解决问题
  删除的微信聊天记录怎么恢复?很多小伙伴都会遇到聊天记录被删除的问题,虽然不是自己特意删除的,也有可能是因为一些其他原因导致聊天记录删除的情况,有时候不得不将删除聊天记录进行恢复,那么想要将删除的聊天记录找回怎么办呢?删除的微信聊天记录怎么恢复?
科技第六人
2019/11/01
9490
删除的微信聊天记录怎么恢复?原来这样解决问题
微信删除聊天记录怎么找回?常用几个恢复方法
  微信删除聊天记录怎么找回?社交软件微信是我们生活中最常用的聊天工具,不过是在生活中还是在工作上都会用到微信,不过遇到微信聊天记录删除问题的人也有很多,但是都不知道怎么才能将删除的聊天记录找回来。那么这个问题怎么解决呢?微信删除聊天记录怎么找回?
科技第六人
2019/08/15
1.4K0
微信删除聊天记录怎么找回?常用几个恢复方法
微信删除的聊天记录怎么恢复?简单几招恢复
  微信删除的聊天记录怎么恢复?常见的社交工具就是微信了,很多人在使用微信的时候都会在微信中有很多的聊天记录在里面,而且还会有一些其他的文件或者图片,一个误操作可能就导致聊天记录删除。那么微信删除的聊天记录怎么恢复?
科技第六人
2019/09/16
2.3K0
微信删除的聊天记录怎么恢复?简单几招恢复
微信删除的聊天记录怎么恢复?简单方法教你恢复
  微信删除的聊天记录怎么恢复?在如今社交网络的时代我们很多人都会使用微信这个社交工具了,时间使用的越多在微信里面的聊天记录也就越来越多,不过有时候我们会去清理掉微信中的一些垃圾文件,若是不小心把重要的聊天记录删除了怎么办?微信删除的聊天记录怎么恢复?
科技第六人
2019/11/05
1.1K0
微信删除的聊天记录怎么恢复?简单方法教你恢复
微信删除的聊天记录怎么恢复?恢复技巧解析
  微信删除的聊天记录怎么恢复?在使用微信的时候应该都会遇到这样的一个问题,现在使用微信的频率也越来越高了,里面的聊天记录随着时间的流逝内容也多起来了,但有时候会清理微信内存,在清理时难免会遇到聊天记录删除的情况,那么该怎么恢复?微信删除的聊天记录怎么恢复?
科技第六人
2019/10/12
2.1K0
微信删除的聊天记录怎么恢复?恢复技巧解析
电脑微信聊天记录删除了怎么恢复找回来
“请问怎么可以恢复已经删除的微信聊天记录?我在手机上清理没有用的微信消息时,长按聊天框误删了重要的聊天消息,然后与该朋友的聊天对话框就消失了。微信聊天记录删除了怎样恢复啊?
用户9208731
2022/11/17
8.3K0
电脑微信聊天记录删除了怎么恢复找回来
删除的微信聊天记录,这技巧能恢复
哈喽各位小伙伴今天有点晚 最近很多小伙伴来问柚子微信聊天记录恢复的问题 柚子觉得这个问题还是要和大家好好说下 柚子这几天也一直在寻找各种方法 试验各种恢复的方法 一般来说基本没办法恢复的 如果你经常在
IT小侠公社
2019/06/12
1.1K0
删除的微信聊天记录,这技巧能恢复
微信聊天记录能不能恢复?99%的人都是这样找回的
微信聊天记录能不能恢复?微信聊天记录怎么恢复?对于这类问题想必大家都遇见过。因为微信在我们生活中占据很高份额,无论是生活还是工作都离不开它,所以说里面有我们很多珍贵的回忆,所以当微信聊天记录误删了,大家都很着急,为此我们来了解一下如何恢复微信聊天记录。
科技脑洞在线
2019/04/28
11.2K0
微信聊天记录能不能恢复?99%的人都是这样找回的
如何恢复微信删除的聊天记录?快速恢复的技巧
  如何恢复微信删除的聊天记录?在使用微信的时候都会遇到这样的问题,有时候在使用微信的时候会看到里面的聊天记录内容太多,想去删掉一些,可没曾想里面的聊天记录还有一些重要的那么当我们想要找回删除的微信聊天记录该怎么办呢?如何恢复微信删除的聊天记录?
科技第六人
2019/10/14
1.9K0
如何恢复微信删除的聊天记录?快速恢复的技巧
如何恢复微信聊天记录?正确恢复方法
        如何恢复微信聊天记录?很多微信用户都会有着同样的问题,就是有时候不小心删除了微信的聊天记录,因为聊天记录随着时间流逝就会有更多的聊天记录存在,在清除一些聊天记录或文件时把重要聊天记录清除了怎么办?如何恢复微信聊天记录?
科技第六人
2019/08/28
2.2K0
如何恢复微信聊天记录?正确恢复方法
微信删除的文件怎么恢复,EasyRecovery2022轻松帮你解决
微信是继QQ之后腾讯公司推出的又一款即时通讯利器,现在微信已不仅仅是沟通情感的聊天工具了,许多工作的事宜也会通过微信交流。倘若重要数据丢失,会给企业带来非常严重的后果。微信删除的文件怎么恢复,想把以前的文件恢复并使用该怎么做呢?为什么文件会显示已损坏呢?有没有扫描好的方法可以使文件恢复呢,看完小编的这篇文章你也会自己恢复删除的微信文件了!
用户9208731
2022/11/22
2.6K0
微信删除的文件怎么恢复,EasyRecovery2022轻松帮你解决
微信聊天记录删除怎么恢复?这样也能恢复
  微信聊天记录删除怎么恢复?在微信上困扰大家的原因只有一个,就是微信上面的聊天记录如果被删除了该怎么办?很多人经常会遇到这样的问题,有时候在查找聊天记录的时候会发现有些聊天记录被删除了,当我们发现聊天记录被删除时怎么办?微信聊天记录删除怎么恢复?
科技第六人
2019/09/19
2.2K0
微信聊天记录删除怎么恢复?这样也能恢复
怎么恢复微信聊天记录?非常不错的方法
  怎么恢复微信聊天记录?经常使用微信的小伙伴都会遇到这样的问题,不过会解决这个问题的不多,其实想要恢复聊天记录也不是很难,但是一般微信里面都会有很多重要的聊天记录,删除了都想要将聊天记录恢复回来,当我们手机聊天记录删除了怎么办?怎么恢复微信聊天记录?
科技第六人
2019/10/17
1.3K0
怎么恢复微信聊天记录?非常不错的方法
推荐阅读
相关推荐
微信删除的聊天记录怎么找回?教你这样恢复
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档