Sunday, January 6, 2008

Вдохновленный тормоз

Вдохновленный тормоз

Живой журнал (ЖЖ), Яндекс и Yahoo Pipes

Posted: 06 Jan 2008 12:18 AM CST

Тормоз иногда бывает очень быстрым, особенно если делает что-то нескучное. Вот сегодня ради эксперимента минут за 15 сделал и протестировал робоблог, который собирает в себя самые популярные записи из ЖЖ по версии Яндекса. При этом мы парсим обычную html-страничку рейтинга, вытаскиваем из неё нужные ссылки, идём по этим ссылкам и тянем уже полные тексты записей.

На то, чтобы показать вам это и рассказать уйдет явно больше времени, чем ушло на создание трубы :) Итак, начинается всё с рейтинга Яндекса. Как из этой странички быстро сделать робоблог? Нам понадобится новый модуль в Yahoo Pipes, который называется Fetch Page.

Самые сообразительные всё поймут из картинки (кликабельно)...

Труба-парсер (Yahoo Pipes)

Ну а остальным я объясню более детально. Давайте рассмотрим каждый модуль отдельно, двигаясь по трубе сверху вниз.

Fetch Page. Этот модуль появился совсем недавно, именно с его появлением стало возможно быстро решать задачи парсинга страниц. Раньше для этого приходилось использовать сторонние сервисы вроде Feedity или собственные скрипты. Как видите, модуль позволяет получить содержимое любой странички, вырезать из неё лишнее, да ещё и разделить на отдельные элементы.

Regex. В элементах ещё осталось полно мусора, тэги всякие, лишняя информация, которая нам не нужна. Нам нужны только ссылки на записи. С помощью всего лишь одного простого регулярного выражения мы оставляем в элементах только ссылки.

Filter. Изначально вырезка содержательной части из странички была сделана не очень точно, поэтому среди элементов попадаются лишние: пустые и содержащие не те ссылки, которые нам нужны. Отфильтровываем их таким образом, чтобы остались только ссылки на ЖЖ. Кстати, теоретически в популярные записи в рейтинге Яндекса могут попадать свободные блоги, или блоги с ЛиРу, но так как это бывает редко, я просто пренебрег этим обстоятельством. На данный момент весь рейтинг состоит только из ЖЖшников.

Rename - модуль переименования. Пусть теперь контейнер для ссылок будет называться так, как и должен - link. Всё равно пришлось бы переименовывать в дальнейшем.

Split. Разделяем поток на два ручья. Вернее, размножаем, ведь в результате получаются два совершенно идентичных потока. Это нам пригодится чуть позже для выборки популярных записей из кучи других.

Снова Regex. Ссылки на RSS в LiveJournal выглядят как username.livejournal.com/data/rss, у нас же в потоке всё пока вида username.livejournal.com/NNN.html. Снова несложным регулярным выражением отбрасываем все NNN.html и заменяем их на /data/rss, чтобы на следующем этапе получить все записи популярных сегодня блоггеров.

Loop + Fetch Feed. Модуль Loop позволяет добавить к каждому элементу дополнительное содержание, либо заменить элементы новым содержанием. Для этого нужно поместить в него любой другой модуль из группы Sources, Url, String и т.п., кроме операторов и некоторых других. В данном случае мы помещаем внутрь модуль, который вытаскивает полные фиды (каналы RSS) с блогов, по уже подготовленным нами на предыдущем шаге ссылкам. На выходе этого модуля у нас будет около 600 записей, но нам нужно всего 25 самых популярных...

Union. Объединяем два ручейка, которые теперь стали разными. В первом у нас более 600 элементов с 25 блогов, а во втором всего 25 элементов, и в каждом содержится ссылка. Что же делать дальше?

Unique. Отделяем зёрна от плевел. Модуль Unique не только отбрасывает элементы, в которых есть дубли по заданному параметру, но и считает эти дубли, оставляя для нас эту ценную информацию в служебном субэлементе y:repeatcount. Обратите внимание, соединять ручьи нужно именно в показанном порядке - сперва идёт большой поток со всеми записями, и только потом маленький со ссылками.

Filter. Благодаря предыдущему модулю определить нужные записи теперь не составляет никакого труда. Очевидно, что значение y:repeatcount у них будет равно двум, вот по этому параметру и фильтруем элементы.

Pipe Output. Вот и всё, приехали. Мы получили трубу, которая содержит полные тексты популярных записей ЖЖ из рейтинга Яндекса.

Что можно с этим делать? Ну, во-первых, это лишь пример, эксперимент, показывающий возможности Yahoo Pipes вообще и нового модуля Fetch Page, в частности. Во-вторых, трубу можно просто читать, кому интересно. Из этого можно сделать рассылку, можно сделать трансляцию в ЛиРу или сам ЖЖ. Я же просто взял RSS трубы и настроил его импорт в робоблог. Всё это делается буквально за пару минут, даже меньше. Абзац дольше писал.

Приведённый пример не единственно правильный, возможны варианты. Я вот уже вижу, как можно оптимизировать, но нафиг? :) Быстренько сделали - всё работает. Это главное.

Хотите знать больше про Yahoo Pipes? Заходите на форум, общайтесь, изучайте примеры. А ещё регулярно выкладывает хорошие заметки про трубы Arser. Удачи!

No comments: