微信好友大数据分析

2023-11-17

微信好友数据分析

这里很多工作量,参考了该篇博客,在此致谢,传送门如下:
一件有趣的事:我用 Python 爬了爬自己的微信朋友

不过原博客代码不是特别全,有些没有放出来,而且代码都是图片截图,比较模糊,所以我来整理一下我的代码,贴上来,同时也进行一定的讲解。
(不想看讲解,想用完整代码的,可以戳下面的传送门,我把代码上传到了我的Github里了:
GIthub代码传送门

下面来介绍所有的代码:
首先,我们导入itchat包,然后登录自己的微信,获取好友的数据,保存到变量friends内。

# -*- coding: utf-8 -*-

import numpy as np
import itchat
import matplotlib.pyplot as plt
# 登录微信,会弹出二维码,用手机微信扫一扫即可登录
itchat.login()
# 获取好友的所有数据
friends = itchat.get_friends(update=True)[0:]

接着,我们对好友的性别比例进行分析,这一块儿代码比较简单,会卡的地方主要是绘图那块儿,我是绘制了柱状图,显示中文卡了一次,然后每个柱子上显示数据又卡了一次。大家可以按照代码中的设置即可,代码中有注释。

# ***-----统计好友性别比例-----***
# 初始化计数器
male = female = other = 0
# friends[0]是自己的信息,因此从friends[1]开始
for i in friends[1:]:
	sex = i['Sex']
	if sex == 1:
		male += 1
	elif sex == 2:
		female += 1
	else:
		other += 1
# 计算朋友总数
total = len(friends[1:])
# 打印输出好友性别比例
print(
	"男性好友: %.2f%%" % (float(male)/total * 100) + "\n" +
	"女性好友: %.2f%%" % (float(female)/total * 100) + "\n" +
	"不明性别好友: %.2f%%" % (float(other)/total * 100)
	)

# 进行绘图
label_name = ["Boy", "Girl", "Unknown"]
gender_list = [male, female, other]
plt.figure()
plt.bar(range(len(gender_list)), gender_list, tick_label=label_name)

# 绘图中文显示设置
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False

plt.xlabel(u'性别')
plt.ylabel(u'人数')
plt.title(u'好友性别比例')

# 在柱状图上显示数字
x=np.arange(3)
y=np.array(gender_list)
for a,b in zip(x,y):
	plt.text(a, b+0.1, '%.2f' % b, ha='center', va= 'bottom',fontsize=12)
	

我得到的好友性别比例,如下图所示,充分显示了工科男身边男生多,女生少的规律(男生数量近乎是女生的两倍,其中Unknown指的是没有填写性别信息的好友):
微信好友性别比例
然后我们对其他信息进行获取,并保存到相应的变量里,方便处理。也可以将数据导入到csv中方便查看,对相应的信息有个大致的了解,不过中文在csv里出现了乱码的问题,加了encoding=‘utf-8’也还是乱码,包括‘utf_8_sig’,暂时的解决办法是,通过Excel->数据->文本导入的形式,将csv文件导入,就可以避免乱码问题。

# ***-----获取各类信息-----***
# 定义函数,爬取所有好友的指定信息
def get_var(var):
	variable = []
	for i in friends[1:]:
		value = i[var]
		variable.append(value)
	return variable
# 调用函数,得到对应信息,并存入csv文件,保存到桌面
NickName = get_var("NickName")
Sex = get_var("Sex")
Province = get_var("Province")
City = get_var("City")
Signature = get_var("Signature")

# Excel 打开中文乱码问题 未解决
# 不过可以通过Excel->数据->文本导入的形式,将csv文件导入,就可以避免乱码问题
from pandas import DataFrame
data = {"NickName": NickName, "Sex": Sex, "Province": Province,
		"City": City, "Signature": Signature}
frame = DataFrame(data)
frame.to_csv('data.csv', encoding='utf_8_sig', index=True)

接下来是,对好友的城市分布进行统计,代码如下:

# ***-----统计好友城市分布-----***
city_dict = {}
x_city = []
y_city = []
for city_name in City:
	if city_name in city_dict:
		city_dict[city_name] += 1
	else:
		city_dict[city_name] = 1
city_list = sorted(city_dict.items(), key=lambda item:item[1], reverse=True)
# 将前14个城市排序显示,去除排名第一的未知城市(城市信息为空的好友)
for i in city_list[1:15]:
	x_city.append(i[0])
	y_city.append(i[1])

# 绘制城市分布柱状图
plt.figure()
plt.bar(range(len(x_city)), y_city, tick_label=x_city)
plt.xlabel(u'城市')
plt.ylabel(u'人数')
plt.title(u'好友城市分布')

# 在柱状图上显示数字
x=np.arange(len(x_city))
y=np.array(y_city)
for a,b in zip(x,y):
	plt.text(a, b+0.06, '%.2f' % b, ha='center', va='bottom', fontsize=9)

我得到的好友城市分布如下图所示,从好友城市分布也可以看出自己的成长轨迹:
微信好友城市分布
然后,就是词云图的绘制了,代码如下:

# ***-----根据个性签名绘制词云图-----***
# 通过正则匹配清洗数据
import re 
Signature_list = []
for i in friends:
	signature = i["Signature"].strip().replace("span", "").replace("class", "").replace("emoji", "")
	rep = re.compile("lf\d+\w*|[<>/=]")
	signature = rep.sub("", signature)
	Signature_list.append(signature)
text = "".join(Signature_list)

# 调包进行分词
import jieba 
wordlist = jieba.cut(text, cut_all=False)
word_space_split = " ".join(wordlist)

这里,我们先是对好友的个性签名进行数据清洗,因为一些好友的个性签名会有表情符号,所以会得到类似于“< span class=“emoji emoji261d”></ span>”这种内容,因此我们要通过正则表达式,将这些符号去除掉。接着,我们导入jieba包,可以对中文句子进行分词。很简单,它所做的工作就是,比如将“我来到北京清华大学”分词,得到:“我”,“来到”,“北京”,“清华大学”。当然,jieba 分词包有不同的分词模式,前面的这种模式是默认的分词模式,比较符合我们的需求,其他的分词模式具体就不展开讲了,感兴趣的话可以上网搜索了解一下。

分词结束后,我们就得到了好友的个性签名里的所有词语,然后我们调用Pillow包里的相应包,进行词云图的绘制,代码如下:

# 调包进行词云图绘制
from wordcloud import WordCloud, ImageColorGenerator
import PIL.Image as Image

coloring = np.array(Image.open("weixin_sj520_33.jpg"))
my_wordcloud = WordCloud(background_color="white", max_words=200,
	mask=coloring, max_font_size=70, random_state=42, scale=2,
	font_path="C:\Windows\Fonts\SimHei.ttf").generate(word_space_split)
image_colors = ImageColorGenerator(coloring)
plt.figure()
plt.imshow(my_wordcloud.recolor(color_func=image_colors))
plt.imshow(my_wordcloud)
plt.axis("off")
plt.show()

词云图的绘制,可以提供一个背景图片作为轮廓和底色,我这里选用了微信的logo,不过由于都是绿色的,所以颜色上会比较单调。你在使用该代码时,要将Image.open后面的文件名,换作你要用的背景图片的文件名,路径的话,我图省事,就把图片和Python代码放在了一个路径下,省去了敲路径的麻烦。接下来就是词云图绘制的相关配置,如代码所示。注意,最后的plt.show(),会将我们前面的图片全部展示出来。因为plt.show()会使得代码停在这里,所以我将它放在了代码的最后。

我的微信得到的词云图如下所示:
微信词云图
以上是这次博客的所有内容,其实itchat的功能有很多,有时间的话再进一步了解,慢慢学。

我的个人博客

欢迎大家访问我搭建的个人博客哦,通过github Page搭建的,基于hexo,用了next主题。有什么问题都可以互相交流。博客地址:我的个人博客:CodeSausage的博客

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

微信好友大数据分析 的相关文章

随机推荐

  • C++:主要的关联式容器类型:set

    目录 1 关联式容器 2 键值对 3 树形结构的关联式容器 4 set 5 set的特点 6 set的使用 常用接口的使用 1 insert 2 find 3 erase 4 operator 7 multiset 1 关联式容器 与vec
  • 解决pyqt中mainwindow界面最大化按钮是灰色(不能最大化)的问题

    解决方法 将maximumSize的值设置为16777215x16777215即可使窗口打开时最大化按钮可用 MAIN SIZE MAX QSize 16777215 16777215 self setMaximumSize MAIN SI
  • 系统服务器迁移,应用系统和服务器迁移云

    应用系统和服务器迁移云 内容精选 换一换 公有云通常指第三方供应商为用户提供的能够通过Internet使用的云端基础设施和服务 其核心属性是共享资源服务 华为云是公有云品牌 在SAP系统迁移的过程中 您可以单独使用这些华为云云服务 也可以组
  • Python方便又强大的日志记录器——loguru

    Python方便又强大的日志记录器 loguru Loguru是一个旨在使Python日志记录变得愉快的库 该库通过添加一系列有用的功能来解决标准记录器的警告 从而减少Python日志记录的痛苦 日志记录对每个应用程序都是基本的 它简化了调
  • rosserial_arduino

    rosserial arduino 一级目录 二级目录 三级目录 wiki tutorials 1 安装arduino IDE 2 Installing the Software 2 1 Installing on the ROS work
  • linux charg修改目录,Thinkpad在GUN/linux(ubuntu)下修改电池充电阈值

    详见 http www thinkwiki org wiki Tp smapi 安装tp smapi aptitude install tp smapi dkms modprobe tp smapi 更改充电阈值 设置开始充电阈值 如从 6
  • 02

    1 克隆镜像 前提 centos 7 选择 管理 gt 克隆 选择 下一步 选择 虚拟机中的当前状态 选择 创建完整克隆 设置 虚拟机名称 和 位置 克隆完成界面 2 导入镜像 打开虚拟机 选择对应的克隆文件 导入后的结果 3 网络设置 3
  • 铨顺宏RFID:根据UWB技术性的矿山开采人员精准定位系统

    计划方案环境及总体目标 伴随着智能技术的持续发展趋势 矿山开采生产模式不断创新 翠绿色 绿色生态 智能化慢慢变成煤业的追求完美 煤业智能化系统 智能化针对矿山开采而言十分关键 不但可以产生生产量的提升 还能够协助减少资金投入和产品成本 提高
  • 科技云报道:震惊!4K、8K画质背后,竟然少不了AI的助力

    科技云报道原创 对于视频的画质 我现在最低只能够接受720P 最好是1080p 早五年前 身边就已经有人提出了这样的要求 随着科技的进步 我们进入了一个视频内容快速增长的时代 从社交媒体到在线教育 从直播购物到虚拟会议 视频正逐渐成为主流的
  • Jiu Yuan Wants to Eat【2018焦作网络赛】【树链剖分】

    题目链接 树链剖分学习笔记 可以看这里 这道题还真挺好的 以前不会做 现在想了发现 学过树链剖分之后 剩下的部分就是处理去反那块比较的不容易些了 但是想了一下午 现在还是给我敲出来了 我们主要难处理的就是关于求反 那么怎么处理求反 一开始读
  • antd-select下拉框如何同时获取所选值ID和名字属性

    其中传过去的e为 从antd官网可以看到select组件的onchange属性传参 第一个参数为value 第二个参数可为所选中的那一项的所有信息 其中的props属性内有一个children属性 即存储了所选项的名称
  • JWT快速入门及所需依赖

    目录 1 JWT 1 1什么是JWT 1 2JWT的构成 jwt的头部 payload signature 1 3JWT快速入门案例 2Jwt认证 微服务 2 1微服务下统一权限认证 2 2应用认证 3 无状态的JWT令牌如何实现续签功能
  • 蓝桥杯2022年第十三届省赛真题-最优清零方案--java语言

    题目链接 https www dotcpp com oj problem2689 html 一开始没仔细看题目 以为是自然连续数 搞得我还发了篇提问 怪尴尬的 https ask csdn net questions 7913935 spm
  • MongoDB、Elasticsearch分组统计性能比较

    环境参数 CentOS 7 6 虚拟机 4核 8GB Elasticsearch 5 6 16 MongoDB 5 0 9 数据结构 userId rkyao searchId 6e1c409ed7484a6a8a795e750bef9e2
  • 空间向量及值插值相关函数

    1 两个向量之间插值 float3 slerpBetweenVector float3 from float3 to float delta quatf model start quatf fromDirectedRotation norm
  • 算法分析与设计编程题 回溯法

    装载问题 题目描述 解题代码 递归回溯 goods i 表示货物i的重量 c1 c2分别表示货船1和货船2的载重量 vector
  • 关于项目报错Error:Cannot build Artifact :war exploded because it is included into a circular depency

    报个这个错的意思 你大概在编译项目的时候 你构建项目的时候 你点的是build project 而不是选择rebuild project 导致重复的依赖 这时候找到项目目录中的 idea目录 在进入artifacts文件目录 发现里面有两个
  • siammask_e 安装和使用

    基于siammask e的成绩 验证下demo效果 https paperswithcode com sota visual object tracking on vot2019 p fast visual object tracking
  • 值得拥有的5 款功能强大的免费 PDF 编辑器

    编辑 PDF 文件可能是一个真正的挑战 尤其是当您找不到合适的工具时 此外 如今大多数工具都需要大量订阅 这意味着您必须在口袋里烧一个洞才能对 PDF 文件进行更改 但是等等 这是一个转折点 有一些免费使用的 PDF 编辑器可以帮助您毫无后
  • 微信好友大数据分析

    微信好友数据分析 这里很多工作量 参考了该篇博客 在此致谢 传送门如下 一件有趣的事 我用 Python 爬了爬自己的微信朋友 不过原博客代码不是特别全 有些没有放出来 而且代码都是图片截图 比较模糊 所以我来整理一下我的代码 贴上来 同时