微信好友数据分析案例

一、项目背景与目标

微信作为日常社交的核心工具,好友数据中隐藏着丰富的社交特征(如地域分布、性别比例、个性签名等)。本项目旨在通过 Python 技术栈实现微信好友数据的采集、分析与可视化,帮助用户更好地理解自己的社交网络。核心功能包括:

  • 数据存储:将好友信息保存到本地文件
  • 可视化分析:性别、省份、城市分布,特殊好友(星标好友)统计
  • 文本分析:个性签名词云生成
  • 图像分析:头像集成、人脸识别与分类
  • 交互界面:基于 Tkinter 的图形化操作界面
  • 跨平台部署:通过 PyInstaller 打包为可执行文件(.exe)

二、技术选型与架构设计

核心技术栈

模块技术 / 工具说明
微信数据获取itchat微信网页版 API,支持消息发送与好友信息获取
数据处理pandas数据清洗、存储与结构化处理
可视化matplotlib/WordCloud图表绘制与词云生成
图像处理OpenCV/PIL头像提取、人脸识别与图像分类
界面开发Tkinter轻量级桌面 GUI 框架,适合快速原型开发
打包部署PyInstaller将 Python 程序打包为独立 exe 文件

架构设计

  1. 数据层:通过 itchat 获取好友原始数据,存储为 CSV 文件
  2. 分析层:分模块实现可视化(性别 / 地域)、文本分析(词云)、图像分析(头像处理)
  3. 交互层:Tkinter 界面提供功能按钮,解耦用户操作与底层逻辑
  4. 部署层: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:解决常见问题

  1. 中文乱码:确保代码中使用 UTF-8 编码,打包时包含中文字体(如 simhei.ttf)
  2. 文件路径:使用os.path.join处理路径,避免硬编码
  3. 依赖缺失:PyInstaller 会自动分析依赖,但需手动添加自定义资源(如头像文件夹)

六、项目总结与未来展望

已实现功能亮点

  1. 一站式分析:从数据获取到可视化、文本 / 图像分析全流程覆盖
  2. 交互友好:Tkinter 界面降低操作门槛,适合非技术用户
  3. 可扩展性:模块化设计便于新增功能(如好友聊天记录分析)

不足与改进方向

  1. 微信登录限制:itchat 依赖微信网页版,部分账号可能无法登录,未来可尝试使用 itchat-uos 或官方 API
  2. 界面美化:Tkinter 原生组件样式单一,可替换为 PyQt5 提升视觉体验
  3. 深度分析:增加社交网络指标(如共同好友、互动频率)、机器学习模型(如头像风格分类)

未来展望

本项目可作为社交数据分析的起点,后续可扩展至:

  • 群聊数据分析(消息频率、活跃用户统计)
  • 聊天记录情感分析(基于 NLP 技术)
  • 动态数据看板(实时更新社交网络变化
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值