Electronic CHATS
Зарегистрируй себе бесплатно многофункциональный, профессиональный, быстрый чат!

Главная страница | Форум тех. поддержки Впервые у нас? Тогда читай FAQ и Правила! Сделать стартовой | Добавить в избранное

АДМИНКА

Логин:
создать чат
Пароль:
вспомнить


СВЯЗЬ С НАМИ

Администрация

Autodesk admin [показать ICQ]

Помощники

этим людям можно задавать вопросы по настройке и блокировки чата:

Pavel 5006165 helper [?]
Alex 630868614 helper [?]

РАДИО


РЕКЛАМА


«Социальный граф хабрасообщества»

Сегодня, я хотел бы поведать рассказ о своём небольшом эксперименте над аудиторией Хабра. Предметом эксперимента стало построение социального графа хабрасообщества.



Описание

Цели, преследуемые в эксперименте:
  • Выполнить парсинг хабрацентров пользователей
  • Создать граф пользователей, на основании заполненного поля «Друзья»
  • Визуализировать построенный граф


Парсинг и заполнение графа

Для получения информации о пользователях и их друзьях, я написал скрипт 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 отвечает за хранение и отрисовку графа.

Отрисовка графа и сохранение изображения

Как уже было сказано выше, за хранение и отрисовку графа отвечает класс Drawer из модуля draw.py:

# -*- 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)


В этом классе мы храним во внутреннем поле экземпляр класса Graph из модуля NetworkX, в котором и будет находиться наш социальный граф. Следует отметить что класс Graph, предоставляет большое количество методов для работы с графом. Подробности по работе с модулем можно найти в документации. Следует обратить внимание на метод, который задаёт размер результирующей фигуры/графа. Параметр можно менять, в зависимости от количества вершин в графе.

Результаты

Результат проделанной работы, несколько отличается от планируюмых. В ходе работы скрипта, я выявил очень значительное потребление ресурсов. Как известно, примерное количество пользователей Хабра 60 000 человек. Даже если отбросить(как я собственно и делал) пользователей у которых отсутствуют друзья число всё равно значительное. Проверка работы программы осуществлялась на машине с 3 Гб оперативной памяти. Как только, начинается отрисовка графа, система начинала безбожно свопиться, поэтому число пользователей в графе пришлось сократить. В итоге я получил несколько версий отрисованного графа с разным количеством пользователей.
На рисунке представлен граф, содержащий 852 пользователя:


Как видите изображения приходится сильно сжимать для статьи, поэтому остальные приведу ссылками, ввиду большого размера изображений(7-14Мб):


Перспективы

  • Провести оптимизацию, и попытаться получить граф охватывающий всех пользователей.
  • На основании полученного графа проверить теорию 6 рукопожатий.


UPD: архив с изображениями

Извиняюсь за проблемы со скачиванием изображений, залил на народ.

UPD2: изображения на zoom.it

Спасибо пользователю mstyura за совет и содействие.
4095 пользователей
7071 пользователь.
Дата публикации: 2011-08-16


СЧЁТЧИКИ

создать чат бесплатно - - - - Топ100 - Хостинг
Design by Autodesk
Копирование любых материалов с сайта, без установки ссылки на echats.ru - ЗАПРЕЩЕНО!
Electronic CHATS™ Company | Copyright © 2009-2020 | All rights reserved