当 python 遇到你的微信的时候,你才发现原来你的微信好友是这样的

206 阅读4分钟
原文链接: zhuanlan.zhihu.com

今天

小帅b来跟你玩玩

爬取微信好友

然后做一顿分析


其实

关于微信好友的爬取分析

挺早之前小帅b就分享过类似的了


但是那会

帅b我更多的是装逼

有些细节没跟你好好说说

导致有些 b 友有点懵逼



那么到现在

我想是个不错的时机了

到什么阶段就干什么事情



而且

前两篇也是写到和微信相关的

所以索性就再写一篇吧



这次

应该能让你更加容易

明白其中的道理



废话不多说

接下来就是


学习 python 的正确姿势





我们打开微信网页版本

https://wx2.qq.com



打开浏览器

可以看到一开始要

我们使用二维码登录



来看看究竟做了什么操作

打开浏览器的开发者模式






可以看到

一开始会得到一个二维码的图片


然后就开始

一顿轮询判断你是否扫码登录


我们点进去看一下

这个接口的具体请求


这个链接主要是携带了二维码的 uuid

以及一些必要的参数


    https://login.wx.qq.com/cgi-bin/mmwebwx-bin/login?loginicon=true&uuid=Yc5DKYxsrA==&tip=0&r=-215826228&_=1559288877820



    当我们没有扫码登录的时候

    返回的是 408







    接着打开手机的微信

    扫码之后就返回 201 了





    接着在手机点一下登录就可以进去了






    可以看到 getContact 这个接口

    一看名称就知道是获取联系人的







    看下返回的数据

    是一个 Json





    联系人被封装到这个 MemberList 数组里面了



    再来

    发个消息看看








    数据的同步







    至此

    我们已经摸清了

    微信网页版的具体流程了



    具体是这样的



    第一步

    打开微信网页版首页

    然后分配一个随机的 UUID



    第二步

    根据 UUID 获取二维码的图片



    第三步

    手机微信扫码这个二维码

    然后确认登录



    第四步

    浏览器一直不停的调用同一个接口

    看看是否登录

    登陆的话就开始调用登录接口



    第五步

    获取到所有联系人的信息



    第六步

    可以开始向联系人发送消息

    然后就不断的调用同步接口

    用来获取最新的消息









    知道了这些之后

    我们就可以使用 python 来操作微信了




    不过

    你不知道这些也没关系

    因为 itchat 模块早已封装了一切







    我们可以使用 itchat 来进行模拟登录

    然后获取到自己的好友信息







    调用 itchat 的 get_friends 就会得到

    好友的列表信息






    具体到每个 friend 是这样的







    可以看到

    每个 item 里面都有好友的具体信息

    包括昵称,头像,性别,地址等等



    其中的 sex 字段

    1 表示男的

    2 表示女的

    0 表示未知



    来分析一波吧

    将获得的 friends 这个列表中

    把 sex 这个字段的数据拿出来


    map(lambda x: x['Sex'], friends[1:])


    然后我们再将它转化为 list


    sexs = list(map(lambda x: x['Sex'], friends[1:]))


    有了 sexs 这个列表之后

    我们就可以通过 count 函数

    来获取每个性别的人数

    从而算出比例了


    比如男性所占的比例如下


    ('小哥哥', sexs.count(1)/sum)



    接着使用 pyecharts 这个模块的 Pie

    来画个饼图吧


    pie = Pie()
    pie.add("", [('小哥哥', sexs.count(1)/sum), ('小姐姐', sexs.count(2)/sum), ('未知', sexs.count(0)/sum)])
    pie.set_global_opts(title_opts=opts.TitleOpts(title="帅b的朋友性别比例"))
    pie.render('sex.html')


    运行一波









    知道真相的我

    眼泪掉下来







    咱也不知道

    还有多少是伪装成女的

    咱也不敢问呐







    再来分析个吧

    看看小帅b的py们都是在哪里的


    将 friends 列表里的 province 拿出来


    map(lambda x: x['Province'], friends[1:])


    再转化成 list

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



    接着创建两个列表


    keys = []
    values = []


    一个用来放省份的名称

    一个用来存放对应身份的数量


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


    接着就可以通过 zip 函数

    将两个列表的数据转化成元组序列


    lists = list(zip(keys, values))



    有了数据之后

    就可以通过 pyecharts 的 map 来整个地图了


    m = Map()
    m.add("小帅b的py们", lists, "china")
    m.set_global_opts(title_opts=opts.TitleOpts(title="小帅b的py们都在哪里?"), visualmap_opts=opts.VisualMapOpts(max_=200))
    m.render('location.html')


    运行一波







    可以发现

    广东人最多


    也是

    毕竟小帅b就是广东人







    然而

    全中国小帅b就差青海的 py 了

    如果你是青海的

    烦请添加我微信

    让我在全中国都有人罩着

    哈哈哈哈







    好了

    思路教给你了


    发挥你自己的想象力

    你可以去分析你的好友的其它东西

    套路就是这么个套路

    你也可以使用 itchat 来做个微信机器人...





    扫一扫

    学习 Python 没烦恼





    看了还想看


    python爬取 20w 表情包之后,从此你就成为了微信斗图届的高手


    python爬取你喜欢的公众号的所有原创文章,然后搞成PDF慢慢看


    ps

    非常感谢你的阅读

    如果文章对你有用

    还烦请你多多点赞


    那么我们下回见

    peace