我用 Python 爬取微信好友,最后发现一个大秘密

前言

你身处的环境是什么样,你就会成为什么样的人。现在人们日常生活基本上离不开微信,但微信不单单是一个即时通讯软件,微信更像是虚拟的现实世界。你所处的朋友圈是怎么样,慢慢你的思想也会变的怎么样。最近在学习 itchat,然后就写了一个爬虫,爬取了我所有的微信好友的数据。并对其中的一些数据进行分析,发现了一些很有趣的事。

Python 微信好友爬虫

此次的爬虫程序用到的库有很多,其中爬取微信数据用到的是 itchat。需要你先去下安装。安装完成以后,你就可以通过 itchat.login() 这个函数登陆你自己的微信。它回弹出一个网页登陆的二维码,你用手机扫描登陆即可。

然后通过 itchat.get_friends() 这个函数就可以获取到自己好友的相关信息,这些信息是一个 json 数据返回。然后我们就可以根据这些返回的信息,进行正则匹配抓取我们想要的信息,在进行分析。

import itchat itchat.login() #爬取自己好友相关信息, 返回一个json文件 friends = itchat.get_friends(update=True)[0:]

观察返回的数据,很容易就可以根据关键字发现性别是存放在一个字典里面,它的 key 是「Sex」,男性值为 1,女性为 2,其他是不明性别的(就是没有填的)。

在代码里我定义了一个函数 parse_friends() 通过一个 for 循环,把获取到的数据通过 for 循环保存到 text 字典里。然后再通过 draw() 函数画出柱状图。柱状图使用的是 plt 库。

def parse_friedns():
    itchat.login()
    text = dict()
    friedns = itchat.get_friends(update=True)[0:]
    print(friedns)
    male = "male"
    female = "female"
    other = "other"
 for i in friedns[1:]:
        sex = i['Sex']
 if sex == 1:
            text[male] = text.get(male, 0) + 1
 elif sex == 2:
            text[female] = text.get(female, 0) + 1
 else:
            text[other] = text.get(other, 0) + 1
    total = len(friedns[1:])
    print("男性好友: %.2f%%" % (float(text[male]) / total * 100) + "\n" +
 "女性好友: %.2f%%" % (float(text[female]) / total * 100) + "\n" +

 "不明性别好友: %.2f%%" % (float(text[other]) / total * 100))
    draw(text)
def draw(datas):
 for key in datas.keys():
        plt.bar(key, datas[key])

    plt.legend()
    plt.xlabel('sex')
    plt.ylabel('rate')
    plt.title("Gender of Alfred's friends")
    plt.show()

最后打印的结果:

不得不多说我微信的 1K 多的好友男女比列非常的不协调,男多女少啊。这让我回想起以前高中一个班 50 个人,女生就 7 个,然后我们班的女生从此就有一个女团称呼「七仙女」。

我的微信好友个性签名的词云图

为了进一步分析我的好友大致都有什么特征,我把好友的个性签名一起抓取,分析制作成词云。

个性签名是保存在 Signature 这个 key 中,由于有些签名包含些表情,最初抓取会变成 emoji、span、class 等等这些无关的词。所以需要先替换掉,另外,还有类似 <>/= 之类的符号,也需要写个简单的正则替换掉,再把所有拼起来,得到 text 字串。

    itchat.login()
    siglist = []
    friedns = itchat.get_friends(update=True)[1:]
 for i in friedns:
        signature = i["Signature"].strip().replace("span", "").replace("class", "").replace("emoji", "")
        rep = re.compile("1f\d+\w*|[<>/=]")
        signature = rep.sub("", signature)
        siglist.append(signature)
    text = "".join(siglist)

得到的数据最后保存到当前目录名为「text.txt」文本中。

    text = "".join(siglist)
 with io.open('text.txt', 'a', encoding='utf-8') as f:
        wordlist = jieba.cut(text, cut_all=True)
        word_space_split = " ".join(wordlist)
        f.write(word_space_split)
        f.close()

分析好友签名的函数我定义成:parse_signature(),完整代码如下:

def parse_signature():
    itchat.login()
    siglist = []
    friedns = itchat.get_friends(update=True)[1:]
 for i in friedns:
        signature = i["Signature"].strip().replace("span", "").replace("class", "").replace("emoji", "")
        rep = re.compile("1f\d+\w*|[<>/=]")
        signature = rep.sub("", signature)
        siglist.append(signature)
    text = "".join(siglist)
 with io.open('text.txt', 'a', encoding='utf-8') as f:
        wordlist = jieba.cut(text, cut_all=True)
        word_space_split = " ".join(wordlist)
        f.write(word_space_split)
        f.close()

抓取整理了签名的数据,接下来就是制作出词云。这里使用的是 wordCloud 来进行词云的制作。

词云的制作我定义了一个:draw_signature() 函数,完整代码如下

def draw_signature():
    text = open(u'text.txt', encoding='utf-8').read()
    coloring = np.array(Image.open('3.png'))
    my_wordcloud = WordCloud(background_color="white", max_words=2000,
                         mask=coloring, max_font_size=60, random_state=42, scale=2,
                         font_path="DroidSansFallbackFull.ttf").generate(text)
    image_colors = ImageColorGenerator(coloring)
    plt.imshow(my_wordcloud.recolor(color_func=image_colors))
    plt.imshow(my_wordcloud)
    plt.axis("off")
    plt.show()

运行上面的代码后得到了如下的图,由于好友数量比较多,我分别找了两张图制作出图云。

努力,奋斗,世界,生活,自己。这些词在我们 1K 多人的好友中出现的最多。大家都非常的优秀,都非常的上进。我想这也正是我为什么每天都在努力学习的原因,环境真的非常的影响一个人。

我的签名:人生必有痴,而有后成。现在的我痴迷于各种优秀的人,每天都在向他们学习。希望大家一生当中也有痴迷的一面。

完整的代码我已上传到 GitHub 上:

https://github.com/chihaiyishen/Python-Learning/tree/master/python%20%E7%88%AC%E8%99%AB/wechat

原文发布于微信公众号 - IT派(transfer_3255716726)

原文发表时间:2018-05-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏开发 & 算法杂谈

动态数据竞争验证方法(二)

之前提到的动态数据竞争验证方法尽管相比RaceFuzzer提高了验证的效率,但是仍然存在一个比较致命的问题就是执行程序一次只能够验证很少的一部分数据竞争。

2053
来自专栏Data Analysis & Viz

手把手教你完成一个数据科学小项目(3):数据异常与清洗

本系列将全面涉及本项目从爬虫、数据提取与准备、数据异常发现与清洗、分析与可视化等细节,并将代码统一开源在GitHub:DesertsX/gulius-proje...

1333
来自专栏QQ会员技术团队的专栏

Unity引擎与C#脚本简介

本文基于 Unity 游戏开发引擎,主要会讲两部分内容:第一部分简单讲讲游戏开发的原理,第二部分会聊聊 Unity 的 C# 游戏脚本。

1.4K9
来自专栏Python爬虫实战

Python爬虫之六:智联招聘进阶版

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

2601
来自专栏程序员的碎碎念

分享几个我经常用到的函数

同上一个推送一样,为了提高php开发的效率,在学习完一些零零碎碎的知识外,我们要学会的那就是总结与分享,学会封装类和函数,方便下次你再次敲此功能代码。在...

3776
来自专栏牛客网

阿里2017Java开发面经 暑期实习+秋招

秋招结束,总结了一下从寒假回来开始的实习生招聘和秋招面经,过来回馈一下牛客网。 1、一面 23分钟 看了你的博客,写的很多,介绍一个你研究最深入的领域吧 我说了...

4226
来自专栏编程

软件测试之Fuzzing和基于属性的测试

基于属性的测试技术,是指编写对你的代码来说为真的逻辑语句(即“属性”),然后使用自动化工具来生成测试输入(一般来说,是指某种特定类型的随机生成输入数据),并观察...

2380
来自专栏云计算D1net

干货:如何计算用户行为大数据

用户行为类数据是最常见的大数据形式,比如电信的通话记录、网站的访问日志、应用商店的app下载记录、银行的账户信息、机顶盒的观看记录、股票的交易记录、保险业的...

3515
来自专栏mathor

第五届蓝桥杯决赛B组C/C++——生物芯片

1827
来自专栏CDA数据分析师

深入对比数据科学工具箱:Python和R之争

概述 在真实的数据科学世界里,我们会有两个极端,一个是业务,一个是工程。偏向业务的数据科学被称为数据分析(Data Analysis),也就是A型数据科学。偏向...

2627

扫码关注云+社区

领取腾讯云代金券