Экспресс анализ гуглоданных

ejefree |
Меня завораживает универсальность питона. И хотя в последнее время его популярность росла в основном благодаря вебу, другие аспекты языка также развивались. Изначально я заинтересовался питоном в его научно-техническом аспекте. В своей работе я использую его в качестве аналога MATLAB, для аналитического анализа данных, создания моделей, оформления графиков.
Примеру реализации подобного анализа повещена данная статья. Изначально я не планировал оформлять публикацию, а лишь удовлетворял собственное любопытство, но потом решил посильно поддержать молодой ресурс:) В первую очередь статья будет полезна начинающим пользователям еще выбирающих подходящий инструмент. Для экспериментов рекомендую попробовать сборку python(x,y) включающую множество модулей научно-технического характера и Spyder как IDE (также входит в состав python(x,y)).

В качестве источника данных воспользуемся недавно опубликованным рейтингом 1000 популярных сайтов от google (http://www.google.com/adplanner/static/top1000/).
Получение данных
Рейтинг представляет из себя типичную html страницу. Несмотря на то что эта страница разбита на 10 частей, анализ ее исходного кода показал, что переключение между разделами выполнен на клиентом уровне (js).
Для получения данных, используем модуль urllib:


Парсинг
Следующий код представляет собой парсинг полученного контента, для вычленения данных из текста страницы. Реализовать это можно десятками разных способов, каждый со своими плюсами и минусами. Реализованный способ представляется наиболее простым, но сильно зависимым от содержания страницы. Пример html кода станицы:



Первые 81 строчки содержат информации о html странице, и не содержат данных. Начиная с 82 строчки, циклически с периодом 13 строк выводится ячейки данных. Этого достаточно для реализации следующего алгоритма:




Недостатком метода можно считать излишнюю зависимость от формата источника, если к моменту публикации гугл изменит текст страницы (к примеру добавит в начало страницы пустую строку) то алгоритм работать не будет.
Выгрузка данных в БД
Теперь все данные находятся в переменной 'data'. По идее уже сейчас можно приступить к анализу информации, однако я предпочел предварительно сохранить данные в базу данных. Это обладает рядом преимуществ:
С БД можно работать из разных приложений;
Для анализа данных удобно использовать встроенный язык SQL;
БД позволяют работать с большими объемами данных(что к данному примеру не относится).

В качестве СУБД выбрана sqlite присутствующая в питоне по умолчанию в виде модуля sqlite3:



Дополнительные данные
Теперь все данные находятся в файле с названием 'googlestat.db'. Но анализируемый рейтинг имеет большой недостаток, в нем отсутствуют данные о самом гугле. Для повышения качества выборки добавим в БД данные о google и youtube с http://alexa.com.



Графики
Теперь можем приступить к анализу. Для этого потребуется библиотека matplotlib со всеми зависимостями.
Разобьем интернет по категориям:



Вот результат:


Другие диаграммы (код доступен в прилагаемых файлах):






Выводы
Ну а какая аналитика без выводов)) Но в данном случае выводы не будут касаться полученных графиков, интерпретацию графиков оставлю читателям(намекну лишь что означать они могут совсем не то, что кажется, а для рунета выборка слишком мала). Вывод: питон хороший инструмент для решения широкого круга задач.

Файлы:load.py http://dl.dropbox.com/u/3635811/googlestat/load.py
plot.py http://dl.dropbox.com/u/3635811/googlestat/plot.py
googlestat.db http://dl.dropbox.com/u/3635811/googlestat/googlestat.db
Теги: Share
Комментарии (7)
anderson #
Хорошо бы было уменьшить немного размер графиков :)
0
ejefree #
да, не расчитал)
0
ejefree #
еще бы знать как редактировать)
0
admin #
А снизу разве нет ссылки "редактировать"?
0
oigen #
Интересно, а "other" - это прон что-ли :)?
0
ejefree #
из базы берем наиболее популярные данные (sql инструкция limit) other это то что осталось
0
alexis #
Спасибо за статью:) Полезно!
0
ejefree #
пожалуйсто, значит не зря выложил)
0
fata1ex #
показывать новичкам ваш метод парсинга страницы опасно, а так статья интересна, спасибо.
0
myfreeweb #
Какой забавный парсер... так и назовем: «не осилил xml.dom.minidom».
0
ejefree #
о минусах метода я написал, но использовать DOM для ОДНОРАЗОВОГО РАЗБОРА простой структуры, при этом еще далеко не факт что страница полностью соответствует xml, простите извращение. Если вы так не считаете то перепишите парсер ч-з xml.dom и если код будет проще и понятнее, соглашусь, что был не прав
0
fata1ex #
извращение - это скорее ваш метод, нежели чем предложение myfreeweb. а то, что вы начинаете спорить, говорит лишь о вашем небольшом опыте в данной области. использование minidom или любого другого парсера значительно улучшит код.
0
ejefree #
Под извращением я понимаю усложнение простых вещей. Продемонстриуюте, что минидом поможет вам совершить эту операцию проще и я заберу свои слова. Я на свой метод потратил 3 минуты, ну неужели вы не найдете?
Я работал XML/domDocument на пхп и в определенных случаях без него не обойтись, но вы не понимаете, что [b]научно-техническая[b] сфера деятельности вовсе не подразумевает знания ни XML/DOM ни веб технологий, а файлы как-то парсили и до них.

>> а то, что вы начинаете спорить, говорит лишь о вашем небольшом опыте в данной области

чтооо о_О??? А я думал желание спорить вызвано стремлением узнать/донести истину.
Но с такой формулировкой я полагаю ты никогда не "начинашь споришь" т.к. это атоматом лишает опыта
0
demoriz #
Парсер и вправду корявый, но хочу заметить что акцент в данной статье совсем не на способах эффективного разбора html страниц. Свою основную мысль автор развил имхо достойно.

PS. ещё раз соглашусь с тем что парсер мягко говоря неудачный, но "бросать несвежими овощами" без достойной аргументации имхо наглость. Если хочешь обвинить автора в не компетенции одного голословного утверждения мало. Приведи более правильное решение и тогда думаю автор возражать не будет. Даже наоборот выскажет благодарность за помощь и вставит в свой пост.
0
zubchick #
немного велосипедный парсинг, но остальное понравилось. Хотелось бы больше статей о matplotlib'e
0
hairspray #
Статья интересна, но хочу сказать о двух моментах:
1) Парсить действительно можно было либо с помощью xml.dom, либо с помощью beautifulsoup
2) "for line in web:
i+=1
start = 82
#обрубаем начало
if i<start: continue" - Pure LSD.