一、项目背景与目标
微信作为日常社交的核心工具,好友数据中隐藏着丰富的社交特征(如地域分布、性别比例、个性签名等)。本项目旨在通过 Python 技术栈实现微信好友数据的采集、分析与可视化,帮助用户更好地理解自己的社交网络。核心功能包括:
- 数据存储:将好友信息保存到本地文件
- 可视化分析:性别、省份、城市分布,特殊好友(星标好友)统计
- 文本分析:个性签名词云生成
- 图像分析:头像集成、人脸识别与分类
- 交互界面:基于 Tkinter 的图形化操作界面
- 跨平台部署:通过 PyInstaller 打包为可执行文件(.exe)
二、技术选型与架构设计
核心技术栈
模块 | 技术 / 工具 | 说明 |
---|---|---|
微信数据获取 | itchat | 微信网页版 API,支持消息发送与好友信息获取 |
数据处理 | pandas | 数据清洗、存储与结构化处理 |
可视化 | matplotlib/WordCloud | 图表绘制与词云生成 |
图像处理 | OpenCV/PIL | 头像提取、人脸识别与图像分类 |
界面开发 | Tkinter | 轻量级桌面 GUI 框架,适合快速原型开发 |
打包部署 | PyInstaller | 将 Python 程序打包为独立 exe 文件 |
架构设计
- 数据层:通过 itchat 获取好友原始数据,存储为 CSV 文件
- 分析层:分模块实现可视化(性别 / 地域)、文本分析(词云)、图像分析(头像处理)
- 交互层:Tkinter 界面提供功能按钮,解耦用户操作与底层逻辑
- 部署层:PyInstaller 打包时包含依赖库,生成可独立运行的 exe
三、核心功能实现代码解析
1. 数据获取与基础处理
import itchat
import pandas as pd
# 登录微信(支持热加载,无需重复扫码)
itchat.auto_login(hotReload=True)
friends = itchat.get_friends(update=True)[0:] # [0]为用户自身,[1:]为好友列表
# 保存好友信息到CSV
def save_friends_info():
data = []
for friend in friends[1:]:
data.append({
'昵称': friend['NickName'],
'性别': '男' if friend['Sex']==1 else '女' if friend['Sex']==2 else '未知',
'省份': friend['Province'],
'城市': friend['City'],
'个性签名': friend['Signature'],
'星标好友': '是' if friend['StarFriend'] else '否',
'头像URL': friend['HeadImgUrl']
})
df = pd.DataFrame(data)
df.to_csv('微信好友数据.csv', encoding='utf-8', index=False)
print("好友数据已保存到本地!")
2. 可视化分析模块
(1)性别比例分析
from matplotlib import pyplot as plt
def plot_gender_distribution():
gender_counts = friends[1:].Sex.value_counts()
labels = ['男', '女', '未知']
sizes = [gender_counts.get(1, 0), gender_counts.get(2, 0), len(friends[1:])-gender_counts.sum()]
plt.pie(sizes, labels=labels, autopct='%1.1f%%', startangle=90)
plt.title("好友性别比例")
plt.axis('equal') # 保持圆形
plt.show()
(2)省份分布 Top10
def plot_province_distribution():
provinces = [f['Province'] for f in friends[1:] if f['Province']]
from collections import Counter
top10 = dict(Counter(provinces).most_common(10))
plt.bar(top10.keys(), top10.values())
plt.title("好友省份分布Top10")
plt.xlabel("省份")
plt.ylabel("人数")
plt.xticks(rotation=45)
plt.show()
(3)个性签名词云
from wordcloud import WordCloud
import jieba
def generate_signature_wordcloud():
signatures = ''.join([f['Signature'].strip() for f in friends[1:]])
# 结巴分词+过滤停用词
stop_words = [' ', '\n', ',', '。', '的', '了']
words = [word for word in jieba.cut(signatures) if word not in stop_words]
text = ' '.join(words)
wc = WordCloud(
font_path="simhei.ttf", # 中文需指定字体
width=800, height=600, background_color="white"
).generate(text)
plt.imshow(wc)
plt.axis("off")
plt.title("个性签名词云")
plt.show()
3. 头像处理与人脸识别
import cv2
import os
def download_all_avatars():
if not os.path.exists("好友头像"):
os.makedirs("好友头像")
for i, friend in enumerate(friends[1:]):
img = itchat.get_head_img(userName=friend['UserName'])
with open(f"好友头像/{friend['NickName']}.jpg", 'wb') as f:
f.write(img)
print("头像下载完成!共{}张".format(len(friends[1:])))
def face_recognition_demo():
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
for img_path in os.listdir("好友头像"):
if img_path.endswith(".jpg"):
img = cv2.imread(os.path.join("好友头像", img_path), 0) # 转为灰度图
faces = face_cascade.detectMultiScale(img, 1.1, 4)
if len(faces) > 0:
print(f"{img_path} 中检测到{len(faces)}张人脸")
else:
print(f"{img_path} 中未检测到人脸")
四、Tkinter 界面开发:打造交互入口
界面布局设计
采用模块化按钮布局,每个功能对应一个独立按钮,点击后触发后台逻辑
import tkinter as tk
from tkinter import messagebox
class WeChatAnalyzerGUI:
def __init__(self, root):
self.root = root
self.root.title("微信好友数据分析工具")
# 功能按钮框架
frame = tk.Frame(root, padx=20, pady=20)
frame.pack()
tk.Button(frame, text="1. 登录并获取好友数据", command=self.login_and_save_data, width=30).grid(row=0, column=0, pady=5)
tk.Button(frame, text="2. 显示性别比例", command=plot_gender_distribution, width=30).grid(row=1, column=0, pady=5)
tk.Button(frame, text="3. 显示省份分布Top10", command=plot_province_distribution, width=30).grid(row=2, column=0, pady=5)
tk.Button(frame, text="4. 生成个性签名词云", command=generate_signature_wordcloud, width=30).grid(row=3, column=0, pady=5)
tk.Button(frame, text="5. 下载所有好友头像", command=download_all_avatars, width=30).grid(row=4, column=0, pady=5)
tk.Button(frame, text="6. 头像人脸识别检测", command=face_recognition_demo, width=30).grid(row=5, column=0, pady=5)
tk.Button(frame, text="退出", command=root.quit, width=30).grid(row=6, column=0, pady=10)
def login_and_save_data(self):
try:
itchat.auto_login(hotReload=True)
save_friends_info()
messagebox.showinfo("成功", "好友数据获取并保存完毕!")
except Exception as e:
messagebox.showerror("错误", f"登录失败:{str(e)}")
if __name__ == "__main__":
root = tk.Tk()
app = WeChatAnalyzerGUI(root)
root.mainloop()
五、PyInstaller 打包 exe:跨平台部署
步骤 1:安装依赖
pip install pyinstaller itchat pandas matplotlib wordcloud opencv-python tkinter
步骤 2:生成.spec 文件(可选,用于配置资源文件)
pyinstaller -w -F -i icon.ico main.py # -w隐藏控制台,-F生成单个文件,-i指定图标
步骤 3:解决常见问题
- 中文乱码:确保代码中使用 UTF-8 编码,打包时包含中文字体(如 simhei.ttf)
- 文件路径:使用
os.path.join
处理路径,避免硬编码 - 依赖缺失:PyInstaller 会自动分析依赖,但需手动添加自定义资源(如头像文件夹)
六、项目总结与未来展望
已实现功能亮点
- 一站式分析:从数据获取到可视化、文本 / 图像分析全流程覆盖
- 交互友好:Tkinter 界面降低操作门槛,适合非技术用户
- 可扩展性:模块化设计便于新增功能(如好友聊天记录分析)
不足与改进方向
- 微信登录限制:itchat 依赖微信网页版,部分账号可能无法登录,未来可尝试使用 itchat-uos 或官方 API
- 界面美化:Tkinter 原生组件样式单一,可替换为 PyQt5 提升视觉体验
- 深度分析:增加社交网络指标(如共同好友、互动频率)、机器学习模型(如头像风格分类)
未来展望
本项目可作为社交数据分析的起点,后续可扩展至:
- 群聊数据分析(消息频率、活跃用户统计)
- 聊天记录情感分析(基于 NLP 技术)
- 动态数据看板(实时更新社交网络变化