In [1]:
import requests
import json
from github import Github
import networkx as nx
from operator import itemgetter
from collections import Counter
from networkx.readwrite import json_graph
import webbrowser
import os

In [4]:
ACCESS_TOKEN = '1161b718b9555cd76bf7ff9070c8f1ba300ea885'
USER = 'edx'
REPO = 'edx-documentation'
client = Github(ACCESS_TOKEN, per_page=100)
user = client.get_user(USER)
repo = user.get_repo(REPO)

stargazers = [ s for s in repo.get_stargazers() ] #可以先对这些人数进行分类>限制
print "关注人的数目: %d \n" % len(stargazers) #如果人数很多,速度很慢


关注人的数目: 29 


In [10]:
for s in repo.get_forks():
    print s.get_


---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-10-4e63fd4c9188> in <module>()
      1 for s in repo.get_forks():
----> 2     print s.user

AttributeError: 'Repository' object has no attribute 'user'

In [11]:
g = nx.DiGraph()
    g.add_node(repo.name + '(r)', type='repo', lang=repo.language, owner=user.login)

    for sg in stargazers:
        g.add_node(sg.login + '(u)', type='user')
        g.add_edge(sg.login + '(u)', repo.name + '(r)', type='gazes')
        print sg.login + '(u)'

    for i, sg in enumerate(stargazers):
        try:
            for follower in sg.get_followers():
                if follower.login + '(u)' in g:
                    g.add_edge(follower.login + '(u)', sg.login + '(u)', type='follows')
        except Exception, e:
            print "获取追随者失败,跳过", sg.login, e

        print "正在处理第", i+1, " 个关注者。"
    c = Counter([e[1] for e in g.edges_iter(data=True) if e[2]['type'] == 'follows'])
    popular_users = [(u, f) for (u, f) in c.most_common() if f > 1]
    print "受欢迎的用户数目:", len(popular_users)
    print "最受欢迎的10个用户:", popular_users[:10]


KellyChan(u)
mhoeber(u)
cycomachead(u)
rjgrubb(u)
jhendersonedx(u)
theuserofshift8(u)
martinproject(u)
rwanyoike(u)
duduOliver(u)
ghoster(u)
elitelinux(u)
lamagnifica(u)
foxty(u)
Petruzzo79(u)
bitifirefly(u)
jmeers(u)
sitdh(u)
Natshah(u)
igour(u)
wxb0712(u)
afeef(u)
xrzhao(u)
applecool(u)
michelmb(u)
andersonresende(u)
conroyiwhiwhu(u)
jacklee007(u)
gsw945(u)
Ginagie(u)
正在处理第 1  个关注者。
正在处理第 2  个关注者。
正在处理第 3  个关注者。
正在处理第 4  个关注者。
正在处理第 5  个关注者。
正在处理第 6  个关注者。
正在处理第 7  个关注者。
正在处理第 8  个关注者。
正在处理第 9  个关注者。
正在处理第 10  个关注者。
正在处理第 11  个关注者。
正在处理第 12  个关注者。
正在处理第 13  个关注者。
正在处理第 14  个关注者。
正在处理第 15  个关注者。
正在处理第 16  个关注者。
正在处理第 17  个关注者。
正在处理第 18  个关注者。
正在处理第 19  个关注者。
正在处理第 20  个关注者。
正在处理第 21  个关注者。
正在处理第 22  个关注者。
正在处理第 23  个关注者。
正在处理第 24  个关注者。
正在处理第 25  个关注者。
正在处理第 26  个关注者。
正在处理第 27  个关注者。
正在处理第 28  个关注者。
正在处理第 29  个关注者。

In [12]:
MAX_REPOS = 500

    for i, sg in enumerate(stargazers):
        print sg.login
        try:
            for starred in sg.get_starred()[:MAX_REPOS]: # Slice to avoid supernodes
                g.add_node(starred.name + '(r)', type='repo', lang=starred.language, owner=starred.owner.login)
                g.add_edge(sg.login + '(u)', starred.name + '(r)', type='gazes')
        except Exception, e: #ssl.SSLError:
            print "获取加星仓库失败 ", sg.login, "跳过."

        print "正在处理", i+1, "加星的仓库"
    filename = "1.1"
    nx.write_gpickle(g, filename)

    d = json_graph.node_link_data(g)
    filename = "1.json"
    json.dump(d, open(filename, 'w'))


KellyChan
正在处理 1 加星的仓库
mhoeber
正在处理 2 加星的仓库
cycomachead
正在处理 3 加星的仓库
rjgrubb
正在处理 4 加星的仓库
jhendersonedx
正在处理 5 加星的仓库
theuserofshift8
正在处理 6 加星的仓库
martinproject
正在处理 7 加星的仓库
rwanyoike
正在处理 8 加星的仓库
duduOliver
正在处理 9 加星的仓库
ghoster
正在处理 10 加星的仓库
elitelinux
正在处理 11 加星的仓库
lamagnifica
正在处理 12 加星的仓库
foxty
正在处理 13 加星的仓库
Petruzzo79
正在处理 14 加星的仓库
bitifirefly
正在处理 15 加星的仓库
jmeers
正在处理 16 加星的仓库
sitdh
正在处理 17 加星的仓库
Natshah
正在处理 18 加星的仓库
igour
正在处理 19 加星的仓库
wxb0712
正在处理 20 加星的仓库
afeef
正在处理 21 加星的仓库
xrzhao
正在处理 22 加星的仓库
applecool
正在处理 23 加星的仓库
michelmb
正在处理 24 加星的仓库
andersonresende
正在处理 25 加星的仓库
conroyiwhiwhu
正在处理 26 加星的仓库
jacklee007
正在处理 27 加星的仓库
gsw945
正在处理 28 加星的仓库
Ginagie
正在处理 29 加星的仓库

In [17]:
g = nx.read_gpickle("1.1")


Name: 
Type: DiGraph
Number of nodes: 3383
Number of edges: 3733
Average in degree:   1.1035
Average out degree:   1.1035
{}

In [92]:
print nx.info(g)
data = {}
for n in g.nodes_iter():
    if (g.node[n]['type'] == 'repo' and g.node[n]['lang'] not in data and g.node[n]['lang']):
        data[ g.node[n]['lang']] = 1
    elif (g.node[n]['type'] == 'repo' and g.node[n]['lang'] in data and g.node[n]['lang']) :
        data[ g.node[n]['lang']] = data[ g.node[n]['lang']]+ 1
    else:
        pass
sumRepo = sum([v for k,v in data.iteritems()])
data1 =  sorted(data.iteritems(), key=lambda d:d[1], reverse = True )[:9]#排序输出
others = 0
for v in data1:
    others = others + v[1]
others =  sumRepo - others
dothers = [unicode('others', "UTF-8"),others]
data1.append(dothers)
print sumRepo
print others
print data1
json.dump(data1, open('1.1.pie', 'w'))


Name: 
Type: DiGraph
Number of nodes: 3383
Number of edges: 3733
Average in degree:   1.1035
Average out degree:   1.1035
3146
658
[(u'JavaScript', 786), (u'Python', 502), (u'Ruby', 247), (u'Java', 234), (u'PHP', 212), (u'C', 133), (u'CSS', 130), (u'HTML', 128), (u'Erlang', 116), [u'others', 658]]

In [97]:
print "Popular repositories"
data2 = sorted([(n,d) for (n,d) in g.in_degree_iter() if g.node[n]['type'] == 'repo'], key=itemgetter(1), reverse=True)[:10]
print data2
json.dump(data2, open('1.1.rect', 'w'))


Popular repositories
[(u'edx-documentation(r)', 29), (u'edx-platform(r)', 14), (u'bootstrap(r)', 9), (u'd3(r)', 7), (u'configuration(r)', 7), (u'html5-boilerplate(r)', 5), (u'hacker-scripts(r)', 5), (u'scikit-learn(r)', 4), (u'django(r)', 4), (u'gitbook(r)', 4)]

In [ ]: