人人网好友关系图
恩,很大的题目,但做的很差。所以欢迎大家来fix
更新
2013-03-03
使用 graphviz 绘图, 但还保留了 networkx,使用它来删除节点和计算degree
现在运行 python local_graph.py
就会生成一张漂亮的关系图(现在还没有在图上标记用户名)
所以请确保计算机一正确安装 graphviz
debian系用户只要简单的运行下面的命令即可
sudo apt-get install graphviz
如何运行
- git clone 代码
- 安装 requirements.txt中的依赖,建议virtualenv
- cp account.example account 然后按照其中格式填写人人网帐号
- python local_graph.py
运行程序,一段时间后(不同的网络环境会导致抓取时间差异很大,在我这里一共用了40分钟) 程序正常退出。就会在目录中生成一张 result.png 图片。
下面是用 networkx 和 matplotlib生成的图片,新代码默认不再使用
这是我校内好友的情况,可以看到这些好友明显是三个圈子:
- 高中同学圈子
- 大学同学圈子
- 码农圈子
还有一些孤立(不属于这三个大圈子的同学)的好友,没有显示。
初衷
初衷总是美好的,当我随便试了几个陌生人后,发现一样可以查看他们的好友。于是我就想到了 两个玩法:
- 做一个网站,人们上来只要填写他的人人ID,就会动态的展现他的好友,好友之间的共同好友...
- 在一个网站上输入两个人人ID,然后找出这两个ID之间的好友链。
最有意思的是第二个,因为我相信像人人网这样的强关系网络,以及大量的用户,两个用户之间 肯定会有一条/多条好友链接。
端点 <-> A <-> B <-> C ...... X <-> Y <-> Z <-> 端点
当然这个也很难,没想到如何做,于是就做第一个想法。
美好的初衷是如何变成现在这个屌样的?
-
某晚,正在在爬好友测试的时候,发现总是爬不到一些人的好友。 然后才发现了一个悲剧的事实,(不过也是合理的):
好友不是你想爬,想爬就能爬
只有开放了对应权限的才能察看其好友。
这下好了,上面的想法2彻底做不了了。想法1也退化成只能自娱自乐了。 也就是只能爬自己好友的好友了
-
urllib2 怎么卡住呢?
使用了gevent,我刚开始的模型是 对多个用户,以及同一个用户的好友, 都利用gevent的并发来爬, 测试了两次后, urllib2 无法 read, 到这里,一下卡住了。
并发会卡住。顺序爬取很顺利,但太慢。 后来偶然发现,
对同一个人不能并发的抓取, 但还可以对多个人并发
-
图太难看了
本打算 angular.js + d3.js + gevent-socket.io 来动态的在web上绘图。 但心急,想看看能绘制出什么样的图,于是先用 networkx 和 matplotlib 来绘图
然后才发现 绘制好友的共同好友 几乎不可能,点全部重叠在一起,看都没法看……
然后又一次吊丝的退化到只显示自己的好友
最后还花了几小时来调节 图像的显示 效果。。。
可能遇到的问题
怎么无法登录?
请确保你有一个 account 文件,里面第一行写用户名/email, 第二行写password
如果在确保 account 文件正确的情况下,程序还是无法登录,请用浏览器登录一次,再运行程序
显示一个 collect friends 后怎么就卡住呢?
其实不是卡住了,只是抓取好友比较慢,这时又没有输出,所以看着像卡住了,请耐心等待
最后的图太简单了吧,有什么意思吗?
我也不想这样啊,蛋疼,欢迎你来增强它的功能和效果
程序跑完后会报一个这样错误:
`Exception KeyError: KeyError(17784656,) in ignored...`
这个直接忽略掉,应该是某个库不是线程安全的。但这个对结果没有影响。