精华内容
下载资源
问答
  • 意识状态

    千次阅读 2019-01-14 09:33:35
    我认为,刷朋友圈,是一种意识状态。因为你不知道这样做的目的是什么,是为了看具体某个好朋友的状态吗,是为了了解了解这几天就是这些事儿吗,我觉得可能都不是。真正的原因,是坐在地铁上,有一个多小时的时间没...

    最近有一个感觉,好多时间的浪费,是因为自己处在无意识状态造成的。

    无意识状态,就是对自己当前正在做的事情,处在了一种习惯成自然,下意识的状态。也就是说,自己可能根本就没有意识到自己在干什么。

    我认为,刷朋友圈,是一种无意识状态。因为你不知道这样做的目的是什么,是为了看具体某个好朋友的状态吗,是为了了解了解这几天就是这些事儿吗,我觉得可能都不是。真正的原因,是坐在地铁上,有一个多小时的时间没办法打发,刷刷朋友圈,可以让这一个小时不那么难过,仅此而已。

    同样的道理,打开浏览器看新闻,也是这样的状态。

    与之相反的一个状态叫刻意练习。

    刻意练习,一方面指的是要持续练习自己不会的技能,另一方面,它更强调在练习的时候,自己要时刻处在有意识的状态,清楚的知道自己正在做的事情,强化大脑的印象,以至于形成大脑皮层的沟回。

    一定要尽量避免自己处在无意识状态。即便是放松和游戏,也要是有意识的。

    展开全文
  • 不知从何时起,我们的生活离不开微信,每天睁开眼的第一件事就是打开微信,关注着朋友圈里好友的动态,而朋友圈中或虚或实的状态更新,似乎都在证明自己的“有趣”,寻找那份或有或的存在感。 有人选择在朋友圈...

    视频课程链接:https://edu.csdn.net/course/detail/9348

    微信:一个提供即时通讯服务的应用程序,更是一种生活方式,超过数十亿的使用者,越来越多的人选择使用它来沟通交流。

    不知从何时起,我们的生活离不开微信,每天睁开眼的第一件事就是打开微信,关注着朋友圈里好友的动态,而朋友圈中或虚或实的状态更新,似乎都在证明自己的“有趣”,寻找那份或有或无的存在感。

    在这里插入图片描述

    有人选择在朋友圈记录生活的点滴,有人选择在朋友圈展示自己的观点。有时我们想去展示自己,有时又想去窥探着别人的生活,而有时又不想别人过多的了解自己的生活,或是屏蔽对方,或是不给对方看朋友圈,又或是不想看对方的朋友圈。

    在这里插入图片描述

    作者本人(汤小洋 )也是微信的重度依赖者,每天的工作生活都离不开它,也会关注朋友圈里好友的动态,我个人认为微信朋友圈是一种文化的体现,诸如:发圈、点赞、留言等,都能侧面的反应一个人的生活、工作、心态、爱好、修养、上进心、努力程度等。

    今天就跟着 汤老师 一起来揭秘微信朋友圈,利用 Python+AI人工智能 进行多角度分析,一起看透你的“朋友圈”。

    我们将使用Python抓取朋友圈数据,并对获取到的数据进行全面分析,包含好友性别、地理位置分布、个性签名、备注名、好友类型等,逐一进行分析,同时还会使用人脸识别技术对好友头像进行分析,分析到你怀疑人生。。。。。。 _

    整个过程分为四步:

    1. 获取数据
    2. 处理数据
    3. 存储数据
    4. 数据可视化

    一、获取数据

    ​ 关于微信好友数据的获取,可以通过itchat库,itchat是一个开源的微信个人号的接口,可以实现信息收发、获取好友列表等功能。

    ​ 具体的用法和说明,在代码中已经做了详细的注释。

    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    __author__ = '汤小洋'
    
    # 导入itchat模块,操作微信个人号的接口
    import itchat
    
    
    # 获取数据
    def get_data():
        # 扫描二维码登陆微信,实际上就是通过网页版微信登陆
        itchat.auto_login()
        # 获取所有好友信息
        friends = itchat.get_friends(update=True)  # 返回一个包含用户信息字典的列表
        return friends
    
    
    if __name__ == '__main__':
        print(get_data())
    

    ​ 执行代码时电脑屏幕会出现一个二维码,手机微信扫描后即可完成登陆

    在这里插入图片描述

    二、处理数据

    ​ 对获取的数据进行处理,筛选出需要的数据。

    ​ 通过对返回的用户信息进行分析,发现列表中第一个元素是用户自己,可以排除掉。同时我们只取需要的字段数据,各个字段及其取值的含义已在代码中做了说明。

    # 处理数据
    def parse_data(data):
        friends = []
        for item in data[1:]:  # 第一个元素是自己,排除掉
            friend = {
                'NickName': item['NickName'],  # 昵称
                'RemarkName': item['RemarkName'],  # 备注名
                'Sex': item['Sex'],  # 性别:1男,2女,0未设置
                'Province': item['Province'],  # 省份
                'City': item['City'],  # 城市
                'Signature': item['Signature'].replace('\n', ' ').replace(',', ' '),  # 个性签名(处理签名内容换行的情况)
                'StarFriend': item['StarFriend'],  # 星标好友:1是,0否
                'ContactFlag': item['ContactFlag']  # 好友类型及权限:1和3好友,259和33027不让他看我的朋友圈,65539不看他的朋友圈,65795两项设置全禁止
            }
            print(friend)
            friends.append(friend)
        return friends
    
    if __name__ == '__main__':
        print(parse_data(get_data()))
    

    三、存储数据

    ​ 为了便于分析数据并进行可视化操作,这里将数据存储到文本文件中。

    # 存储数据,存储到文本文件
    def save_to_txt():
        friends = parse_data(get_data())
        for item in friends:
            with open('friends.txt', mode='a', encoding='utf-8') as f:
                f.write('%s,%s,%d,%s,%s,%s,%d,%d\n' % (
                    item['NickName'], item['RemarkName'], item['Sex'], item['Province'], item['City'], item['Signature'],
                    item['StarFriend'], item['ContactFlag']))
    
    
    if __name__ == '__main__':
        save_to_txt()
    

    ​ **重要说明:**这里我获取的是自己的微信好友数据(共计950条,因工作关系,好友数比较多),考虑到个人隐私,部分信息做了处理。

    在这里插入图片描述

    四、数据可视化

    ​ 这里使用的是pyecharts,pyecharts是一个用于生成Echarts图表的类库,便于在Python中根据数据生成可视化的图表。

    ​ Echarts是百度开源的一个数据可视化JS库,主要用于数据可视化。

    ​ 参考:http://pyecharts.org/

    # 安装pyecharts
    pip install pyecharts 
    

    1. 好友性别分析

    ​ 代码实现:

    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    __author__ = '汤小洋'
    
    # 导入Pie组件,用于生成饼图
    from pyecharts import Pie
    
    # 获取所有性别
    sex = []
    with open('friends.txt', mode='r', encoding='utf-8') as f:
        rows = f.readlines()
        for row in rows:
            sex.append(row.split(',')[2])
    # print(sex)
    
    # 统计每个性别的数量
    attr = ['帅哥', '美女', '未知']
    value = [sex.count('1'), sex.count('2'), sex.count('0')]
    
    pie = Pie('好友性别比例', '好友总人数:%d' % len(sex), title_pos='center')
    pie.add('', attr, value, radius=[30, 75], rosetype='area', is_label_show=True,
            is_legend_show=True, legend_top='bottom')
    # pie.show_config()
    pie.render('好友性别比例.html') 
    

    可视化结果:

    好友主要为男性,占比70%,男女比例严重失衡

    在这里插入图片描述

    看到这个结果,我是有些淡淡忧桑的,微信好友总人数为950,帅哥占比70.42%,美女占比24.53%,男女比例严重失衡,但一点也不意外,本人是一名IT工作者,平时喜欢跑步,所以工作、生活接触到的大部分都是男性朋友,出现男女比例失衡实属正常。

    2. 好友位置分析

    pyecharts v0.3.2以后,pyecharts 将不再自带地图 js 文件。如用户需要用到地图图表,可自行安装对应的地图文件包。

    # 安装地图文件包
    pip install echarts-china-provinces-pypkg # 中国省、市、县、区地图
    pip install echarts-china-cities-pypkg
    pip install echarts-china-counties-pypkg
    pip install echarts-china-misc-pypkg 
    pip install echarts-countries-pypkg # 全球国家地图
    pip install echarts-united-kingdom-pypkg
    

    代码实现:

    # 导入Counter类,用于统计值出现的次数
    from collections import Counter
    # 导入Geo组件,用于生成地理坐标类图
    from pyecharts import Geo
    import json
    # 导入Bar组件,用于生成柱状图
    from pyecharts import Bar
    
    
    # 数据可视化
    def render():
        # 获取所有城市
        cities = []
        with open('friends.txt', mode='r', encoding='utf-8') as f:
            rows = f.readlines()
            for row in rows:
                city = row.split(',')[4]
                if city != '':  # 去掉城市名为空的值
                    cities.append(city)
    
        # 对城市数据和坐标文件中的地名进行处理
        handle(cities)
    
        # 统计每个城市出现的次数
        data = Counter(cities).most_common()  # 使用Counter类统计出现的次数,并转换为元组列表
        print(data)
    
        # 根据城市数据生成地理坐标图
        geo = Geo('好友位置分布', '', title_color='#fff', title_pos='center', width=1200, height=600,
                  background_color='#404a59')
        attr, value = geo.cast(data)
        geo.add('', attr, value, visual_range=[0, 500],
                visual_text_color='#fff', symbol_size=15,
                is_visualmap=True, is_piecewise=True)
        geo.render('好友位置分布.html')
    
        # 根据城市数据生成柱状图
        data_top20 = Counter(cities).most_common(20)  # 返回出现次数最多的20条
        bar = Bar('好友所在城市TOP20', '', title_pos='center', width=1200, height=600)
        attr, value = bar.cast(data_top20)
        bar.add('', attr, value, is_visualmap=True, visual_text_color='#fff', is_more_utils=True,
                is_label_show=True)
        bar.render('好友所在城市TOP20.html')
    
    

    出现的问题:

    • 报错:ValueError: No coordinate is specified for xxx(地名)

    • 原因:pyecharts的坐标文件中没有该地名,实际上是名称不一致导致的,如数据中地名为’达州’,而坐标文件中为’达州市’

      坐标文件所在路径:项目/venv/lib/python3.6/site-packages/pyecharts/datasets/city_coordinates.json

    • 解决:修改坐标文件,在原位置下复制个同样的,然后修改下地名

    {
      "南京市": [
        107.5,
        31.22
      ],
       "南京": [
        107.5,
        31.22
      ],
    }  
    

    不过由于要修改的地名太多,上面的方法实在是麻烦,所以我定义了一个函数,用来处理地名数据找不到的问题

    # 处理地名数据,解决坐标文件中找不到地名的问题
    def handle(cities):
        # print(len(cities), len(set(cities)))
    
        # 获取坐标文件中所有地名
        data = None
        with open(
                '/Users/wangbo/PycharmProjects/python-spider/venv/lib/python3.6/site-packages/pyecharts/datasets/city_coordinates.json',
                mode='r', encoding='utf-8') as f:
            data = json.loads(f.read())  # 将str转换为json
    
        # 循环判断处理
        data_new = data.copy()  # 拷贝所有地名数据
        for city in set(cities):  # 使用set去重
            # 处理地名为空的数据
            if city == '':
                while city in cities:
                    cities.remove(city)
            count = 0
            for k in data.keys():
                count += 1
                if k == city:
                    break
                if k.startswith(city):  # 处理简写的地名,如 达州市 简写为 达州
                    # print(k, city)
                    data_new[city] = data[k]
                    break
                if k.startswith(city[0:-1]) and len(city) >= 3:  # 处理行政变更的地名,如县改区 或 县改市等
                    data_new[city] = data[k]
                    break
            # 处理不存在的地名
            if count == len(data):
                while city in cities:
                    cities.remove(city)
    
        # print(len(data), len(data_new))
    
        # 写入覆盖坐标文件
        with open(
                '/Users/wangbo/PycharmProjects/python-spider/venv/lib/python3.6/site-packages/pyecharts/datasets/city_coordinates.json',
                mode='w', encoding='utf-8') as f:
            f.write(json.dumps(data_new, ensure_ascii=False))  # 将json转换为str
    

    可视化结果:

    好友主要集中在江苏及周边地区

    在这里插入图片描述

    在这里插入图片描述

    从图中可以发现:我的微信好友主要集中在江苏及周边地区,本人大学读书时来到南京,现在工作生活也一直在南京,所以南京好友最多,为483个;我自小是在徐州长大的,所以徐州好友数量也较多;同时因为喜欢跑马拉松,结识了许多跑友,也经常会到周边沿海城市跑步,所以好友位置主要分布在沿海一带。

    3. 个性签名词云图

    ​ jieba是一个基于Python的分词库,完美支持中文分词,功能强大

    pip install jieba
    

    ​ Matplotlib是一个Python的2D绘图库,能够生成高质量的图形,可以快速生成绘图、直方图、功率谱、柱状图、误差图、散点图等

    pip install matplotlib
    

    ​ wordcloud是一个基于Python的词云生成类库,可以生成词云图

    pip install wordcloud
    

    ​ 代码实现:

    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    __author__ = '汤小洋'
    
    # 导入jieba模块,用于中文分词
    import jieba
    # 导入matplotlib,用于生成2D图形
    import matplotlib.pyplot as plt
    # 导入wordcount,用于制作词云图
    from wordcloud import WordCloud, STOPWORDS
    
    # 获取所有个性签名
    signatures = []
    with open('friends.txt', mode='r', encoding='utf-8') as f:
        rows = f.readlines()
        for row in rows:
            signature = row.split(',')[5]
            if signature != '':
                signatures.append(signature)
    
    # 设置分词
    split = jieba.cut(str(signatures), cut_all=False)  # False精准模式分词、True全模式分词
    words = ' '.join(split)  # 以空格进行拼接
    # print(words)
    
    # 设置屏蔽词,去除个性签名中的表情、特殊符号等
    stopwords = STOPWORDS.copy()
    stopwords.add('span')
    stopwords.add('class')
    stopwords.add('emoji')
    stopwords.add('emoji1f334')
    stopwords.add('emoji1f388')
    stopwords.add('emoji1f33a')
    stopwords.add('emoji1f33c')
    stopwords.add('emoji1f633')
    
    # 导入背景图
    bg_image = plt.imread('bg.jpg')
    
    # 设置词云参数,参数分别表示:画布宽高、背景颜色、背景图形状、字体、屏蔽词、最大词的字体大小
    wc = WordCloud(width=1024, height=768, background_color='white', mask=bg_image, font_path='STKAITI.TTF',
                   stopwords=stopwords, max_font_size=400, random_state=50)
    # 将分词后数据传入云图
    wc.generate_from_text(words)
    plt.imshow(wc)  # 绘制图像
    plt.axis('off')  # 不显示坐标轴
    # 保存结果到本地
    wc.to_file('个性签名词云图.jpg')
    

    可视化结果:

    充满正能量、努力生活

    ​ 个性签名可以反映人的一种心态,对所有好友的个性签名进行分词后制作如下词云图:

    在这里插入图片描述

    ​ 从词云图中可以看到,微信好友个性签名中出现频率较高的词汇有:自己、努力、生活、世界、就是、我们、人生、没有、需要、不要、时间、一切、一起、永远、未来、运动、快乐、温柔、个性等,整体来看,我的微信好友还是充满正能量的,都是积极向上、努力生活、有个性的年青人。

    ​ 我们可以来详细的分析下这些高频词:

    • **自己、就是、我们、个性:**彰显个性的自我、自以为是、自大等,也说明了年青人的个性张扬、无所畏惧
    • **努力、生活、时间、需要:**说明大家都在努力的工作,追求各自所需,为更好的生活拼博着
    • **世界、人生、快乐、未来:**正所谓“世界那么大,我想去看看”,生活虽不易,但对外面的世界、对人生的追求从未停止过,快乐最重要
    • **运动、健康、温柔、享受:**说明喜欢运动的朋友比较多,大家都越来越关注健康。温柔、享受也成为共识,活着不易,且活且享受。

    4. 备注名词云图

    ​ 获取好友的备注名,根据备注名生成词名图

    ​ 代码实现:

    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    __author__ = '汤小洋'
    
    # 导入jieba模块,用于中文分词
    import jieba
    # 导入matplotlib,用于生成2D图形
    import matplotlib.pyplot as plt
    # 导入wordcount,用于制作词云图
    from wordcloud import WordCloud, STOPWORDS
    
    # 获取备注名
    remarkNames = []
    with open('friends.txt', mode='r', encoding='utf-8') as f:
        rows = f.readlines()
        for row in rows:
            remarkName = row.split(',')[1]
            if remarkName != '':
                remarkNames.append(remarkName)
    
    # 设置分词
    split = jieba.cut(str(remarkNames), cut_all=False)  # False精准模式分词、True全模式分词
    words = ' '.join(split)  # 以空格进行拼接
    print(words)
    
    # 导入背景图
    bg_image = plt.imread('bg.jpg')
    
    # 设置词云参数,参数分别表示:画布宽高、背景颜色、背景图形状、字体、屏蔽词、最大词的字体大小
    wc = WordCloud(width=1024, height=768, background_color='white', mask=bg_image, font_path='STKAITI.TTF',
                   max_font_size=400, random_state=50)
    # 将分词后数据传入云图
    wc.generate_from_text(words)
    plt.imshow(wc)  # 绘制图像
    plt.axis('off')  # 不显示坐标轴
    # 保存结果到本地
    wc.to_file('备注名词云图.jpg')
    

    可视化结果:

    好友备注中“跑友”、“南航”出现的频率最高

    在这里插入图片描述

    ​ 从图中可以看出,我的好友备注中出现的高频词有:跑友、南航、wbs17091、wbs18031、wbs17022、wbs17071等

    • 本人平时喜欢跑步,也经常参加各种马拉松活动,认识的跑友比较多,所以不足为奇

    • 由于工作上与南航有一定的交集,所以南航的好友也比较多

    • 以wbs开头的备注都是我工作中带过的学生,数量众多,身为一名IT教育工作者,深感光荣。

      **重要说明:**考虑个人隐私,图中部分姓名做了化名处理,请勿当真,如有不便,还望谅解。

    5. 好友分类分析

    ​ 根据备注名,对好友进行分类,统计各类好友的数量

    ​ PS:我的习惯是对好友添加备注,标记好友的类型或来源,这个属于个人洁癖的一种吧

    ​ 代码实现:

    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    __author__ = '汤小洋'
    
    # 导入jieba模块,用于中文分词
    import jieba
    # 导入Counter类,用于统计值出现的次数
    from collections import Counter
    from pyecharts import Bar
    
    # 获取备注名
    remarkNames = []
    with open('friends.txt', mode='r', encoding='utf-8') as f:
        rows = f.readlines()
        for row in rows:
            remarkName = row.split(',')[1]
            if remarkName != '':
                remarkNames.append(remarkName)
    
    # 设置分词
    words = [x for x in jieba.cut(str(remarkNames), cut_all=False) if x not in ['-', ',', '(', ')', '(', ')', ' ', "'"]]  # 排除短横线、逗号、空格、单引号
    data_top10 = Counter(words).most_common(10)  # 返回出现次数最多的20条
    print(data_top10)
    
    bar = Bar('好友分类TOP10', '', title_pos='center', width=1200, height=600)
    attr, value = bar.cast(data_top10)
    bar.add('', attr, value, visual_range=[0, 200], is_visualmap=True, is_label_show=True)
    bar.render('好友分类TOP10.html')
    

    可视化结果:

    学生最多,其实是跑友

    在这里插入图片描述

    这里只统计好友分类数量最多的前10,其中跑友160人,南航52人,其他的都是wbs开头的学生,实际上wbs开头的学生数是最多的,只是在备注时按班级号进行了划分。

    通过分析统计,自己对各类好友的数量也做到了心里有数。

    6. 特殊好友分析

    ​ 获取并统计以下的特殊好友:星标好友不让他看我的朋友圈不看他的朋友圈

    ​ 代码实现:

    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    __author__ = '汤小洋'
    from pyecharts import Bar
    
    # 获取特殊好友
    star_list = []  # 星标朋友
    deny_see_list = []  # 不让他看我的朋友圈
    no_see_list = []  # 不看他的朋友圈
    
    with open('friends.txt', mode='r', encoding='utf-8') as f:
        rows = f.readlines()
        for row in rows:
            # # 获取好友名称
            name = row.split(',')[1] if row.split(',')[1] != '' else row.split(',')[0]
            # 获取星标朋友
            star = row.split(',')[6]
            if star == '1':
                star_list.append(name)
            # 获取设置了朋友圈权限的朋友
            flag = row.split(',')[7].replace('\n', '')
            if flag in ['259', '33027', '65795']:
                deny_see_list.append(name)
            if flag in ['65539', '65795']:
                no_see_list.append(name)
    
    print('星标好友:', star_list)
    print('不让他看我的朋友圈:', deny_see_list)
    print('不看他的朋友圈:', no_see_list)
    
    attr = ['星标朋友', '不让他看我的朋友圈', '不看他的朋友圈']
    value = [len(star_list), len(deny_see_list), len(no_see_list)]
    
    bar = Bar('特殊好友分析', '', title_pos='center')
    bar.add('', attr, value, is_visualmap=True, is_label_show=True)
    bar.render('特殊好友分析.html')
    

    可视化结果:

    特殊好友。。。你懂的

    在这里插入图片描述

    从上图中可以发现:

    • 星标好友有4个,主要是特别关注的好友,个人觉得比较重要
    • 不让他看我的朋友圈有30个,这类好友一般是比较陌生的人,了解较少,当然也有个别觉得不太方便的
    • 不看他的朋友圈有8个,这类基本上都是只在朋友圈发广告的,除了广告没有别的内容,而且每天发好几条,确实有点烦

    **补充:**在代码中有对特殊好友的姓名进行输出显示,各位看客在运行代码时可以在控制台查看特殊好友具体是谁

    7. 好友头像分析

    ​ 使用腾讯优图提供的人脸识别技术,对头像进行检测和分析,相关API接口及使用请参考:https://open.youtu.qq.com/legency/#/develop/new-join

    ​ 首先获取所有好友的头像:

    import itchat
    import os
    
    
    # 获取数据
    def get_image():
        itchat.auto_login()
        friends = itchat.get_friends(update=True)
    
        #  在当前位置创建一个用于存储头像的目录headImages
        base_path = 'headImages'
        if not os.path.exists(base_path):
            os.mkdir(base_path)
    
        # 获取所有好友头像
        for friend in friends:
            img_data = itchat.get_head_img(userName=friend['UserName'])  # 获取头像数据
            img_name = friend['RemarkName'] if friend['RemarkName'] != '' else friend['NickName']
            img_file = os.path.join(base_path, img_name + '.jpg')
            print(img_file)
            with open(img_file, 'wb') as file:
                file.write(img_data)
    
                
    if __name__ == '__main__':
        get_data()          
    

    ​ 对头像进行人脸检测,检测头像图片中是否存在人脸,统计使用人脸作用头像的占比。

    补充说明:

    • 使用腾讯优图相关服务需要在其平台上申请开发者账户,并获取审核后的密钥,具体步骤参考官网
    • 在进行人脸检测时速度会比较慢,头像数量不同需要等待的时间也会有所不同,我的好友有900多,大概花了10分钟左右
    # 导入腾讯优图,用来实现人脸检测等功能
    import TencentYoutuyun
    from pyecharts import Pie
    
    def analyse_data():
        # 向腾讯优图平台申请的开发密钥,此处需要替换为自己的密钥
        appid = '********'
        secret_id = '************************'
        secret_key = '************************'
        userid = '********
    
        end_point = TencentYoutuyun.conf.API_YOUTU_END_POINT  # 优图开放平台
        youtu = TencentYoutuyun.YouTu(appid, secret_id, secret_key, userid, end_point)
    
        use_face = 0
        not_use_face = 0
    
        base_path = 'headImages'
        for file_name in os.listdir(base_path):
            result = youtu.DetectFace(os.path.join(base_path, file_name))  # 人脸检测与分析
            # print(result)  # 参考 https://open.youtu.qq.com/legency/#/develop/api-face-analysis-detect
            # 判断是否使用人像
            if result['errorcode'] == 0:  # errorcode为0表示图片中存在人像
                use_face += 1
                gender = '男' if result['face'][0]['gender'] >= 50 else '女'
                age = result['face'][0]['age']
                beauty = result['face'][0]['beauty']  # 魅力值
                glasses = '不戴眼镜 ' if result['face'][0]['glasses'] == 0 else '戴眼镜'
                # print(file_name[:-4], gender, age, beauty, glasses, sep=',')
                with open('header.txt', mode='a', encoding='utf-8') as f:
                    f.write('%s,%s,%d,%d,%s\n' % (file_name[:-4], gender, age, beauty, glasses))
            else:
                not_use_face += 1
    
        attr = ['使用人脸头像', '未使用人脸头像']
        value = [use_face, not_use_face]
        pie = Pie('好友头像分析', '', title_pos='center')
        pie.add('', attr, value, radius=[30, 75], is_label_show=True,
                is_legend_show=True, legend_top='bottom')
        # pie.show_config()
        pie.render('好友头像分析.html')
    
    
    if __name__ == '__main__':
        analyse_data()
    

    可视化结果:

    使用人脸头脸的好友并不算多,占比31%

    在这里插入图片描述

    从上图中可以看到,使用人脸头像的好友并不多,占比30.87%,大部分都未使用人脸头像,占比69.13%,从某个角度可以反应出这部分人不愿过多的暴露自己,或是对自我颜值的不自信,具体情况要看个人的心态了。

    对于使用人脸头像的,还可以检测图片中人脸的性别、年龄、魅力值、是否戴眼镜等(考虑到个人隐私,部分信息做了处理)。

    在这里插入图片描述


    我们还可以将所有头像拼接在一起,生成一个微信好友头像拼接图:

    # 拼接头像
    def join_image():
        base_path = 'headImages'
        files = os.listdir(base_path)
        each_size = int(math.sqrt(float(640 * 640) / len(files)))
        lines = int(640 / each_size)
        image = Image.new('RGB', (640, 640))
        x = 0
        y = 0
        for file_name in files:
            img = Image.open(os.path.join(base_path, file_name))
            img = img.resize((each_size, each_size), Image.ANTIALIAS)
            image.paste(img, (x * each_size, y * each_size))
            x += 1
            if x == lines:
                x = 0
                y += 1
        image.save('all.jpg')
        itchat.send_image('all.jpg', 'filehelper')
    
    

    生成的头像拼接图,有密集恐惧症的请跳过 _

    在这里插入图片描述

    附:
    Python基础入门视频课程:https://edu.csdn.net/course/detail/9347
    Python爬虫视频课程:https://edu.csdn.net/course/detail/9348

    展开全文
  • 全世界只有3.14 %的人关注了爆炸吧知识想发自拍、想秀恩爱、想分享生活状态但一想到别人指手画脚的评论发朋友圈这件事便索然失味人生是不是已经了生趣了呢关注以下这几个优质订阅号远离朋友...

    全世界只有3.14 % 的人关注了

    爆炸吧知识

    想发自拍、想秀恩爱、想分享生活状态

    但一想到别人指手画脚的评论

    发朋友圈这件事便索然失味

    人生是不是已经了无生趣了呢

    关注以下这几个优质订阅号

    远离朋友圈的日子目一新

    不信你就扫码试试


    RSS精选

    ID:KindleNews

    RSS精选是一个专注于时间管理、iOS相关及Kindle阅读的科技公众号,除了有高质量的科技内容以外,还提供RSS订阅的功能

    关注后点击菜单栏“RSS订阅”获得订阅源,就可以使用Kindle或者手机app每天接收知乎日报、澎湃新闻、参考消息、扇贝英语等新闻媒体的报道,推荐你关注!

    关注并回复【我要福利】亚马逊限量手帐周边等你来拿!

    △ 长按上方二维码识别关注


    网易上流

    ID:heyupflow

    网易上流工作室,专注研究青年城市文化。听说有趣的人,背地里都关注了上流君!爆款文章《为什么广东看上去像三个省?》、《广东人为什么那么瘦?》《洗澡,东北人是认真的》、《你们海南人都不用睡觉的嘛?》、《跟江西比,湖南跟四川的辣都是渣渣》等都出自他们之手。后台回复关键词“上流”,查看更多涨知识的趣味文章吧!

    此外上流君的明星互动栏目【上流大明星】还采访了王一博、郑云龙、张云雷、福克斯等明星!后台回复关键词“爱豆”,你的爱豆,都在这里!

    △ 长按上方二维码识别关注


    印客美学

    ID:ink20160101

    这是一个有趣有料的美学公号

    艺术和美学的科普地

    30万有趣灵魂的聚集地

    这里有你想了解的艺术常识

    也有你想要的电影、音乐、书籍、纪录片

    文艺清单

    关注这个号给你一个

    发现美的眼睛和性感的大脑

    【懂美学的人,连颜值都会变高】

    △ 长按上方二维码识别关注


    一本正经萝卜君

     ID:lb-news

    超会“讲段子”

    犀利吐槽,搬运最有趣内容

    每日推送最新沙雕段子、搞笑视频;

    每日一怼,每日话题持续更新;

    专治年轻人的“不开心”

     

    关注后回复“往期”,即可收到上百篇搞笑文章。如: “曝光男朋友和绿茶的聊天截图!内容极度舒适哈哈哈哈哈哈哈!” // “喝醉了,在家族群发了一堆色色的图,我是不是凉了?”;// “曝光一个匿名聊天软件,来感受下网友的聊骚记录”;// 网恋奔现遇到了班主任,这也太刺激了….” 等等等等,爆料不断,吐槽不断,搞笑不断。


    △ 长按上方二维码识别关注


    爆炸吧知识

    ID:superdata1

    ????“爆炸吧知识”是最值得关注的青少年数学科普公众号,它致力于给全球读者提供数学科普知识,分享数学干货,追逐科技前沿的微信公众号,崇尚数学之美,被称为全球3.14159%的读者都在关注的公众号。

    ????你一定很想知道:

    高一被清华姚班录取,高三委拒谷歌offer,一个重度网瘾少年到理论计算机科学家的蜕变

    原创公众号:爆炸吧知识

    ????关注回复“网瘾少年”即可阅读文章

    14岁上中科大,18岁攻读麻省博士,28岁成为哈佛最年轻副教授,“华人女天才”的开挂人生

    原创公众号:爆炸吧知识

    ????关注回复“华人女天才”即可阅读文章

    ????限时活动(关注爆炸吧知识后):

    1)回复“数据”,获取30G涵盖互联网、医疗、教育数据资料。

    2)回复“纪录片”,获取十部数据科学顶级纪录片。

    △ 长按上方二维码识别关注


    黑则言

    IDheizeyan999

    《黑则言》中国黑白影像微杂志,照片是对历史永恒的凝固。

    《黑则言》以影像为基石,发心中块垒,不鸣则已,一鸣惊人。

    △ 长按上方二维码识别关注



    中国诗歌网

    ID:CNshige

    中国诗歌网(网址www.zgshige.com)。国家重点文化工程,国内最大的专业诗歌网站。由中国作家协会·中国作家出版集团主管,《诗刊》社主办。投稿入选“每日好诗”栏目,即可赢取500元稿酬,并获得诗坛专家点评。与国内主要诗歌刊物合作,开设“头条诗人”“主编推荐”等栏目。不定期开展转发赠书等福利活动。

    △ 长按上方二维码识别关注



    bibi动物园

    ID:bibizooo

    这里是年轻人的沙雕聚集地,已在线治愈100万小可爱。

    男女老少,免费入园,看一群小动物如何在线耍宝、卖萌、说段子。

    这里有勇敢正义的小兔子,有萌贱调皮的小松鼠,有来自广东的铁憨憨小猪仔,有007社畜白熊,更有办公室活宝组合猫姐和狗哥……

    每天早上8:30,都有一个园长大人精心绘制的动物园故事,欢迎带着学习压力、工作压力进来,我们将每日提供一次精神马杀鸡,拯救你的不开心!

    扫码关注后回复「情头」,立刻收获第一份惊喜,期待你的加入!

    △ 长按上方二维码识别关注


    新浪微读书

    ID:sinaweidushu

    腹有诗书气自华,读书万卷始通神。每晚6点,新浪微读书每日为你推荐一本书,让阅读拉近你与世界的距离,每日还有专属朋友圈文案等你来拿。 

     

    △ 长按上方二维码识别关注

    展开全文
  • 不知从何时起,我们的生活离不开微信,每天睁开眼的第一件事就是打开微信,关注着朋友圈里好友的动态,而朋友圈中或虚或实的状态更新,似乎都在证明自己的“有趣”,寻找那份或有或的存在感。 有人选择在朋友圈...

    微信:一个提供即时通讯服务的应用程序,更是一种生活方式,超过数十亿的使用者,越来越多的人选择使用它来沟通交流。

    不知从何时起,我们的生活离不开微信,每天睁开眼的第一件事就是打开微信,关注着朋友圈里好友的动态,而朋友圈中或虚或实的状态更新,似乎都在证明自己的“有趣”,寻找那份或有或无的存在感。

    微信好友大揭秘,使用Python抓取朋友圈数据,通过人脸识别全面分析好友,一起看透你的“朋友圈”

    有人选择在朋友圈记录生活的点滴,有人选择在朋友圈展示自己的观点。有时我们想去展示自己,有时又想去窥探着别人的生活,而有时又不想别人过多的了解自己的生活,或是屏蔽对方,或是不给对方看朋友圈,又或是不想看对方的朋友圈。

    微信好友大揭秘,使用Python抓取朋友圈数据,通过人脸识别全面分析好友,一起看透你的“朋友圈”

    作者本人(汤小洋 )也是微信的重度依赖者,每天的工作生活都离不开它,也会关注朋友圈里好友的动态,我个人认为微信朋友圈是一种文化的体现,诸如:发圈、点赞、留言等,都能侧面的反应一个人的生活、工作、心态、爱好、修养、上进心、努力程度等。

    今天就跟着 汤老师 一起来揭秘微信朋友圈,利用 Python+AI人工智能 进行多角度分析,一起看透你的“朋友圈”。

    我们将使用Python抓取朋友圈数据,并对获取到的数据进行全面分析,包含好友性别、地理位置分布、个性签名、备注名、好友类型等,逐一进行分析,同时还会使用人脸识别技术对好友头像进行分析,分析到你怀疑人生。。。。。。

    整个过程分为四步:

    1. 获取数据
    2. 处理数据
    3. 存储数据
    4. 数据可视化

    一、获取数据

    ​ 关于微信好友数据的获取,可以通过itchat库,itchat是一个开源的微信个人号的接口,可以实现信息收发、获取好友列表等功能。

    ​ 具体的用法和说明,在代码中已经做了详细的注释。

    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    __author__ = '汤小洋'
    
    # 导入itchat模块,操作微信个人号的接口
    import itchat
    
    # 获取数据
    def get_data():
        # 扫描二维码登陆微信,实际上就是通过网页版微信登陆
        itchat.auto_login()
        # 获取所有好友信息
        friends = itchat.get_friends(update=True)  # 返回一个包含用户信息字典的列表
        return friends
    
    if __name__ == '__main__':
        print(get_data())

    ​ 执行代码时电脑屏幕会出现一个二维码,手机微信扫描后即可完成登陆

    微信好友大揭秘,使用Python抓取朋友圈数据,通过人脸识别全面分析好友,一起看透你的“朋友圈”

    二、处理数据

    ​ 对获取的数据进行处理,筛选出需要的数据。

    ​ 通过对返回的用户信息进行分析,发现列表中第一个元素是用户自己,可以排除掉。同时我们只取需要的字段数据,各个字段及其取值的含义已在代码中做了说明。

    # 处理数据
    def parse_data(data):
        friends = []
        for item in data[1:]:  # 第一个元素是自己,排除掉
            friend = {
                'NickName': item['NickName'],  # 昵称
                'RemarkName': item['RemarkName'],  # 备注名
                'Sex': item['Sex'],  # 性别:1男,2女,0未设置
                'Province': item['Province'],  # 省份
                'City': item['City'],  # 城市
                'Signature': item['Signature'].replace('\n', ' ').replace(',', ' '),  # 个性签名(处理签名内容换行的情况)
                'StarFriend': item['StarFriend'],  # 星标好友:1是,0否
                'ContactFlag': item['ContactFlag']  # 好友类型及权限:1和3好友,259和33027不让他看我的朋友圈,65539不看他的朋友圈,65795两项设置全禁止
            }
            print(friend)
            friends.append(friend)
        return friends
    
    if __name__ == '__main__':
        print(parse_data(get_data()))

    三、存储数据

    ​ 为了便于分析数据并进行可视化操作,这里将数据存储到文本文件中。

    # 存储数据,存储到文本文件
    def save_to_txt():
        friends = parse_data(get_data())
        for item in friends:
            with open('friends.txt', mode='a', encoding='utf-8') as f:
                f.write('%s,%s,%d,%s,%s,%s,%d,%d\n' % (
                    item['NickName'], item['RemarkName'], item['Sex'], item['Province'], item['City'], item['Signature'],
                    item['StarFriend'], item['ContactFlag']))
    
    if __name__ == '__main__':
        save_to_txt()

    重要说明:这里我获取的是自己的微信好友数据(共计950条,因工作关系,好友数比较多),考虑到个人隐私,部分信息做了处理。

    微信好友大揭秘,使用Python抓取朋友圈数据,通过人脸识别全面分析好友,一起看透你的“朋友圈”

    四、数据可视化

    ​ 这里使用的是pyecharts,pyecharts是一个用于生成Echarts图表的类库,便于在Python中根据数据生成可视化的图表。

    ​ Echarts是百度开源的一个数据可视化JS库,主要用于数据可视化。

    ​ 参考:http://pyecharts.org/

    # 安装pyecharts
    pip install pyecharts 

    1. 好友性别分析

    ​ 代码实现:

    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    __author__ = '汤小洋'
    
    # 导入Pie组件,用于生成饼图
    from pyecharts import Pie
    
    # 获取所有性别
    sex = []
    with open('friends.txt', mode='r', encoding='utf-8') as f:
        rows = f.readlines()
        for row in rows:
            sex.append(row.split(',')[2])
    # print(sex)
    
    # 统计每个性别的数量
    attr = ['帅哥', '美女', '未知']
    value = [sex.count('1'), sex.count('2'), sex.count('0')]
    
    pie = Pie('好友性别比例', '好友总人数:%d' % len(sex), title_pos='center')
    pie.add('', attr, value, radius=[30, 75], rosetype='area', is_label_show=True,
            is_legend_show=True, legend_top='bottom')
    # pie.show_config()
    pie.render('好友性别比例.html') 

    可视化结果:

    好友主要为男性,占比70%,男女比例严重失衡

    微信好友大揭秘,使用Python抓取朋友圈数据,通过人脸识别全面分析好友,一起看透你的“朋友圈”

    看到这个结果,我是有些淡淡忧桑的,微信好友总人数为950,帅哥占比70.42%,美女占比24.53%,男女比例严重失衡,但一点也不意外,本人是一名IT工作者,平时喜欢跑步,所以工作、生活接触到的大部分都是男性朋友,出现男女比例失衡实属正常。

    2. 好友位置分析

    pyecharts v0.3.2以后,pyecharts 将不再自带地图 js 文件。如用户需要用到地图图表,可自行安装对应的地图文件包。

    # 安装地图文件包
    pip install echarts-china-provinces-pypkg # 中国省、市、县、区地图
    pip install echarts-china-cities-pypkg
    pip install echarts-china-counties-pypkg
    pip install echarts-china-misc-pypkg 
    pip install echarts-countries-pypkg # 全球国家地图
    pip install echarts-united-kingdom-pypkg

    代码实现:

    # 导入Counter类,用于统计值出现的次数
    from collections import Counter
    # 导入Geo组件,用于生成地理坐标类图
    from pyecharts import Geo
    import json
    # 导入Bar组件,用于生成柱状图
    from pyecharts import Bar
    
    # 数据可视化
    def render():
        # 获取所有城市
        cities = []
        with open('friends.txt', mode='r', encoding='utf-8') as f:
            rows = f.readlines()
            for row in rows:
                city = row.split(',')[4]
                if city != '':  # 去掉城市名为空的值
                    cities.append(city)
    
        # 对城市数据和坐标文件中的地名进行处理
        handle(cities)
    
        # 统计每个城市出现的次数
        data = Counter(cities).most_common()  # 使用Counter类统计出现的次数,并转换为元组列表
        print(data)
    
        # 根据城市数据生成地理坐标图
        geo = Geo('好友位置分布', '', title_color='#fff', title_pos='center', width=1200, height=600,
                  background_color='#404a59')
        attr, value = geo.cast(data)
        geo.add('', attr, value, visual_range=[0, 500],
                visual_text_color='#fff', symbol_size=15,
                is_visualmap=True, is_piecewise=True)
        geo.render('好友位置分布.html')
    
        # 根据城市数据生成柱状图
        data_top20 = Counter(cities).most_common(20)  # 返回出现次数最多的20条
        bar = Bar('好友所在城市TOP20', '', title_pos='center', width=1200, height=600)
        attr, value = bar.cast(data_top20)
        bar.add('', attr, value, is_visualmap=True, visual_text_color='#fff', is_more_utils=True,
                is_label_show=True)
        bar.render('好友所在城市TOP20.html')
    

    出现的问题:

    • 报错:ValueError: No coordinate is specified for xxx(地名)

    • 原因:pyecharts的坐标文件中没有该地名,实际上是名称不一致导致的,如数据中地名为'达州',而坐标文件中为'达州市'

      坐标文件所在路径:项目/venv/lib/python3.6/site-packages/pyecharts/datasets/city_coordinates.json

    • 解决:修改坐标文件,在原位置下复制个同样的,然后修改下地名
    {
      "南京市": [
        107.5,
        31.22
      ],
       "南京": [
        107.5,
        31.22
      ],
    }  

    不过由于要修改的地名太多,上面的方法实在是麻烦,所以我定义了一个函数,用来处理地名数据找不到的问题

    # 处理地名数据,解决坐标文件中找不到地名的问题
    def handle(cities):
        # print(len(cities), len(set(cities)))
    
        # 获取坐标文件中所有地名
        data = None
        with open(
                '/Users/wangbo/PycharmProjects/python-spider/venv/lib/python3.6/site-packages/pyecharts/datasets/city_coordinates.json',
                mode='r', encoding='utf-8') as f:
            data = json.loads(f.read())  # 将str转换为json
    
        # 循环判断处理
        data_new = data.copy()  # 拷贝所有地名数据
        for city in set(cities):  # 使用set去重
            # 处理地名为空的数据
            if city == '':
                while city in cities:
                    cities.remove(city)
            count = 0
            for k in data.keys():
                count += 1
                if k == city:
                    break
                if k.startswith(city):  # 处理简写的地名,如 达州市 简写为 达州
                    # print(k, city)
                    data_new[city] = data[k]
                    break
                if k.startswith(city[0:-1]) and len(city) >= 3:  # 处理行政变更的地名,如县改区 或 县改市等
                    data_new[city] = data[k]
                    break
            # 处理不存在的地名
            if count == len(data):
                while city in cities:
                    cities.remove(city)
    
        # print(len(data), len(data_new))
    
        # 写入覆盖坐标文件
        with open(
                '/Users/wangbo/PycharmProjects/python-spider/venv/lib/python3.6/site-packages/pyecharts/datasets/city_coordinates.json',
                mode='w', encoding='utf-8') as f:
            f.write(json.dumps(data_new, ensure_ascii=False))  # 将json转换为str

    可视化结果:

    好友主要集中在江苏及周边地区

    微信好友大揭秘,使用Python抓取朋友圈数据,通过人脸识别全面分析好友,一起看透你的“朋友圈”

    微信好友大揭秘,使用Python抓取朋友圈数据,通过人脸识别全面分析好友,一起看透你的“朋友圈”

    从图中可以发现:我的微信好友主要集中在江苏及周边地区,本人大学读书时来到南京,现在工作生活也一直在南京,所以南京好友最多,为483个;我自小在徐州长大,所以徐州好友数量也较多;同时因为喜欢跑步,结识了许多跑友,也经常会到周边沿海城市参加各种马拉松活动,所以好友位置主要分布在沿海一带。

    3. 个性签名词云图

    ​ jieba是一个基于Python的分词库,完美支持中文分词,功能强大

    pip install jieba

    ​ Matplotlib是一个Python的2D绘图库,能够生成高质量的图形,可以快速生成绘图、直方图、功率谱、柱状图、误差图、散点图等

    pip install matplotlib

    ​ wordcloud是一个基于Python的词云生成类库,可以生成词云图

    pip install wordcloud

    ​ 代码实现:

    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    __author__ = '汤小洋'
    
    # 导入jieba模块,用于中文分词
    import jieba
    # 导入matplotlib,用于生成2D图形
    import matplotlib.pyplot as plt
    # 导入wordcount,用于制作词云图
    from wordcloud import WordCloud, STOPWORDS
    
    # 获取所有个性签名
    signatures = []
    with open('friends.txt', mode='r', encoding='utf-8') as f:
        rows = f.readlines()
        for row in rows:
            signature = row.split(',')[5]
            if signature != '':
                signatures.append(signature)
    
    # 设置分词
    split = jieba.cut(str(signatures), cut_all=False)  # False精准模式分词、True全模式分词
    words = ' '.join(split)  # 以空格进行拼接
    # print(words)
    
    # 设置屏蔽词,去除个性签名中的表情、特殊符号等
    stopwords = STOPWORDS.copy()
    stopwords.add('span')
    stopwords.add('class')
    stopwords.add('emoji')
    stopwords.add('emoji1f334')
    stopwords.add('emoji1f388')
    stopwords.add('emoji1f33a')
    stopwords.add('emoji1f33c')
    stopwords.add('emoji1f633')
    
    # 导入背景图
    bg_image = plt.imread('bg.jpg')
    
    # 设置词云参数,参数分别表示:画布宽高、背景颜色、背景图形状、字体、屏蔽词、最大词的字体大小
    wc = WordCloud(width=1024, height=768, background_color='white', mask=bg_image, font_path='STKAITI.TTF',
                   stopwords=stopwords, max_font_size=400, random_state=50)
    # 将分词后数据传入云图
    wc.generate_from_text(words)
    plt.imshow(wc)  # 绘制图像
    plt.axis('off')  # 不显示坐标轴
    # 保存结果到本地
    wc.to_file('个性签名词云图.jpg')

    可视化结果:

    充满正能量、努力生活

    ​ 个性签名可以反映人的一种心态,对所有好友的个性签名进行分词后制作如下词云图:

    微信好友大揭秘,使用Python抓取朋友圈数据,通过人脸识别全面分析好友,一起看透你的“朋友圈”

    ​ 从词云图中可以看到,微信好友个性签名中出现频率较高的词汇有:自己、努力、生活、世界、就是、我们、人生、没有、需要、不要、时间、一切、一起、永远、未来、运动、快乐、温柔、个性等,整体来看,我的微信好友还是充满正能量的,都是积极向上、努力生活、有个性的年青人。

    ​ 我们可以来详细的分析下这些高频词:

    • 自己、就是、我们、个性:彰显个性的自我、自以为是、自大等,也说明了年青人的个性张扬、无所畏惧
    • 努力、生活、时间、需要:说明大家都在努力的工作,追求各自所需,为更好的生活拼博着
    • 世界、人生、快乐、未来:正所谓“世界那么大,我想去看看”,生活虽不易,但对外面的世界、对人生的追求从未停止过,快乐最重要
    • 运动、健康、温柔、享受:说明喜欢运动的朋友比较多,大家都越来越关注健康。温柔、享受也成为共识,活着不易,且活且享受。

    4. 备注名词云图

    ​ 获取好友的备注名,根据备注名生成词名图

    ​ 代码实现:

    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    __author__ = '汤小洋'
    
    # 导入jieba模块,用于中文分词
    import jieba
    # 导入matplotlib,用于生成2D图形
    import matplotlib.pyplot as plt
    # 导入wordcount,用于制作词云图
    from wordcloud import WordCloud, STOPWORDS
    
    # 获取备注名
    remarkNames = []
    with open('friends.txt', mode='r', encoding='utf-8') as f:
        rows = f.readlines()
        for row in rows:
            remarkName = row.split(',')[1]
            if remarkName != '':
                remarkNames.append(remarkName)
    
    # 设置分词
    split = jieba.cut(str(remarkNames), cut_all=False)  # False精准模式分词、True全模式分词
    words = ' '.join(split)  # 以空格进行拼接
    print(words)
    
    # 导入背景图
    bg_image = plt.imread('bg.jpg')
    
    # 设置词云参数,参数分别表示:画布宽高、背景颜色、背景图形状、字体、屏蔽词、最大词的字体大小
    wc = WordCloud(width=1024, height=768, background_color='white', mask=bg_image, font_path='STKAITI.TTF',
                   max_font_size=400, random_state=50)
    # 将分词后数据传入云图
    wc.generate_from_text(words)
    plt.imshow(wc)  # 绘制图像
    plt.axis('off')  # 不显示坐标轴
    # 保存结果到本地
    wc.to_file('备注名词云图.jpg')

    可视化结果:

    好友备注中“跑友”、“南航”出现的频率最高

    微信好友大揭秘,使用Python抓取朋友圈数据,通过人脸识别全面分析好友,一起看透你的“朋友圈”

    ​ 从图中可以看出,我的好友备注中出现的高频词有:跑友、南航、wbs17091、wbs18031、wbs17022、wbs17071等

    • 本人平时喜欢跑步,也经常参加各种马拉松活动,认识的跑友比较多,所以不足为奇
    • 由于工作上与南航有一定的交集,所以南航的好友也比较多
    • 以wbs开头的备注都是我工作中带过的学生,数量众多,身为一名IT教育工作者,深感光荣。

      重要说明:考虑个人隐私,图中部分姓名做了化名处理,请勿当真,如有不便,还望谅解。

    5. 好友分类分析

    ​ 根据备注名,对好友进行分类,统计各类好友的数量

    ​ PS:我的习惯是对好友添加备注,标记好友的类型或来源,这属于个人洁癖的一种吧

    ​ 代码实现:

    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    __author__ = '汤小洋'
    
    # 导入jieba模块,用于中文分词
    import jieba
    # 导入Counter类,用于统计值出现的次数
    from collections import Counter
    from pyecharts import Bar
    
    # 获取备注名
    remarkNames = []
    with open('friends.txt', mode='r', encoding='utf-8') as f:
        rows = f.readlines()
        for row in rows:
            remarkName = row.split(',')[1]
            if remarkName != '':
                remarkNames.append(remarkName)
    
    # 设置分词
    words = [x for x in jieba.cut(str(remarkNames), cut_all=False) if x not in ['-', ',', '(', ')', '(', ')', ' ', "'"]]  # 排除短横线、逗号、空格、单引号
    data_top10 = Counter(words).most_common(10)  # 返回出现次数最多的20条
    print(data_top10)
    
    bar = Bar('好友分类TOP10', '', title_pos='center', width=1200, height=600)
    attr, value = bar.cast(data_top10)
    bar.add('', attr, value, visual_range=[0, 200], is_visualmap=True, is_label_show=True)
    bar.render('好友分类TOP10.html')

    可视化结果:

    学生最多,其次是跑友

    微信好友大揭秘,使用Python抓取朋友圈数据,通过人脸识别全面分析好友,一起看透你的“朋友圈”

    这里只统计好友分类数量最多的前10,其中跑友160人,南航52人,其他的都是wbs开头的学生,实际上wbs开头的学生数是最多的,只是在备注时按班级号进行了划分。

    通过分析统计,自己对各类好友的数量也做到了心中有数。

    6. 特殊好友分析

    ​ 获取并统计以下的特殊好友:星标好友不让他看我的朋友圈不看他的朋友圈

    ​ 代码实现:

    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    __author__ = '汤小洋'
    from pyecharts import Bar
    
    # 获取特殊好友
    star_list = []  # 星标朋友
    deny_see_list = []  # 不让他看我的朋友圈
    no_see_list = []  # 不看他的朋友圈
    
    with open('friends.txt', mode='r', encoding='utf-8') as f:
        rows = f.readlines()
        for row in rows:
            # # 获取好友名称
            name = row.split(',')[1] if row.split(',')[1] != '' else row.split(',')[0]
            # 获取星标朋友
            star = row.split(',')[6]
            if star == '1':
                star_list.append(name)
            # 获取设置了朋友圈权限的朋友
            flag = row.split(',')[7].replace('\n', '')
            if flag in ['259', '33027', '65795']:
                deny_see_list.append(name)
            if flag in ['65539', '65795']:
                no_see_list.append(name)
    
    print('星标好友:', star_list)
    print('不让他看我的朋友圈:', deny_see_list)
    print('不看他的朋友圈:', no_see_list)
    
    attr = ['星标朋友', '不让他看我的朋友圈', '不看他的朋友圈']
    value = [len(star_list), len(deny_see_list), len(no_see_list)]
    
    bar = Bar('特殊好友分析', '', title_pos='center')
    bar.add('', attr, value, is_visualmap=True, is_label_show=True)
    bar.render('特殊好友分析.html')

    可视化结果:

    特殊好友。。。你懂的

    微信好友大揭秘,使用Python抓取朋友圈数据,通过人脸识别全面分析好友,一起看透你的“朋友圈”

    从上图中可以发现:

    • 星标好友有4个,主要是特别关注的好友,个人觉得比较重要的朋友
    • 不让他看我的朋友圈有30个,这类好友一般是比较陌生的人,了解较少,当然也有个别是觉得不太方便的
    • 不看他的朋友圈有8个,这类基本上都是只在朋友圈发广告的,除了广告没有别的内容,而且每次连续性的发多条,看着确实有些烦

    补充说明:在代码中有对特殊好友的姓名也进行了输出显示,大家在运行代码时可以在控制台查看特殊好友具体是谁

    7. 好友头像分析

    ​ 使用腾讯优图提供的人脸识别技术,对头像进行检测和分析,相关API接口及使用请参考:https://open.youtu.qq.com/legency/#/develop/new-join

    ​ 首先获取所有好友的头像:

    import itchat
    import os
    
    # 获取数据
    def get_image():
        itchat.auto_login()
        friends = itchat.get_friends(update=True)
    
        #  在当前位置创建一个用于存储头像的目录headImages
        base_path = 'headImages'
        if not os.path.exists(base_path):
            os.mkdir(base_path)
    
        # 获取所有好友头像
        for friend in friends:
            img_data = itchat.get_head_img(userName=friend['UserName'])  # 获取头像数据
            img_name = friend['RemarkName'] if friend['RemarkName'] != '' else friend['NickName']
            img_file = os.path.join(base_path, img_name + '.jpg')
            print(img_file)
            with open(img_file, 'wb') as file:
                file.write(img_data)
    
    if __name__ == '__main__':
        get_data()          

    ​ 对头像进行人脸检测,检测头像图片中是否存在人脸,统计使用人脸作用头像的占比。

    补充说明:

    • 使用腾讯优图相关服务需要在其平台上申请开发者账户,并获取审核后的密钥,具体步骤参考官网
    • 在进行人脸检测时速度会比较慢,头像数量不同需要等待的时间也会有所不同,我的好友有900多,大概花了10分钟左右
    # 导入腾讯优图,用来实现人脸检测等功能
    import TencentYoutuyun
    from pyecharts import Pie
    
    def analyse_data():
        # 向腾讯优图平台申请的开发密钥,此处需要替换为自己的密钥
        appid = '********'
        secret_id = '************************'
        secret_key = '************************'
        userid = '********'
    
        end_point = TencentYoutuyun.conf.API_YOUTU_END_POINT  # 优图开放平台
        youtu = TencentYoutuyun.YouTu(appid, secret_id, secret_key, userid, end_point)
    
        use_face = 0
        not_use_face = 0
    
        base_path = 'headImages'
        for file_name in os.listdir(base_path):
            result = youtu.DetectFace(os.path.join(base_path, file_name))  # 人脸检测与分析
            # print(result)  # 参考 https://open.youtu.qq.com/legency/#/develop/api-face-analysis-detect
            # 判断是否使用人像
            if result['errorcode'] == 0:  # errorcode为0表示图片中存在人像
                use_face += 1
                gender = '男' if result['face'][0]['gender'] >= 50 else '女'
                age = result['face'][0]['age']
                beauty = result['face'][0]['beauty']  # 魅力值
                glasses = '不戴眼镜 ' if result['face'][0]['glasses'] == 0 else '戴眼镜'
                # print(file_name[:-4], gender, age, beauty, glasses, sep=',')
                with open('header.txt', mode='a', encoding='utf-8') as f:
                    f.write('%s,%s,%d,%d,%s\n' % (file_name[:-4], gender, age, beauty, glasses))
            else:
                not_use_face += 1
    
        attr = ['使用人脸头像', '未使用人脸头像']
        value = [use_face, not_use_face]
        pie = Pie('好友头像分析', '', title_pos='center')
        pie.add('', attr, value, radius=[30, 75], is_label_show=True,
                is_legend_show=True, legend_top='bottom')
        # pie.show_config()
        pie.render('好友头像分析.html')
    
    if __name__ == '__main__':
        analyse_data()

    可视化结果:

    使用人脸头脸的好友并不算多,占比31%

    微信好友大揭秘,使用Python抓取朋友圈数据,通过人脸识别全面分析好友,一起看透你的“朋友圈”

    从上图中可以看到,使用人脸头像的好友并不多,占比30.87%,大部分都未使用人脸头像,占比69.13%,从某个角度可以反应出这部分人不愿过多的暴露自己,或是对自我颜值的不自信,具体情况要看个人的心态了。

    对于使用人脸头像的,还可以检测图片中人脸的性别、年龄、魅力值、是否戴眼镜等(考虑到个人隐私,部分信息做了处理)。

    微信好友大揭秘,使用Python抓取朋友圈数据,通过人脸识别全面分析好友,一起看透你的“朋友圈”

    我们还可以将所有头像拼接在一起,生成一个微信好友头像拼接图:

    # 拼接头像
    def join_image():
        base_path = 'headImages'
        files = os.listdir(base_path)
        each_size = int(math.sqrt(float(640 * 640) / len(files)))
        lines = int(640 / each_size)
        image = Image.new('RGB', (640, 640))
        x = 0
        y = 0
        for file_name in files:
            img = Image.open(os.path.join(base_path, file_name))
            img = img.resize((each_size, each_size), Image.ANTIALIAS)
            image.paste(img, (x * each_size, y * each_size))
            x += 1
            if x == lines:
                x = 0
                y += 1
        image.save('all.jpg')
        itchat.send_image('all.jpg', 'filehelper')
    

    生成的头像拼接图,有密集恐惧症的请跳过 ^_^
    微信好友大揭秘,使用Python抓取朋友圈数据,通过人脸识别全面分析好友,一起看透你的“朋友圈”

    附:
    Python基础入门视频课程:http://edu.51cto.com/course/14859.html
    Python爬虫视频课程:http://edu.51cto.com/course/14870.html

    转载于:https://blog.51cto.com/12402007/2178703

    展开全文
  • 同学早已年薪百万 为何你却还在朋友圈集赞?

    万次阅读 多人点赞 2018-03-27 00:00:00
    我们经常在朋友圈中看到有人发这样的消息:或者,许久不联系的好友突然发消息说:「帮忙朋友圈第一条点赞~谢谢~」这样的朋友圈消息屡见不鲜,他们无非是想兑换一些不值钱的小奖品,来满足自己「占便宜」的心理。...
  • 不知从何时起,我们的生活离不开微信,每天睁开眼的第一件事就是打开微信,关注着朋友圈里好友的动态,而朋友圈中或虚或实的状态更新,似乎都在证明自己的“有趣”,寻找那份或有或的存在感。 有人选择在朋友...
  • * 动画顺畅切换到查看状态,同样动画顺畅退出查看界面 * 左右滑动多图查看 * 仿微信下拽退出 示例下载 在 previews文件夹下 app-debug.apkapp-debug.apk 对比之前1.0.3, 修复-宽高计算错误导致起始图片位置...
  • 先看效果图:适用listview recycleview 滑动流畅,BUG上代码,直接写在adapter里private final int MAX_LINE_COUNT = 3;//最大显示行数 private final int STATE_UNKNOW = -1;//未知状态 private final int ...
  • 动画顺畅切换到查看状态,同样动画顺畅退出查看界面 左右滑动多图查看 仿微信下拽退出     对比之前1.0.3, 修复-宽高计算错误导致起始图片位置显示错误。 优化-取消了意义的旋转,提示下拽体验(放大且图片...
  • 不停地刷朋友圈,一遍又一遍,甚至都不知道为什么要刷,但就是停不下来。 玩过干百遍的游戏,还是继续玩,好像找到一丝快感,又好像什么感觉都没有,但就是不停玩。 看过N集肥皂剧,各种类型的剧情和对白早已烂熟...
  • 一、feed流可以理解为一个发布订阅业务,典型业务是微博(朋友圈)。你关注了姚晨的微博,姚晨发布了消息,你的主页能看到她最新发布的消息,这个场景是推送,还是拉取呢?画外音:微博是弱关系,关注无需对方同意,...
  • 向图找环DFS

    千次阅读 2019-01-28 16:35:42
    //小朋友的崇拜 //有向图找环 dfs using namespace std; int map[100][100]={0}; //邻接矩阵 int visit[100]={0}; // 状态数组 int path[100]; //环的元素 int m=0; int v=30; //点的个数 ...
  • 基于Python实现的微信好友数据分析

    千次阅读 2018-03-27 00:00:00
    最近微信迎来了一次重要的更新,允许用户对”发现”页面进行定制。不知道从什么时候开始,微信朋友圈变得越来越复杂,当...有人选择在朋友圈里记录生活的点滴,有人选择在朋友圈里展示观点的异同,可归根到底,人们
  • 【算法】并查集如何理解。

    千次阅读 2013-12-04 10:37:35
    微信的朋友圈比广义上的并查集要稍微严格一些,因为它认为属于朋友圈的定义是这样的,假如A和B是朋友,B和C是好友,但是A和C并不认识,那么A和B,B和C自成一个朋友圈,相互关联。但是在并查集的定义中,认为关系具
  • 岛国人民这回终于能发明点正常的产品了! ...等到小编夜里翻来覆去睡不着的时候打开手机翻看朋友圈的时候,这才是真正的朋友圈好伐——各种晒美食的晒心灵鸡汤的晒恩爱的状态。 ...
  • 本文作者 TomorrowWu,原创文章,转载注明出处,博客...觉得好的话,顺手分享到朋友圈吧,感谢支持。 RESTful 无状态,采用URL+HTTP请求方法来描述资源和行为; 一般用在前后端分离项目中,后端提供REST接口给前端 GET:获取...
  • 这种设计模式有:命令模式中介者模式观察者模式状态模式策略模式一句话,5种设计模式:一个男人点开微信刷着朋友圈,刷着二手房中间发的二手房信息,然后点开二手房中介,给他发消息,询问上次看中的二手房购买...
  • 尤其是做小程序开发的时候,经常遇到将内容生成图片分享到朋友圈。这个开源项目就能够解决你的问题,可以将 html 转为图片,还可以转为 PDF ,还支持加水印。这个开源项目就是:Doctron,它是基于 Docker、无状态、...
  • 身边有不少人成天在朋友圈、在微博、在现实生活中抱怨自己(主要是工作上)这样累那样苦。这到底是希望放大自己的痛苦来获得怜悯同情甚至某种超越他人的快感(把比别人累和苦当作成就),还是纯粹为了宣泄一下而别...
  • 聊聊前端和后端

    2019-05-18 18:25:54
    是一种比朋友圈更加深度、全面的记录。有没有人来看其实都不是重点。嗯 其实很久没有更新,确实是更多的是话可说。有时候翻翻之前的大学时期的记录,感觉更有意思一些。现在工作了,理论上接触的知识的深度和广度...
  • 虽然周欢本人不是特别在意牛熊的交替,也经常跟圈子里的朋友说要珍惜熊市的机会抓紧时间多做事情。但是人终究是情绪的、利益的,很多人嘴上说着穿越牛熊、问西东,身体却在这漫漫熊市人困马乏,赚了钱的索性出去...
  • 前几年,网络上、饭桌前、朋友圈中相关内容的话题热度居高不下,风头一时二。 然而持续火热之后在2018年却屡遭质疑:“数字货币只是一场泡沫,终将破碎”的说法频繁出现。事实上这个说法也并非空穴来风,因为从...

空空如也

空空如也

1 2 3 4
收藏数 65
精华内容 26
关键字:

朋友圈无状态