/renren-relationship

人人好友关系

Primary LanguagePython

人人网好友关系图

恩,很大的题目,但做的很差。所以欢迎大家来fix

更新

2013-03-03

使用 graphviz 绘图, 但还保留了 networkx,使用它来删除节点和计算degree

现在运行 python local_graph.py 就会生成一张漂亮的关系图(现在还没有在图上标记用户名) 所以请确保计算机一正确安装 graphviz

debian系用户只要简单的运行下面的命令即可

sudo apt-get install graphviz

如何运行

  1. git clone 代码
  2. 安装 requirements.txt中的依赖,建议virtualenv
  3. cp account.example account 然后按照其中格式填写人人网帐号
  4. python local_graph.py

运行程序,一段时间后(不同的网络环境会导致抓取时间差异很大,在我这里一共用了40分钟) 程序正常退出。就会在目录中生成一张 result.png 图片。

renren_graphviz

下面是用 networkx 和 matplotlib生成的图片,新代码默认不再使用

renren

这是我校内好友的情况,可以看到这些好友明显是三个圈子:

  • 高中同学圈子
  • 大学同学圈子
  • 码农圈子

还有一些孤立(不属于这三个大圈子的同学)的好友,没有显示。

初衷

初衷总是美好的,当我随便试了几个陌生人后,发现一样可以查看他们的好友。于是我就想到了 两个玩法:

  1. 做一个网站,人们上来只要填写他的人人ID,就会动态的展现他的好友,好友之间的共同好友...
  2. 在一个网站上输入两个人人ID,然后找出这两个ID之间的好友链。

最有意思的是第二个,因为我相信像人人网这样的强关系网络,以及大量的用户,两个用户之间 肯定会有一条/多条好友链接。

端点 <-> A <-> B <-> C ...... X <-> Y <-> Z <-> 端点

当然这个也很难,没想到如何做,于是就做第一个想法。

美好的初衷是如何变成现在这个屌样的?

  1. 某晚,正在在爬好友测试的时候,发现总是爬不到一些人的好友。 然后才发现了一个悲剧的事实,(不过也是合理的):

    好友不是你想爬,想爬就能爬

    只有开放了对应权限的才能察看其好友。

    这下好了,上面的想法2彻底做不了了。想法1也退化成只能自娱自乐了。 也就是只能爬自己好友的好友了

  2. urllib2 怎么卡住呢?

    使用了gevent,我刚开始的模型是 对多个用户,以及同一个用户的好友, 都利用gevent的并发来爬, 测试了两次后, urllib2 无法 read, 到这里,一下卡住了。

    并发会卡住。顺序爬取很顺利,但太慢。 后来偶然发现,

    对同一个人不能并发的抓取, 但还可以对多个人并发

  3. 图太难看了

    本打算 angular.js + d3.js + gevent-socket.io 来动态的在web上绘图。 但心急,想看看能绘制出什么样的图,于是先用 networkx 和 matplotlib 来绘图

    然后才发现 绘制好友的共同好友 几乎不可能,点全部重叠在一起,看都没法看……

    然后又一次吊丝的退化到只显示自己的好友

    最后还花了几小时来调节 图像的显示 效果。。。

可能遇到的问题

怎么无法登录?

请确保你有一个 account 文件,里面第一行写用户名/email, 第二行写password

如果在确保 account 文件正确的情况下,程序还是无法登录,请用浏览器登录一次,再运行程序

显示一个 collect friends 后怎么就卡住呢?

其实不是卡住了,只是抓取好友比较慢,这时又没有输出,所以看着像卡住了,请耐心等待

最后的图太简单了吧,有什么意思吗?

我也不想这样啊,蛋疼,欢迎你来增强它的功能和效果

程序跑完后会报一个这样错误:

`Exception KeyError: KeyError(17784656,) in ignored...`

这个直接忽略掉,应该是某个库不是线程安全的。但这个对结果没有影响。