用Python对微信好友进行分析_loading the contact, this may take a little while

用了微信几年了,微信号有也不少了,但是真正了解自己的好友吗?好友最多的城市是哪个?好友男女比例是多少?好友签名都是什么?今天我们来充分了解自己的微信好友。

运行平台: Windows 
Python版本: Python3.6 
IDE: Sublime Text 
其他工具: Chrome浏览器

1、准备工作

1.1 库介绍

只有登录微信才能获取到微信好友的信息,本文采用wxpy该第三方库进行微信的登录以及信息的获取。

wxpy 在 itchat 的基础上,通过大量接口优化提升了模块的易用性,并进行丰富的功能扩展。

wxpy一些常见的场景:

  • 控制路由器、智能家居等具有开放接口的玩意儿
  • 运行脚本时自动把日志发送到你的微信
  • 加群主为好友,自动拉进群中
  • 跨号或跨群转发消息
  • 自动陪人聊天
  • 逗人玩

总而言之,可用来实现各种微信个人号的自动化操作。

1.2 wxpy库安装

wxpy 支持 Python 3.4-3.6,以及 2.7 版本

将下方命令中的 “pip” 替换为 “pip3” 或 “pip2”,可确保安装到对应的 Python 版本中

  1. 从 PYPI 官方源下载安装 (在国内可能比较慢或不稳定):
pip install -U wxpy
  1. 从豆瓣 PYPI 镜像源下载安装 (推荐国内用户选用):
pip install -U wxpy -i "https://pypi.doubanio.com/simple/"

1.3 登录微信

wxpy中有一个机器人对象,机器人 Bot 对象可被理解为一个 Web 微信客户端。Bot 在初始化时便会执行登陆操作,需要手机扫描登陆。

通过机器人对象 Bot 的 chats()friends()groups()mps() 方法, 可分别获取到当前机器人的 所有聊天对象、好友、群聊,以及公众号列表。

本文主要通过friends()获取到所有好友信息,然后进行数据的处理。

from wxpy import *

# 初始化机器人,扫码登陆
bot = Bot()

# 获取所有好友
my_friends = bot.friends()
print(type(my_friends))

以下为输出消息:

Getting uuid of QR code.
Downloading QR code.
Please scan the QR code to log in.
Please press confirm on your phone.
Loading the contact, this may take a little while.
<Login successfully as 王强?>
<class 'wxpy.api.chats.chats.Chats'>

wxpy.api.chats.chats.Chats对象是多个聊天对象的合集,可用于搜索或统计,可以搜索和统计的信息包括sex(性别)、province(省份)、city(城市)和signature(个性签名)等。

2、微信好友男女比例

2.1 数据统计

使用一个字典sex_dict来统计好友中男性和女性的数量。

# 使用一个字典统计好友男性和女性的数量
sex_dict = {'male': 0, 'female': 0}

for friend in my_friends:
    # 统计性别
    if friend.sex == 1:
        sex_dict['male'] += 1
    elif friend.sex == 2:
        sex_dict['female'] += 1

print(sex_dict)

以下为输出结果:

{'male': 255, 'female': 104}

2.2 数据呈现

本文采用 ECharts饼图 进行数据的呈现,打开链接http://echarts.baidu.com/echarts2/doc/example/pie1.html,可以看到如下内容:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从图中可以看到左侧为数据,右侧为呈现的数据图,其他的形式的图也是这种左右结构。看一下左边的数据:

option = {
    title : {
        text: '某站点用户访问来源',
        subtext: '纯属虚构',
        x:'center'
    },
    tooltip : {
        trigger: 'item',
        formatter: "{a} <br/>{b} : {c} ({d}%)"
 },
 legend: {
 orient : 'vertical',
 x : 'left',
 data:['直接访问','邮件营销','联盟广告','视频广告','搜索引擎']
 },
 toolbox: {
 show : true,
 feature : {
 mark : {show: true},
 dataView : {show: true, readOnly: false},
 magicType : {
 show: true, 
 type: ['pie', 'funnel'],
 option: {
 funnel: {
 x: '25%',
 width: '50%',
 funnelAlign: 'left',
 max: 1548
 }
 }
 },
 restore : {show: true},
 saveAsImage : {show: true}
 }
 },
 calculable : true,
 series : [
 {
 name:'访问来源',
 type:'pie',
 radius : '55%',
 center: ['50%', '60%'],
 data:[
 {value:335, name:'直接访问'},
 {value:310, name:'邮件营销'},
 {value:234, name:'联盟广告'},
 {value:135, name:'视频广告'},
 {value:1548, name:'搜索引擎'}
 ]
 }
 ]
}; 

可以看到option =后面的大括号里是JSON格式的数据,接下来分析一下各项数据:

  • title:标题

    • text:标题内容
    • subtext:子标题
    • x:标题位置
  • tooltip:提示,将鼠标放到饼状图上就可以看到提示

  • legend:图例

    • orient:方向
    • x:图例位置
    • data:图例内容
  • toolbox:工具箱,在饼状图右上方横向排列的图标

    • mark:辅助线开关
    • dataView:数据视图,点击可以查看饼状图数据
    • magicType:饼图(pie)切换和漏斗图(funnel)切换
    • restore:还原
    • saveAsImage:保存为图片
  • calculable:暂时不知道它有什么用

  • series:主要数据

    • data:呈现的数据

其它类型的图数据格式类似,后面不再详细分析。只需要修改data、l**egend->data**、series->data即可,修改后的数据为:

option = {
    title : {
        text: '微信好友性别比例',
        subtext: '真实数据',
        x:'center'
    },
    tooltip : {
        trigger: 'item',
        formatter: "{a} <br/>{b} : {c} ({d}%)"
 },
 legend: {
 orient : 'vertical',
 x : 'left',
 data:['男性','女性']
 },
 toolbox: {
 show : true,
 feature : {
 mark : {show: true},
 dataView : {show: true, readOnly: false},
 magicType : {
 show: true, 
 type: ['pie', 'funnel'],
 option: {
 funnel: {
 x: '25%',
 width: '50%',
 funnelAlign: 'left',
 max: 1548
 }
 }
 },
 restore : {show: true},
 saveAsImage : {show: true}
 }
 },
 calculable : true,
 series : [
 {
 name:'访问来源',
 type:'pie',
 radius : '55%',
 center: ['50%', '60%'],
 data:[
 {value:255, name:'男性'},
 {value:104, name:'女性'}
 ]
 }
 ]
}; 

数据修改完成后,点击页面中绿色的刷新按钮,可以得到饼图如下(可以根据自己的喜好修改主题):

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

将鼠标放到饼图上可以看到详细数据:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3、微信好友全国分布图

3.1 数据统计

# 使用一个字典统计各省好友数量
province_dict = {'北京': 0, '上海': 0, '天津': 0, '重庆': 0,
    '河北': 0, '山西': 0, '吉林': 0, '辽宁': 0, '黑龙江': 0,
    '陕西': 0, '甘肃': 0, '青海': 0, '山东': 0, '福建': 0,
    '浙江': 0, '台湾': 0, '河南': 0, '湖北': 0, '湖南': 0,
    '江西': 0, '江苏': 0, '安徽': 0, '广东': 0, '海南': 0,
    '四川': 0, '贵州': 0, '云南': 0,
    '内蒙古': 0, '新疆': 0, '宁夏': 0, '广西': 0, '西藏': 0,
    '香港': 0, '澳门': 0}

# 统计省份
for friend in my_friends:
    if friend.province in province_dict.keys():
        province_dict[friend.province] += 1

# 为了方便数据的呈现,生成JSON Array格式数据
data = []
for key, value in province_dict.items():
    data.append({'name': key, 'value': value})

print(data)

以下为输出结果:

[{'name': '北京', 'value': 91}, {'name': '上海', 'value': 12}, {'name': '天津', 'value': 15}, {'name': '重庆', 'value': 1}, {'name': '河北', 'value': 53}, {'name': '山西', 'value': 2}, {'name': '吉林', 'value': 1}, {'name': '辽宁', 'value': 1}, {'name': '黑龙江', 'value': 2}, {'name': '陕西', 'value': 3}, {'name': '甘肃', 'value': 0}, {'name': '青海', 'value': 0}, {'name': '山东', 'value': 7}, {'name': '福建', 'value': 3}, {'name': '浙江', 'value': 4}, {'name': '台湾', 'value': 0}, {'name': '河南', 'value': 1}, {'name': '湖北', 'value': 4}, {'name': '湖南', 'value': 4}, {'name': '江西', 'value': 4}, {'name': '江苏', 'value': 9}, {'name': '安徽', 'value': 2}, {'name': '广东', 'value': 63}, {'name': '海南', 'value': 0}, {'name': '四川', 'value': 2}, {'name': '贵州', 'value': 0}, {'name': '云南', 'value': 1}, {'name': '内蒙古', 'value': 0}, {'name': '新疆', 'value': 2}, {'name': '宁夏', 'value': 0}, {'name': '广西', 'value': 1}, {'name': '西藏', 'value': 0}, {'name': '香港', 'value': 0}, {'name': '澳门', 'value': 0}]

可以看出,好友最多的省份为北京。那么问题来了:为什么要把数据重组成这种格式?因为ECharts的地图需要这种格式的数据。

3.2 数据呈现

采用ECharts地图 来进行好友分布的数据呈现。打开该网址,将左侧数据修改为:

option = {
    title : {
        text: '微信好友全国分布图',
        subtext: '真实数据',
        x:'center'
    },
    tooltip : {
        trigger: 'item'
    },
    legend: {
        orient: 'vertical',
        x:'left',
        data:['好友数量']
    },
    dataRange: {
        min: 0,
        max: 100,
        x: 'left',
        y: 'bottom',
        text:['高','低'],           // 文本,默认为数值文本
        calculable : true
    },
    toolbox: {
        show: true,
        orient : 'vertical',
        x: 'right',
        y: 'center',
        feature : {
            mark : {show: true},
            dataView : {show: true, readOnly: false},
            restore : {show: true},
            saveAsImage : {show: true}
        }
    },
    roamController: {
        show: true,
        x: 'right',
        mapTypeControl: {
            'china': true
        }
    },
    series : [
        {
            name: '好友数量',
            type: 'map',
            mapType: 'china',
            roam: false,
            itemStyle:{
                normal:{label:{show:true}},
                emphasis:{label:{show:true}}
            },
            data:[
              {'name': '北京', 'value': 91},
              {'name': '上海', 'value': 12},
              {'name': '天津', 'value': 15}, 
              {'name': '重庆', 'value': 1}, 
              {'name': '河北', 'value': 53},
              {'name': '山西', 'value': 2}, 
              {'name': '吉林', 'value': 1},
              {'name': '辽宁', 'value': 1}, 
              {'name': '黑龙江', 'value': 2},
              {'name': '陕西', 'value': 3},
              {'name': '甘肃', 'value': 0},
              {'name': '青海', 'value': 0}, 
              {'name': '山东', 'value': 7},
              {'name': '福建', 'value': 3}, 
              {'name': '浙江', 'value': 4},
              {'name': '台湾', 'value': 0},
              {'name': '河南', 'value': 1},
              {'name': '湖北', 'value': 4}, 
              {'name': '湖南', 'value': 4},
              {'name': '江西', 'value': 4},
              {'name': '江苏', 'value': 9},
              {'name': '安徽', 'value': 2},
              {'name': '广东', 'value': 63}, 
              {'name': '海南', 'value': 0},
              {'name': '四川', 'value': 2},
              {'name': '贵州', 'value': 0}, 
              {'name': '云南', 'value': 1},
              {'name': '内蒙古', 'value': 0},
              {'name': '新疆', 'value': 2}, 
              {'name': '宁夏', 'value': 0},
              {'name': '广西', 'value': 1},
              {'name': '西藏', 'value': 0},
              {'name': '香港', 'value': 0},
              {'name': '澳门', 'value': 0}
            ]
        }
    ]
};                    

注意两点:

  • dataRange->max 根据统计数据适当调整
  • series->data 的数据格式

现在能在网上找到很多很多的学习资源,有免费的也有收费的,当我拿到1套比较全的学习资源之前,我并没着急去看第1节,我而是去审视这套资源是否值得学习,有时候也会去问一些学长的意见,如果可以之后,我会对这套学习资源做1个学习计划,我的学习计划主要包括规划图和学习进度表。

分享给大家这份我薅到的免费视频资料,质量还不错,大家可以跟着学习

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里无偿获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
多很多的学习资源,有免费的也有收费的,当我拿到1套比较全的学习资源之前,我并没着急去看第1节,我而是去审视这套资源是否值得学习,有时候也会去问一些学长的意见,如果可以之后,我会对这套学习资源做1个学习计划,我的学习计划主要包括规划图和学习进度表。

分享给大家这份我薅到的免费视频资料,质量还不错,大家可以跟着学习

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里无偿获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 26
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值