爬取并分析QQ好友的说说

写在前面


当你寂寞而闲着没有什么事可以干的时候,你就会好奇,别人正在交流什么。这个自己的小项目就是上一年(16年)的双11期间,别人都在陪人,或者打算买什么东西,我却在一个人。敲。代。。码。。。

对于这个这个项目,自己写着写着就感觉没什么了意思,因为不是自己经常做的领域,很多东西不在于难易,而是说无从下手,所以自己就慢慢地终止掉了。好在自己慢慢地养成在做项目的时候保持记录的习惯,很多关键点都记了下来,后面隔了这么一段时间又能较好的重新开始填上自己挖的坑。

之所以重新开始进行这个小项目,是因为受到自己在微博和知乎上看到的几篇文章,感觉很有意思。

用弹幕看一场NBA(公牛 - 老鹰)

你以为川普的推特都是他自己写的?数据可不这么认为!

赵雷“成都”火了之后,数据帝出手指导文青的美好未来

顿时也感觉自己其实可以“照虎画猫”,对比着别人分析的一些东西,自己按照自己的数据再分析一遍,想要实现更加新颖或更高级的的功能,总得先让程序跑起来。

这里写图片描述

实现过程


一. 爬取数据

我采用了Chrome扩展的形式,使用js爬取数据,这样的一个优点就是,可以使用Chrome扩展提供了Cookie相关的API,使得你可以直接获取你Chrome浏览器上任何一个站点的cookie信息。这样,只要你在当前浏览器上登录了QQ空间,并留下了登录的cookie,那么就可以直接利用该cookie来获取登录后的数据。于是就避免了模拟登录这种较为麻烦的事情。下面直接从具体的获取数据说起

1. 获取自己的QQ好友们的账号。

我通过QQ空间中的“好友首页”中的“我在意谁”这个排行榜获取的好友账号。但是有个缺点是,只能获取前200个。但是感觉也足够了,跟自己足够疏远的人就不要爬取了。

爬取的链接如下:

https://h5.qzone.qq.com/proxy/domain/r.qzone.qq.com/cgi-bin/tfriend/friend_ship_manager.cgi?uin=1059****&do=2&rd=0.8308968682967424&fupdate=1&clean=0&g_tk=******

其中有一个主要的参数:g_tk,这个在后面爬取每个好友的说说时也会用到,这个参数每次登录都会不同。那么它是如何得到的呐?这就用到了上面提到的cookie了,但是他并不是直接存放在cookie中的,而是由cookie中的p_skey再通过一定计算得到的。具体的计算函数要通过打断点运行的方式在网页的JS源代码中获得(可以参见网上的资料)。最后查到在index.js文件中有一个getToken的函数,负责将p_skey计算成g_tk。大致的形式如下:

getToken:function(url) {
    var hash = 5381, str;
    var a = document.createElement("a");
    a.href = url;
    if (url && a.hostname.indexOf("qzone.qq.com") >= 0) {
        str = cookie.get("p_skey") || cookie.get("skey");
    } else {
        str = cookie.get("skey");
    }
    for (var i = 0, len = str.length;i < len;++i) {
        hash += (hash << 5) + str.charAt(i).charCodeAt();
    }
    return hash & 2147*****;
}

我也不明白上面的5381以及最后hash与上的那个数是什么意思,以防万一泄露什么秘密,我还是打上码吧*_*

p_skey可以通过上面提到的Chrome Extension的API来获取:

chrome.cookies.get({'url':'https://h5.qzone.qq.com','name':'p_skey'}, function(cookie){
    console.log(cookie.value);
    var p_skey=cookie.value;
    g_tk=getToken(p_skey);
    callback(g_tk);
});
2. 获取每个好友的说说

在进行这一步时,可以有多种选择:

  1. 可以通过自己的主页,来获取好友展示出来的数据(但是经试验好像只能获取一个月以内左右);
  2. 也可以通过好友空间的“说说”面板获取(我采用这种方式);
  3. 或者通过好友的“主页”面板(这种方式获得的数量要比上一种方式要多,不知道为什么,可能是还包含了“分享”的东西)。

获取说说内容的链接形式如下:

http://h5.qzone.qq.com/proxy/domain/ic2.qzone.qq.com/cgi-bin/feeds/feed***

但是上面的连接只能获取说说的内容,以及评论等内容,无法获取点赞的相关信息,所以需要单独获取点赞的信息,数据获取链接形式如下:

https://h5.qzone.qq.com/proxy/domain/r.qzone.qq.com/cgi-bin/user/qz_opcnt2?_stp=14861111&unikey=http://user.qzone.qq.com/148***840/mood/785f7a589a9d45578

其中的unikey是每条说说的地址,可以在上面获取说说内容的时候获取到。

这样一条说说的基本信息如:发表的时间,内容,点赞数及人员,评论数及人员,我们都已经获取到了。↖(ω)↗

下面就是不断的根据第一步获取的好友列表中的好友去迭代了。但是需要注意的是:迭代的不能太快。不然的话会被腾讯封住的,而没有办法继续访问好友的空间,提示没有相应的权限,不过,一会就自己解封了。我没有一个个的去试,感觉设置每个请求的间隔为3s不会被封。

二. 分析数据

到了该项目最关键的地方,也是自己最没有头绪的地方了。

为了节省时间,我爬取了192个好友从16年10月1日到今天(17年2月8日)的进1100条说说(其中还有一些好友并没有对我开放空间权限,看不到她的说说,好伤心)ͼ(ݓ_ݓ)ͽ

  1. 每天发表说说的数量
    这里写图片描述

    上图是从10月1日到12月31日的每天发表的说说数量的统计柱状图。10月1日较高可以理解,刚放假;最后几天是靠近元旦,理应数量比较高。但是查了一下数据,不理解为什么中间有一个比较高的时间点,是在12月1日,这天有什么事吗?又看了下当天的说说,发现并没有什么特别,可能是一个同学发的广告发多了。。。。

  2. 按周每天发表的说说数量
    这里写图片描述

    按周为周期,每天发表说说的数量,可以看出周一周二最低,周六最高,周日次之。看来大家都是学生,刚周末时最欢腾、刚开学,最不活跃

  3. 每天中各个时间段发表说说的数量
    这里写图片描述

    可以看出大家都偏“夜猫子”,最活跃的点是在晚上10点左右,而且在下午两点左右发表的说说也比较少,应该是大家有午睡的习惯。整天的趋势是越来越活越,发表的说说是越来越多。

  4. 每周发表说说的数量
    这里写图片描述

    从2016年的第40周(这个没有统计完,10月1号是周六),到2017第6周(同样这周也没过完),中间有两个明显高的点,第一个看得出是靠近元旦的最后一周,第四周又比较高,可以猜的出,那是春节所在的一周。嗯都是热闹的日子。

    而且,我还发现一个有趣的现象,就是从第41周到51周左右,说说的数量有一个变化规律是先减少在增加然后再减少等波浪式,我猜测,41,45,48周应该在某个月的月初左右。查了一下,果然第41周是10月月初,45周是11月月初,48周是11月月末。难道因为月初大家可以获得新的流量包,有资本活跃发说说。。。请原谅我的穷酸@( ◕ x ◕ )@,哈哈,开个玩笑。

  5. 好友的关系网络

    boss来了,我感觉只是整个项目中最有意思的地方了
    刚用上微信就半年左右,我爸爸就觉得:只有跟你关系好的人才会看你的微信朋友圈,给你评论。。。(所以他现在每发个朋友圈都看看有没有人给他点赞)。所以我觉得可以通过说说的点赞及评论的信息来了解两位好友之间关系密切度。虽然我觉得微信比QQ更正式,更能反映出关系网,但是通过研究QQ好友的评论的方式还是可以了解他们间关系强弱的。

    所以使用一下规则:

    • 点赞:两者之间的关系 +1
    • 评论:两者之间的关系 +2

    其实可以根据自己的理解再进行细分,比如对方有没有回评,以及要不要区分A对B的点赞和B对A的点赞这两种关系。

    在初次实现的过程中,秉着“先让代码跑起来”的原则,选择了上面最简单的形式,并且不区分A对B和B对A,都把他们算到一个关系值上。

    采用的数据表现形式是关系图,此处墙裂推荐百度的**Echarts**,做比较常规的图表特别容易上手,可以在线制作,比较方便。

    将之前爬好的数据经过简单的分析就可以得到下面的关系图
    这里写图片描述

    其中:点表示一个QQ好友,两点间的连线表示这两个好友之间有过点赞或者评论,线的粗细表示关系的强弱。

    图中明显分为两大聚集,为有较强关系的群体。其中一个是我的高中同学们,一个是我的大学同学们。其余的几个圆点被孤立飘逸在外围,应该处于我的人际关系的边缘。虽然上面的关系图中并没有我自己的数据,但是有意思的是,高中同学群体和大学同学群体居然也能通过其他的人连接起来(°o°;),让我很是惊喜,查看了一下关系发现是我的一个高中学妹,而且人缘很广的那种,也是厉害了。
    这里写图片描述

结束


自己挖的坑终究还是自己去填,好在在大学最后一个寒假的最后一天前,已基本填平。可能还有很多细节还没有考虑到位,留到以后慢慢修。

元宵快乐*o*

  • 6
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值