微信好友数据分析案例
微信好友数据分析系统设计与实现
一、 项目概述
这是一个基于Python的微信好友数据分析系统,能够获取并分析微信好友的各种信息,包括性别分布、地理位置分布、签名信息等,并提供可视化展示功能。系统还包含好友头像处理、人脸识别等高级功能。
1.系统架构
功能模块划分
1. 数据采集模块
- 获取微信好友基本信息
- 保存好友数据到本地文件
2. 数据分析模块
- 性别分布分析
- 地理位置分析(省份/城市)
- 特殊好友识别(星标好友等)
- 签名词云生成
3. 图像处理模块
- 好友头像集成展示
- 人脸识别与分析
- 头像分类
4. 用户界面模块
- 基于PyQt5的图形界面
- 可视化图表展示
- 交互功能控制
5. 打包发布模块
- 使用PyInstaller打包为可执行文件
核心代码实现
1. 数据采集模块
import itchat
import pandas as pd
import os
def get_friends_info():
"""获取微信好友信息并保存到文件"""
itchat.auto_login(hotReload=True)
friends = itchat.get_friends(update=True)
friends_list = []
for friend in friends[1:]: # 第一个是自己
friend_info = {
'NickName': friend.get('NickName', ''),
'RemarkName': friend.get('RemarkName', ''),
'Sex': friend.get('Sex', 0),
'Province': friend.get('Province', ''),
'City': friend.get('City', ''),
'Signature': friend.get('Signature', '').strip().replace(' ', ''),
'StarFriend': friend.get('StarFriend', 0),
'HeadImgUrl': friend.get('HeadImgUrl', '')
}
friends_list.append(friend_info)
df = pd.DataFrame(friends_list)
if not os.path.exists('data'):
os.makedirs('data')
df.to_excel('data/wechat_friends.xlsx', index=False)
return df
2. 数据分析与可视化
import matplotlib.pyplot as plt
from wordcloud import WordCloud
import jieba
import numpy as np
from PIL import Image
def gender_analysis(df):
"""性别分布分析"""
sex_dict = {0: '未知', 1: '男性', 2: '女性'}
df['Sex'] = df['Sex'].map(sex_dict)
sex_count = df['Sex'].value_counts()
plt.figure(figsize=(8, 6))
sex_count.plot(kind='pie', autopct='%1.1f%%')
plt.title('微信好友性别分布')
plt.ylabel('')
plt.savefig('output/gender_distribution.png')
plt.close()
def province_analysis(df):
"""省份分布分析"""
province_count = df[df['Province'] != '']['Province'].value_counts()[:10]
plt.figure(figsize=(10, 6))
province_count.plot(kind='bar')
plt.title('微信好友省份分布TOP10')
plt.xlabel('省份')
plt.ylabel('人数')
plt.savefig('output/province_distribution.png')
plt.close()
def generate_signature_wordcloud(df):
"""生成签名词云"""
text = ' '.join(df['Signature'].dropna().tolist())
# 使用jieba分词
wordlist = jieba.cut(text, cut_all=True)
word_space = ' '.join(wordlist)
# 使用自定义图片作为词云形状
mask = np.array(Image.open('assets/wechat_mask.png'))
wordcloud = WordCloud(
font_path='assets/simhei.ttf',
background_color='white',
mask=mask,
max_words=200,
max_font_size=100
).generate(word_space)
plt.figure(figsize=(12, 10))
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis('off')
plt.savefig('output/signature_wordcloud.png')
plt.close()
3. 图像处理模块
python
import cv2
import face_recognition
import os
from tqdm import tqdm
def process_friends_avatars(df):
"""处理好友头像"""
if not os.path.exists('avatars'):
os.makedirs('avatars')
# 下载头像
for idx, row in tqdm(df.iterrows(), total=len(df)):
try:
itchat.get_head_img(userName=row['UserName'], picDir=f'avatars/{idx}.jpg')
except:
continue
# 人脸识别分析
face_results = []
for img_file in os.listdir('avatars'):
img_path = os.path.join('avatars', img_file)
image = face_recognition.load_image_file(img_path)
face_locations = face_recognition.face_locations(image)
face_results.append({
'file': img_file,
'face_count': len(face_locations),
'face_locations': face_locations
})
return face_results
def generate_avatar_collage(face_results):
"""生成头像拼图"""
# 筛选出包含人脸的图片
valid_files = [r['file'] for r in face_results if r['face_count'] > 0]
# 创建拼图
rows = 10
cols = len(valid_files) // rows + 1
collage = Image.new('RGB', (cols*100, rows*100))
for i, img_file in enumerate(valid_files):
try:
img = Image.open(f'avatars/{img_file}')
img = img.resize((100, 100))
collage.paste(img, ((i%cols)*100, (i//cols)*100))
except:
continue
collage.save('output/avatar_collage.jpg')
4. 用户界面实现(PyQt5)
from PyQt5.QtWidgets import (QApplication, QMainWindow, QTabWidget, QWidget,
QVBoxLayout, QLabel, QPushButton, QFileDialog)
from PyQt5.QtGui import QPixmap
import sys
class WechatAnalyzerGUI(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle('微信好友数据分析系统')
self.setGeometry(100, 100, 800, 600)
self.initUI()
self.data = None
def initUI(self):
# 创建主选项卡
self.tabs = QTabWidget()
self.setCentralWidget(self.tabs)
# 数据采集标签页
self.data_tab = QWidget()
self.tabs.addTab(self.data_tab, "数据采集")
self.setup_data_tab()
# 数据分析标签页
self.analysis_tab = QWidget()
self.tabs.addTab(self.analysis_tab, "数据分析")
self.setup_analysis_tab()
# 图像分析标签页
self.image_tab = QWidget()
self.tabs.addTab(self.image_tab, "图像分析")
self.setup_image_tab()
def setup_data_tab(self):
layout = QVBoxLayout()
self.data_label = QLabel("点击按钮获取微信好友数据")
layout.addWidget(self.data_label)
self.fetch_btn = QPushButton("获取好友数据")
self.fetch_btn.clicked.connect(self.fetch_data)
layout.addWidget(self.fetch_btn)
self.data_tab.setLayout(layout)
def fetch_data(self):
self.data_label.setText("正在获取数据,请稍候...")
QApplication.processEvents() # 更新UI
try:
self.data = get_friends_info()
self.data_label.setText("数据获取成功!")
except Exception as e:
self.data_label.setText(f"获取数据失败: {str(e)}")
def setup_analysis_tab(self):
layout = QVBoxLayout()
self.analysis_label = QLabel("数据分析结果将显示在这里")
layout.addWidget(self.analysis_label)
self.gender_btn = QPushButton("性别分布分析")
self.gender_btn.clicked.connect(self.show_gender_analysis)
layout.addWidget(self.gender_btn)
self.province_btn = QPushButton("省份分布分析")
self.province_btn.clicked.connect(self.show_province_analysis)
layout.addWidget(self.province_btn)
self.wordcloud_btn = QPushButton("生成签名词云")
self.wordcloud_btn.clicked.connect(self.generate_wordcloud)
layout.addWidget(self.wordcloud_btn)
self.analysis_tab.setLayout(layout)
def show_gender_analysis(self):
if self.data is not None:
gender_analysis(self.data)
pixmap = QPixmap("output/gender_distribution.png")
self.analysis_label.setPixmap(pixmap.scaled(600, 400))
# 其他方法类似...
def setup_image_tab(self):
layout = QVBoxLayout()
self.image_label = QLabel("头像分析结果将显示在这里")
layout.addWidget(self.image_label)
self.avatar_btn = QPushButton("分析好友头像")
self.avatar_btn.clicked.connect(self.analyze_avatars)
layout.addWidget(self.avatar_btn)
self.collage_btn = QPushButton("生成头像拼图")
self.collage_btn.clicked.connect(self.generate_collage)
layout.addWidget(self.collage_btn)
self.image_tab.setLayout(layout)
def analyze_avatars(self):
if self.data is not None:
self.face_results = process_friends_avatars(self.data)
self.image_label.setText(f"分析完成,共处理{len(self.face_results)}个头像")
def generate_collage(self):
if hasattr(self, 'face_results'):
generate_avatar_collage(self.face_results)
pixmap = QPixmap("output/avatar_collage.jpg")
self.image_label.setPixmap(pixmap.scaled(600, 400))
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = WechatAnalyzerGUI()
ex.show()
sys.exit(app.exec_())
二、项目打包
使用PyInstaller将项目打包为可执行文件:
1. 创建打包脚本 `build.spec`:
# -*- mode: python -*-
block_cipher = None
a = Analysis(['main.py'],
pathex=['/path/to/your/project'],
binaries=[],
datas=[('assets/*', 'assets'), ('data/*', 'data')],
hiddenimports=['itchat', 'pandas', 'matplotlib', 'wordcloud', 'jieba', 'face_recognition'],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
name='WechatAnalyzer',
debug=False,
strip=False,
upx=True,
runtime_tmpdir=None,
console=False,
icon='assets/wechat.ico')
2. 执行打包命令:
```bash
pyinstaller build.spec
```
三、技术总结与未来展望
1.技术总结
1. 技术栈选择:
- 使用itchat库实现微信接口调用
- 使用Pandas进行数据处理
- 使用Matplotlib和WordCloud进行数据可视化
- 使用face_recognition进行人脸识别
- 使用PyQt5构建图形界面
2. 关键技术点:
- 微信Web协议的非官方API使用
- 大规模数据处理与可视化
- 图像处理与人脸识别技术
- 跨平台GUI开发
3. 遇到的挑战:
- 微信Web协议的限制和变化
- 大量头像下载和处理时的性能问题
- 跨平台兼容性问题
2.未来展望
1. 功能扩展:
- 添加好友互动频率分析
- 实现自动回复和消息管理功能
- 增加好友关系网络图可视化
2. 技术改进:
- 使用异步IO提高数据采集效率
- 增加机器学习模型对好友进行分类
- 改进人脸识别的准确率和性能
3. 应用场景拓展:
- 发展为微信营销分析工具
- 增加团队管理功能
- 开发移动端应用版本
4. 安全与隐私:
- 加强数据加密存储
- 增加用户隐私保护机制
- 提供数据清除功能
更多推荐
所有评论(0)