説明
実験で追求した目的:
- ユーザーハブセンターの解析
- 完成したフレンドフィールドに基づいてユーザーグラフを作成する
- 構築されたグラフを視覚化する
グラフの解析と塗りつぶし
ユーザーとその友人に関する情報を取得するために、parser.pyスクリプトを作成しました。
# -*- coding:utf-8 -*- # parser.py from BeautifulSoup import BeautifulSoup from urllib2 import urlopen, URLError from draw import Drawer class Parser(object): def __init__(self, address='http://habrahabr.ru/people/page', begin = 1, end = 3098): self.drawer = Drawer() self.queue_user = [] self.__begin = begin self.__end = end self.__address = address def parse(self): for i in xrange(self.__begin, self.__end): try: doc = BeautifulSoup(urlopen(self.__address + str(i))) # . page = doc.findAll('td', attrs = {'class':'user'}) for user in page: # print 'Parsing for user: %s' %user.dl.dt.a.string doc = BeautifulSoup(urlopen(user.dl.dt.a['href'])) page = doc.findAll('a', attrs = {'rel' : 'friend'}) # if page: for friend in page: self.drawer.graph.add_nodes_from((user.dl.dt.a.string, friend.string)) self.drawer.graph.add_edge(user.dl.dt.a.string, friend.string) print "Add edge (%s, %s)"%(user.dl.dt.a.string, friend.string) else: self.drawer.graph.add_node(user.dl.dt.a.string) except URLError: # - i -= 1 print 'Nodes: %s' %self.drawer.graph.size() self.drawer.draw() if __name__ == '__main__': parse = Parser(end=8) parse.parse()
ページを解析するために、BeautifulSoupを使用しました。 Drawerクラスは、グラフの保存とレンダリングを担当します。
グラフ描画と画像保存
上記のように、draw.pyモジュールのDrawerクラスは、グラフの保存とレンダリングを担当します。
# -*- coding:utf-8 -*- # draw.py import networkx as nx import matplotlib.pyplot as plt class Drawer(object): def __init__(self, file_name = 'graph.png'): self.graph = nx.Graph() self.file_name = file_name def draw(self): ''' ''' nx.draw(self.graph,pos=nx.spring_layout(self.graph), node_size=3500, nodecolor='r',edge_color='b', node_shape='o') # plt.gcf().set_size_inches(100,100) plt.savefig(self.file_name)
このクラスでは、ソーシャルグラフが配置されるNetworkXモジュールのGraphクラスのインスタンスを内部フィールドに格納します。 Graphクラスには、グラフを操作するための多数のメソッドが用意されていることに注意してください。 モジュールの使用に関する詳細は、 ドキュメントに記載されています 。 結果の図/グラフのサイズを設定する方法に注意する必要があります。 パラメータは、グラフ内の頂点の数に応じて変更できます。
結果
行われた作業の結果は、計画されたものとは多少異なります。 スクリプトの過程で、リソースの非常に大きな消費を明らかにしました。 ご存じのとおり、Habrユーザーのおおよその数は60,000です。 友人がいないユーザーを(実際にやったように)破棄したとしても、その数は依然として重要です。 プログラムの動作の確認は、3 GBのRAMを搭載したマシンで実行されました。 グラフの描画が開始されるとすぐに、システムは恥知らずにスワップを開始するため、グラフ内のユーザー数を減らす必要がありました。 その結果、異なる数のユーザーでレンダリングされたグラフのいくつかのバージョンを取得しました。
この図は、852人のユーザーを含むグラフを示しています。
ご覧のとおり、記事の画像は大きく圧縮する必要があるため、画像のサイズが大きいため(7-14Mb)、残りの部分にはリンクを付けます。
見込み
- 最適化を実行し、すべてのユーザーをカバーするグラフを取得してください。
- 得られたグラフに基づいて、 6つのハンドシェイクの理論を検証します。
UPD:画像アーカイブ
人々にアップロードされた画像のダウンロードに関する問題をおaびします。
UPD2:zoom.itの画像
彼のアドバイスと支援に感謝します。
4095ユーザー
7071人のユーザー 。