Добрый вечер Дорогие друзья!
Недавно, прогуливаясь по просторам бескрайнего интернета, я наткнулся на изумительные работы Криса Харрисона, посидев немного в шоке, я подумал «А сложно ли визуализировать википедию или нет?» и решил попробовать!
Итак, приступим!
Первым делом надо определиться что мы будем визуализировать и помощью каких средств. И немного изучив что есть и как мой выбор упал на следующие средства:
Разработчики Wiki API его описали просто отлично, поэтому не стоит переводить описание дословно чтобы понять как вызвать тот или иной метод.
На хабре уже писали о пакете Graphviz, поэтому я думаю не стоит его повторно описывать. Но я сразу почитав описание языка dot и средств graphviz чуть не начал писать свое формирование .dot файлов.
Меня выручил модуль python под названием PyGraphviz, который позволяет в удобном виде работать со структурой графа, которая потом пишется в .dot файл.
Итак визуализировать мы будем перекрестные статьи из википедии. Для этого нам потребуется вызвать метод по ссылке:
где action — это тип метода, format — выходной формат ответа, в нашем случае это XML, prop — запрашиваем перекрестные сcылки links
на выходе мы получаем следующий ответ:
Который обрабатывается с помощью любого способа DOM или SAX
Итак для обработки я использовал SAX и наследовал свой класс от xml.sax.handler.ContentHandler:
Далее переопределяются основные вызовы:
Процедура работы с запросом имеет следующий вид:
С помощью модуля PyGraphviz работы производится довольно просто:
Статья «Mathematics» с 4-мя уровнями вложенности
Статья «Хабрахабр» с 5 уровнями вложенности
Другие:
Сократ
Хабрахабр 3 уровня
Другие примеры
Недавно, прогуливаясь по просторам бескрайнего интернета, я наткнулся на изумительные работы Криса Харрисона, посидев немного в шоке, я подумал «А сложно ли визуализировать википедию или нет?» и решил попробовать!
Итак, приступим!
Приборы и инструменты
Первым делом надо определиться что мы будем визуализировать и помощью каких средств. И немного изучив что есть и как мой выбор упал на следующие средства:
Разработчики Wiki API его описали просто отлично, поэтому не стоит переводить описание дословно чтобы понять как вызвать тот или иной метод.
На хабре уже писали о пакете Graphviz, поэтому я думаю не стоит его повторно описывать. Но я сразу почитав описание языка dot и средств graphviz чуть не начал писать свое формирование .dot файлов.
Меня выручил модуль python под названием PyGraphviz, который позволяет в удобном виде работать со структурой графа, которая потом пишется в .dot файл.
Основы
Итак визуализировать мы будем перекрестные статьи из википедии. Для этого нам потребуется вызвать метод по ссылке:
ru.wikipedia.org/w/api.php?action=query&format=xml&titles=ЗАГОЛОВОК_СТАТЬИ&prop=links
где action — это тип метода, format — выходной формат ответа, в нашем случае это XML, prop — запрашиваем перекрестные сcылки links
на выходе мы получаем следующий ответ:
- <api>
- <query>
- <normalized>
- <n from="хабрахабр" to="Хабрахабр"/>
- </normalized>
- <pages>
- <page pageid="340809" ns="0" title="Хабрахабр">
- <links>
- <pl ns="0" title="2006"/>
- <pl ns="0" title="2006 год"/>
- <pl ns="0" title="2007 год"/>
- <pl ns="0" title="Digg.com"/>
- <pl ns="0" title="Linux.org.ru"/>
- <pl ns="0" title="News 2.0"/>
- <pl ns="0" title="Newsland"/>
- <pl ns="0" title="Pligg"/>
- <pl ns="0" title="Slashdot"/>
- <pl ns="0" title="URL"/>
- </links>
- </page>
- </pages>
- </query>
- <query-continue>
- <links plcontinue="340809|0|Блог"/>
- </query-continue>
- </api>
* This source code was highlighted with Source Code Highlighter.
Который обрабатывается с помощью любого способа DOM или SAX
Программирование
Итак для обработки я использовал SAX и наследовал свой класс от xml.sax.handler.ContentHandler:
class LinksListHandler(xml.sax.handler.ContentHandler):
Далее переопределяются основные вызовы:
- startElement
- endElement
Процедура работы с запросом имеет следующий вид:
- def get_links(page):
- #See wiki api documentation http://en.wikipedia.org/w/api.php
- query_val = { 'action': 'query',
- 'prop': 'links',
- 'titles': page,
- 'format': 'xml'}
- url = wiki_url() + '?' + urllib.urlencode(query_val)
- request = urllib2.Request(url)
-
- verbose_message("Wiki url: " + url)
- try:
- response = urllib2.urlopen(request)
- except urllib2.HTTPError:
- print "HTTP request error!"
- sys.exit(1)
- #verbose_message("Response xml:\n"+response.read())
- lh = LinksListHandler()
- saxparser = xml.sax.make_parser()
- saxparser.setContentHandler(lh)
- saxparser.parse(response)
-
- return lh.links
* This source code was highlighted with Source Code Highlighter.
Построение графа
С помощью модуля PyGraphviz работы производится довольно просто:
- def make_wiki_graph(wiki_page, depth):
- gv = AGraph()
-
- page_list = [wiki_page]
- temp_list = []
-
- verbose_message('Create graph for ' + wiki_page)
- pageLinks = get_links(wiki_page)
- gv.add_node(wiki_page)
- for i in range(depth):
- print '>>>> Get '+str(i)+' level'
- for page in page_list:
- list = get_links(page)
- node = gv.get_node(page)
- node.attr['fontsize'] = "%i" % (MIN_FONT*2*(depth - i))
- for link in list:
- verbose_message(page + "=>" + link)
- gv.add_edge(page,link)
- temp_list.append(link)
- page_list = temp_list
- temp_list = []
- return gv
* This source code was highlighted with Source Code Highlighter.
Результаты
Статья «Mathematics» с 4-мя уровнями вложенности
Статья «Хабрахабр» с 5 уровнями вложенности
Другие:
Сократ
Хабрахабр 3 уровня
Другие примеры