绘制人人好友关系图,绘制人人好友,依赖:networkx
绘制人人好友关系图,绘制人人好友,依赖:networkx
依赖:networkx matplotlib
#! /bin/env python# -*- coding: utf-8 -*-import urllibimport urllib2import cookielibimport reimport cPickle as pimport networkx as nximport matplotlib.pyplot as plt__author__ = """Reverland (lhtlyy@gmail.com)"""# Control parameters,EDIT it here## Loginusername = 'None'password = 'None'## Control Graphs, Edit for better graphs as you needlabel_flag = True # Whether shows labels.NOTE: configure your matplotlibrc for Chinese characters.remove_isolated = True # Whether remove isolated nodes(less than iso_level connects)different_size = True # Nodes for different size, bigger means more shared friendsiso_level = 10node_size = 40 # Default node sizedef login(username, password): """log in and return uid""" logpage = "http://www.renren.com/ajaxLogin/login" data = {'email': username, 'password': password} login_data = urllib.urlencode(data) cj = cookielib.CookieJar() opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) urllib2.install_opener(opener) res = opener.open(logpage, login_data) print "Login now ..." html = res.read() #print html # Get uid print "Getting user id of you now" res = urllib2.urlopen("http://www.renren.com/home") html = res.read() # print html uid = re.search("'ruid':'(\\d+)'", html).group(1) # print uid print "Login and got uid successfully" return uiddef getfriends(uid): """Get the uid's friends and return the dict with uid as key,name as value.""" print "Get %s 's friend list" % str(uid) pagenum = 0 dict1 = {} while True: targetpage = "http://friend.renren.com/GetFriendList.do?curpage=" + str(pagenum) + "&id=" + str(uid) res = urllib2.urlopen(targetpage) html = res.read() pattern = '<a href="http://www\\.renren\\.com/profile\\.do\\?id=(\\d+)"><img src="[\\S]*" alt="[\\S]*[\\s]\\((.*)\\)" />' m = re.findall(pattern, html) #print len(m) if len(m) == 0: break for i in range(0, len(m)): no = m[i][0] uname = m[i][1] #print uname, no dict1[no] = uname pagenum += 1 print "Got %s 's friends list successfully." % str(uid) return dict1def getdict(uid): """cache dict of uid in the disk.""" try: with open(str(uid) + '.txt', 'r') as f: dict_uid = p.load(f) except: with open(str(uid) + '.txt', 'w') as f: p.dump(getfriends(uid), f) dict_uid = getdict(uid) return dict_uiddef getrelations(uid1, uid2): """receive two user id, If they are friends, return 1, otherwise 0.""" dict_uid1 = getdict(uid1) if uid2 in dict_uid1: return 1 else: return 0def getgraph(username, password): """Get the Graph Object and return it.You must specify a Chinese font such as `SimHei` in ~/.matplotlib/matplotlibrc""" uid = login(username, password) dict_root = getdict(uid) # Get root tree G = nx.Graph() # Create a Graph object for uid1, uname1 in dict_root.items(): # Encode Chinese characters for matplotlib **IMPORTANT** # if you want to draw Chinese labels, uname1 = unicode(uname1, 'utf8') G.add_node(uname1) for uid2, uname2 in dict_root.items(): uname2 = unicode(uname2, 'utf8') # Not necessary for networkx if uid2 == uid1: continue if getrelations(uid1, uid2): G.add_edge(uname1, uname2) return Gdef draw_graph(username, password, filename='graph.txt', label_flag=True, remove_isolated=True, different_size=True, iso_level=10, node_size=40): """Reading data from file and draw the graph.If not exists, create the file and re-scratch data from net""" print "Generating graph..." try: with open(filename, 'r') as f: G = p.load(f) except: G = getgraph(username, password) with open(filename, 'w') as f: p.dump(G, f) #nx.draw(G) # Judge whether remove the isolated point from graph if remove_isolated is True: H = nx.empty_graph() for SG in nx.connected_component_subgraphs(G): if SG.number_of_nodes() > iso_level: H = nx.union(SG, H) G = H # Ajust graph for better presentation if different_size is True: L = nx.degree(G) G.dot_size = {} for k, v in L.items(): G.dot_size[k] = v node_size = [G.dot_size[v] * 10 for v in G] pos = nx.spring_layout(G, iterations=50) nx.draw_networkx_edges(G, pos, alpha=0.2) nx.draw_networkx_nodes(G, pos, node_size=node_size, node_color='r', alpha=0.3) # Judge whether shows label if label_flag is True: nx.draw_networkx_labels(G, pos, alpha=0.5) #nx.draw_graphviz(G) plt.show() return Gif __name__ == "__main__": G = draw_graph(username, password)#该片段来自于http://byrx.net
相关内容
- mysql数据导入到sqlite3中,数据导入sqlite3,家里的路由器
- 获取电影最新下载列表,获取电影最新下载,# coding=gb
- 打开文件对话框,,from tkinter
- Session for Tornado(Redis),tornadoredis,session id的生
- 使用python登录人人网并发表状态,python登录人人发表
- 使用Python解决FizzBuzz问题,python解决fizzbuzz,FizzBuzz问题描
- 文件夹对比,,买了个移动硬盘备份 但是
- 简单模拟编译前端过程,简单模拟编译过程,学了几天
- 文本文件常用工具,,common_lib/u
- 模拟登录人人网,模拟登录人人,from seleniu
评论关闭