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

Тормоз иногда бывает очень быстрым, особенно если делает что-то нескучное. Вот сегодня ради эксперимента минут за 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. Удачи!

Ярлыки:

Комментарии (25)

  1.  

    Blogger Тормоз:
    Проверка. Говорят, комменты не работают...

  2.  

    Anonymous Анонимный:
    Всё работает.

  3.  

    Anonymous Tex:
    Ай красавчик!.. =)

    Надо бороться со своей консервативностью и поизучать трубы...

  4.  

    Anonymous Анонимный:
    На втором шаге что в поле replace написано?

  5.  

    Blogger Тормоз:
    Открой трубу и посмотри сам.

  6.  

    Blogger InnovationNews:
    А как бороться с тем что в ленте много сообщений, и они каждый раз все выбираются. Часто дергать и постить последнее?

  7.  

    Blogger Бомж без колес:
    А зачем ты такие полезняшки выкладываешь то?.. Не думал о том, чтобы самому заюзать?

  8.  

    Anonymous Delpher:
    Добавил в закладки

  9.  

    Blogger MAClover:
    шайтан! :)
    другие пиписьками меряются. а человек дело рассказывает и показывает.
    спасибо.

  10.  

    Anonymous Бомжик с Таллинна:
    Очень хороший и Важный материал. Только Хотел достать словарик и посмотреть, что означает каждое слово, а здесь - разжевали. Ура!
    Трубы - это Вещь. Их можно Клонировать. Правильно, что Картинкой дал - пусть помучаются, в т.ч. и я, создавая подобное (по рисунку :)) - хоть опыта добавится.
    Изучение Труб Яху нужно делать не только для изготовления РобоБлогов: в жизни Вэбмастера пригодится.
    Спасибо за очередной пример и образец. Будем изучать

  11.  

    Anonymous Ыфырф:
    Полезная труба. Интересная
    А подскажите плиз хороший учебник по регулярным выражениям.

  12.  

    Blogger Тормоз:
    http://www.pcre.ru/

  13.  

    Anonymous Andrey Troy:
    Блин, даже я всё понял :) Автора - на Пулитцеровскую премию.

  14.  

    Anonymous Р_Джинс:
    to Бомжик с Таллинна
    Ну он вообще-то не тока картинку выдал но и ссылку на саму трубу дал, где её можно вьюсорсить и копировать себе для дальнейших надругательств

  15.  

    Anonymous Бомжик с Таллинна:
    to Р_Джинс

    На радостях не дочитал статью до конца... :)
    Хотя, может, действительно, давать не надо было. Зашёл, посмотрел, клонировал...
    Всё равно надо разбираться, чтобы Понимать. И это - интересно

  16.  

    OpenID r00t-aka-spin:
    Я в своё время делал сплоги следующим образом: тянул из Яндекс.Блогов тексты прямо не отходя от кассы, там есть такая опция: "Показать текст", и можно без всяких прокси драть оттуда готовый текст одним регексом.

  17.  

    Blogger Dan Rastor:
    Читать ленту друзей ЖЖ посредством RSS: http://pipes.yahoo.com/danrastor/ljfriendfeed

  18.  

    Anonymous alexf.name:
    Fetch Page это очень крутая штука. По идее с её помощью теперь можно любые парсеры на пайпсах писать. Непонятно только как яхо отнесётся если там запросы в сущетсвенных количествах пойдут.
    P.S. На блоге куда популярные записи собираются лушче бы среднюю колонку пошире сделать.

  19.  

    Anonymous murich:
    Эм. А на выходе из трубы мы получаем линки на сообщения и короткие дискрипшены. А как же в робоблоге поялвляются полные статьи? Ведь дизайны у жжшных блогов разные могут быть- всех одним регэкспом не отпарсишь...

  20.  

    Anonymous sam:
    я немного не понял зачем был сплит и юнион если и на юнионе и на фетче вывод совпадает?

  21.  

    Anonymous sam:
    cам все понял :)

  22.  

    Anonymous arch14:
    спасибо за статью про трубу! лично для меня очень позноватлеьно как начинающему

  23.  

    Anonymous Диван:
    Спасибо за трубу, было познавательно!!

  24.  

    Anonymous Анонимный:
    Проверка комментов...

    http://lyssak.com

  25.  

    Anonymous 5knig,ru:
    Прикинул тут масштабы, это же жесть какая нагрузка на сервак будет. Если свежаком базу забивать...

    Надо хостинг вменяемый под это дело искать. Автору - зачот!

  26.  

    Всегдапоследний:
    Спорим, я всегда буду последний? И буду хорошо смеяться.

Добавить комментарий
BmSubmitter и Закладочник