专属于你的微信好友报告(词云、数据可视化,完整代码提供)

微信好友报告

你的微信好友你都了解吗?男女比例是多少?都来自哪里?签名都有什么?…………
这里有一份属于你的微信好友报告,来看绝对不吃亏,废话不多说,直接开干

准备阶段

  • 首先你的微信要能够登陆网页版
  • 会用python操作Excel表(读写)
  • 了解python数据可视化的基本操作

需要用到的python核心库

#登陆微信网页版的核心库
import itchat
#读写操作所用到的库
import xlrd
import xlwt
import xlutils.copy

代码部分及数据可视化
  1. 获取微信好友详细信息及插入Excel表
    核心代码:
itchat.auto_login(hotReload=True)
dict = {}  #定义一个字典,用来存放所有用户的有用信息
friends = itchat.get_friends()  # 好友列表
friendsLength = len(friends)   #获取好友列表长度
UserName = ""
RemarkName = ""
Signature = ""
NickName = ""
Province =""
City = ""
Sex = ""

#插入Excel表
#在Excel中保存你字典的信息
book = xlrd.open_workbook(r'test.xls', formatting_info=True)
wtbook = xlutils.copy.copy(book)
wtsheet = wtbook.get_sheet(0)
#设置每一列的列名
for i in range(keysLength):
   wtsheet.write(0, i, keysList[i])
#开始插入数据
k = 0
for i in range(1,dictCount):
   for j in range(keysLength):
       wtsheet.write(i, j, dict[k][keysList[j]])
   k = k + 1
wtbook.save(r'test.xls')
print("插入结束")

插入结果:(涉及隐私,在此打码)
在这里插入图片描述
2. 根据Excel表中的数据进行可视化
好友性别比例:
在这里插入图片描述
好友省份分布:
在这里插入图片描述
妈耶,好像暴露了我的省份
好友省份柱状图:
在这里插入图片描述
好友市区分布图:
在这里插入图片描述
好友市区柱状图分析:
在这里插入图片描述
3. 微信签名词云生成重磅、干货)
签名词云:
在这里插入图片描述
换张底色:(底片都是可以自己改的,我这里是马
在这里插入图片描述

项目源代码奉上(调试遇到问题,别紧张,慢慢来就好)

insertExcel.py

import itchat
#读写模块
import xlrd
import xlwt
import xlutils.copy
#老哥你就不能写个循环吗?这是一个程序员最基本的职业素养呀呀。
itchat.auto_login(hotReload=True)
dict = {}  #定义一个字典,用来存放所有用户的有用信息
friends = itchat.get_friends()  # 好友列表
friendsLength = len(friends)   #获取好友列表长度
UserName = ""
RemarkName = ""
Signature = ""
NickName = ""
Province =""
City = ""
Sex = ""
for i in range(friendsLength):
    UserName = friends[i]['UserName']
    RemarkName = friends[i]['RemarkName']
    Signature = friends[i]['Signature']
    NickName = friends[i]['NickName']
    Province = friends[i]['Province']
    City = friends[i]['City']
    Sex = friends[i]['Sex']
    dict[i] = {'UserName': UserName, 'RemarkName': RemarkName, 'Signature': Signature, 'NickName': NickName,
               'Province': Province, 'City': City,'Sex':Sex}

dictCount = len(dict)         #计算字典元素个数
keysList = list(dict[0].keys())     #获取字典0的所有键
keysLength = len(keysList)
#在Excel中保存你字典的信息
book = xlrd.open_workbook(r'test.xls', formatting_info=True)
wtbook = xlutils.copy.copy(book)
wtsheet = wtbook.get_sheet(0)
#设置每一列的列名
for i in range(keysLength):
    wtsheet.write(0, i, keysList[i])
#开始插入数据
k = 0
for i in range(1,dictCount):
    for j in range(keysLength):
        wtsheet.write(i, j, dict[k][keysList[j]])
    k = k + 1
wtbook.save(r'test.xls')
print("插入结束")

showPicture.py

import pandas as pd
import matplotlib.pyplot as plt
from pyecharts.charts import Map
from wordcloud import WordCloud
import PIL.Image as image
import numpy as np
import jieba
from pylab import mpl

#分词函数
def trans_CN(text):
	# 接收分词的字符串
    word_list = jieba.cut(text)
    # 分词后在单独个体之间加上空格
    result = " ".join(word_list)
    return result
#生成词云函数
def drawClouc(filename,referencePicture_Path,font_path):
    """
    参数说明:filename:需要分词的文本路径,referencePicture_Path:底色参照照片路径,
    font_path:生成中文字的字体路径
    """
    with open(filename) as fp:
        text = fp.read()
        # 将读取的中文文本进行分词
        text = trans_CN(text)
        mask = np.array(image.open(referencePicture_Path))
        wordcloud = WordCloud(background_color="white",
        	# 添加遮罩层
            mask=mask,
            # 生成中文字的字体,必须要加,不然看不到中文
            font_path = font_path
        ).generate(text)
        image_produce = wordcloud.to_image()
        wordcloud.to_file("./cloud3.png")
        #image_produce.show()
        
#定义一个函数,用来检测是否是纯中文
def isAllChinese(str):
    for i in str:
        if not('\u4e00' <= i <='\u9fa5'):
            return False
    return True
#定义一个画圆饼图函数
def drawPie(data,labels):
    #设置字体(为了显示中文)
    mpl.rcParams['font.sans-serif']=['SimHei']
    # 1.2f指的小数保留两位
    plt.pie(data, labels=labels, autopct='%1.4f%%')  # 第一个参数是占比,第二个各自的标签,第三个是显示精度
    plt.axis('equal')  # 让图看起来是圆的,不然就扁了
    plt.legend()  # 左上角的那个图例,随机的,可以自己换位置
    plt.show()
#定义一个画柱状图的函数
def drawHistogram(x_data, y_data):
    #设置字体
    mpl.rcParams['font.sans-serif']=['SimHei']
    # 绘图
    plt.bar(x=x_data, height=y_data, label='好友分布', color='indianred', alpha=0.8)
    # 在柱状图上显示具体数值, ha参数控制水平对齐方式, va控制垂直对齐方式
    for x, y in enumerate(y_data):
        plt.text(x, y + 5, '%s' % y, ha='center', va='bottom')
    # 设置标题
    plt.title("微信好友全国分布图")
    # 为两条坐标轴设置名称
    plt.xlabel("人数")
    plt.ylabel("省份")
    # 显示图例
    plt.legend()
    plt.show()
#定义一个画分层圆饼图函数
def drawLayered(num_list, name_list,colors_list):
    #设置字体
    mpl.rcParams['font.sans-serif']=['SimHei']
    plt.figure(1, figsize=(6, 6))
    #决定分割部分,及其与其它部分之间的间距
    expl = [0, 0, 0.2]
    plt.pie(x=num_list, explode=expl, labels=name_list, autopct='%3.1f %%', colors=colors_list, shadow=True)
    plt.show()
#好友在全国的分布情况
def drawChinaMap(province,values):
    map = Map("好友全国分布图",'好友全国分布图',width=1200, height=600)
    map.add("", provice, values, visual_range=[0, 50],  maptype='china', is_visualmap=True,visual_text_color='#000')
    map.show_config()
    map.render(path="friends.svg")
#定义一个函数,用来获取某一列的值(删掉空值行,相同列值计数统计),用字典的形式来保存
def column_value_dict(columnName):
    path = 'test.xls'
    df = pd.DataFrame(pd.read_excel(path))#读取数据,设置None可以生成一个字典,字典中的key值即为sheet名字,此时不用使用DataFram,会报错
    df.dropna(subset=[columnName],inplace=True) # 删除该列为空值的行
    df = df.reset_index() #进行了删除操作后,需要进行重置索引
    column = df[columnName].value_counts().index.tolist()  #获取该列的索引列表
    column_count = df[columnName].value_counts().tolist()  #统计该列个数的列表
    dict = {} #定义一个字典,用来存放对应列有多少个数
    for i in range(0, len(column)):
        dict[column[i]] = column_count[i]
    for i in range(0,len(column)):
        flag = isAllChinese(column[i]) #调用函数,检测其是否为中文
        if not flag:
            del dict[column[i]]  #删除掉不是中文的值
    return dict        #返回一个字典
#过滤其它语言,留下中文
def text_chinese_list(text_list):
    text_chinese_list = []
    length = len(text_list)
    for i in range(0,length):
        flag = isAllChinese(text_list[i])
        if flag:
            text_chinese_list.append(text_list[i])
    return text_chinese_list

path = 'test.xls'
df = pd.DataFrame(pd.read_excel(path))#读取数据,设置None可以生成一个字典,字典中的key值即为sheet名字,此时不用使用DataFram,会报错
#获取各性别的数量
femals_Count = df['Sex'].value_counts()[2]
man_Count = df['Sex'].value_counts()[1]
unknow_sex_Count = df['Sex'].value_counts()[0]
#标签列表
name_list = ['女性', '男性', '未知性别']
#各标签对应的人数列表
num_list = [femals_Count, man_Count, unknow_sex_Count]
#颜色列表
colors_list = ['green', 'red', 'blue']
print("性别分层饼狀图分析")
drawLayered(num_list, name_list,colors_list)
df.dropna(subset=['Signature'],inplace=True) # 删除该列为空值的行
df = df.reset_index() #进行了删除操作后,需要进行重置索引
text_list = df['Signature'].values.tolist()
text_chinese_list = text_chinese_list(text_list)   #留下中文,过滤其它语言
text_string = ",".join(text_chinese_list)     #转换成字符串
f = open(r'text.txt','w')                  #将文本写入txt文件中保存起来
f.write(text_string)
f.close()
dict_province = {}
dict_city = {}
dict_province = column_value_dict('Province')
dict_city = column_value_dict('City')
dict_city_keys =  dict_city.keys()
dict_city_value = dict_city.values()
dict_province_keys =  dict_province.keys()
dict_province_value = dict_province.values()
#取市前十位数据
dict_city_keys_Top10 = list(dict_city_keys)[0:10:1]
dict_city_value_Top10 = list(dict_city_value)[0:10:1]
print("省份圆饼图分析")
drawPie(data=dict_province_value, labels=dict_province_keys)
print("省份柱状图分析")
drawHistogram(list(dict_province_keys), list(dict_province_value))
print("市圆饼图分析")
drawPie(data=dict_city_value_Top10, labels=dict_city_keys_Top10)
print("市柱状图分析")
drawHistogram(dict_city_keys_Top10, dict_city_value_Top10)
print("签名词云生成")
#生云图
filename = 'text.txt'
referencePicture_Path = 'horse.jpg'
font_path = './fangzhengsongke.ttf'
drawClouc(filename,referencePicture_Path,font_path)
print("统计分析结束")

敲黑板:
对于有些读者不是很了解itchat库操作微信网页版,我推荐去看这个链接(本人觉得挺详细)
想查看微信好友撤回的消息?Python帮你搞定
不用管标题,看内容能够学到一些东西就行。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值