python爬取微信好友数据,分析后我好像知道了些什么

375 阅读5分钟
原文链接: zhuanlan.zhihu.com

前言

每天都在使用微信,在移动互联网到来之时,腾讯内部组建了三支团队,同时开发同样的产品————微信,最后是广州做邮箱出身的团队赢了,杀入了移动互联网这片红海。

微信第一次出现在我们面前的时候,是在 2011 年,那时候更多人是使用 QQ ,对微信没什么好感,直到附近的人摇一摇这些约炮功能的出现,让人们爱不释手,如果说这是资本原罪,那么朋友圈这个功能的出现,着实满足了用户内心深处的窥探欲望,再到公众号的出现,微信已经牛的一批了。

我的微信好友中,有些朋友是熟悉的,有些朋友是不太熟悉的,比如看了我的文章或 blog 添加的我,不过没关系,在茫茫人海中相遇便是缘。那么我在想,把我的微信好友的数据用 Python 爬取下来,分析一下,应该会很有趣。

微信有个网页版的登录,那么可以从这里入手,有个牛逼的itchat模块,两行代码,就能让我们登录并且获取好友信息了:

# 微信登录
    itchat.auto_login(hotReload=True)
    friends = itchat.get_friends(update=True)

当我扫码登录完之后呢,就可以获取到我的好友数据了:



我微信好友中的性别比例

在返回的数据中,有一个叫做 Sex 的字段,就是性别,简单的分析可以知道 0未知 1男 2女 ,将所有好友中的性别数据提取出来,接着使用 matplotlib 画个饼图:

sexs = list(map(lambda x:x['Sex'],friends[1:]))
    counts = Counter(sexs).items()
    counts = sorted(counts, key=lambda x:x[0], reverse=False)
    counts = list(map(lambda x:x[1],counts))
    # 0未知 1男 2女
    labels = ['未知','小哥哥','小姐姐']
    colors = ['yellowgreen','darkslateblue','orangered']
    plt.figure(figsize=(8,5), dpi=80)
    plt.axes(aspect=1)
    plt.pie(counts,
            labels=labels,
            colors=colors,
            labeldistance = 1.1,
            autopct = '%3.1f%%',
            shadow = False,
            startangle = 90,
            pctdistance = 0.6
    )
    plt.legend(loc='upper right',)
    plt.title(u'%s的微信好友性别比例' % friends[0]['NickName'])
    plt.show()

得出结果:



挖槽,小哥哥那么多,我的妹纸们呢?女神呢?

不过想想,我的微信好友大多是程序员/破涕为笑,也就平复下心情了,妹纸快加我微信啊,让我的饼图好看一些 - -

我微信好友中的态度

微信有个个性签名的东西,每个人会把自己的座右铭,或者喜欢的话语写上,试着来分析一下我的好友中用到最多的词是什么,把语句进行结巴分词,然后搞一张云词出来,应该不错。

在获取到好友的数据中,有个 signature 的字段,就是好友的个签了,有些朋友会加上一些表情什么的,先把它们过滤掉,然后再使用 SnowNLP 分析,通过结巴分词分析完就可以用 wordcloud 生成云图了:

def analyseSignature(friends):
    signatures = ''
    emotions = []

    for friend in friends:
        # 获取好友的签名
        signature = friend['Signature']
        if (signature != None):
            # 过滤掉标签和表情
            signature = signature.strip().replace('span', '').replace('class', '').replace('emoji', '')
            signature = re.sub(r'1f(\d.+)', '', signature)

            if (len(signature) > 0):
                # 分析标签
                nlp = SnowNLP(signature)
                # 获取情绪值
                emotions.append(nlp.sentiments)
                # 结巴分析
                signatures += ' '.join(jieba.analyse.extract_tags(signature, 5))

    back_coloring = np.array(Image.open('baseketball.jpg'))
    wordcloud = WordCloud(
        ...
    )

    # 生成云词
    wordcloud.generate(signatures)
    plt.imshow(wordcloud)
    plt.axis("off")
    plt.show()
    wordcloud.to_file('signatures.jpg')

生成结果:



可以看得出来,我的朋友们还是挺正能量,努力,坚持,生活,人生是出现的比较多的词。多跟正能量的人在一起,互相传递能量,挺好。

我微信好友中的情感

SnowNLP 可以获取 sentiments,我理解为情绪值,从0到1,值越高说明越正能量,可以通过这个值,画一个图,看看我微信好友们的情感是怎么样的:

count_good = len(list(filter(lambda x: x > 0.66, emotions)))
    count_normal = len(list(filter(lambda x: x >= 0.33 and x <= 0.66, emotions)))
    count_bad = len(list(filter(lambda x: x < 0.33, emotions)))
    labels = [u'负能量', u'中性', u'正能量满满']
    values = (count_bad, count_normal, count_good)
    plt.rcParams['font.sans-serif'] = ['simHei']
    plt.rcParams['axes.unicode_minus'] = False
    plt.xlabel(u'情感判断')
    plt.ylabel(u'频数')
    plt.xticks(range(3), labels)
    plt.legend(loc='upper right', )
    plt.bar(range(3), values, color='rgb')
    plt.title(u'%s的微信好友签名信息情感分析' % friends[0]['NickName'])
    plt.show()

结果:


可以看到,负能量的人还是少数的,大多都正能量满满,我喜欢。

我微信好友都住在哪里

在返回的微信好友数据中,有一个 Province 字段,用来说明用户所处的省份,那么用这个字段,就可以统计出,我的微信好友在哪里,把这些数据统计出来,然后显示在中国地图上,应该会很直观,这里我使用到了 pyecharts 模块来进行地图可视化:

def analyseLocation(friends):
    keys = []
    values = []
    province = list(map(lambda x: x['Province'], friends[1:]))

    for i in set(province):
        keys.append(i)
        values.append(province.count(i))

    maps = Map("中国地图", '中国地图', width=1200, height=600)
    maps.add("", keys, values, visual_range=[0, 50], maptype='china', is_visualmap=True,
            visual_text_color='#000')
    maps.show_config()
    maps.render(path="localtion.html")

结果如下:



哇塞!我的好友快要遍布整个中国了,就差新疆,青海,宁夏,天津和宝岛台湾了,以后我是不是就不用学习数理化也可以走遍中国都不怕了哈哈哈!

ok~ 我主要从微信好友的性别,态度,情感和位置进行了分析,除了觉得我的微信好友中女生比较少之外,其它都挺不错的,继续努力,希望以后我的朋友们越来越牛逼!

ps:如果你也想分析下你的微信好友,想要获取源码的话可以在「学习python的正确姿势」公众号后台发送「微信」获取。

相关

  1. python3入门基础有趣的教程
  2. Python爬虫基础:爬取妹子图片并保存到本地
  3. python 爬虫应该学习什么知识点?
  4. python 爬取当当网最受欢迎的500本书