绘制人人好友关系图,绘制人人好友,依赖: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

评论关闭