Пользователь
0,0
рейтинг
8 июля 2010 в 05:25

Фильтруем rss Хабра через Yahoo.Pipes



В комментах часто жалутся на обилие нежелательного контента на главной. Посты же не могут нравится всем сразу. Duh…
Вывод один — надо фильтровать. Кэп подсказывает Интуиция подсказывает, что фильтровать мы будем с помощью Yahoo.Pipes.

С картинками.


Вместо вступления


Про Y!P уже писали: раз, два, and more. Напишем еще раз, лишним не будет. Инструмент поистине впечатляющий.
А почему собственно был выбран Y!P, когда данный функционал уже реализован во многих rss ридерах?

Просто потому что это очень интересно — заниматься чем-то новым и таким близким к *nix философии. Кроме того после фильтрации через Y!P вы получаете только полезный траффик из ленты, не нагружая свой канал лишними данными.

Новый движок


Не так давно Y!P обзавелся движком версии два: Yahoo! Pipes V2 engine.

Если коротко:
  • движок V1 через некоторое прекратит существование
  • V2 позволит добавить новые фичи
  • V2 отличается большей скоростью
  • у V2 скорее всего куча багов (это неофициальный релиз)


Получение ленты


Все начинается с rss ленты. Однако Хабралента не подходит для Y!P. Не слишком заморачиваясь подробностями, берем ленту с feedburner'a:



На рисунке представлен модуль Fetch Feed. Его задача — взять ленту с указанного адреса и передать дальше в пайп. А дальше, как видно, следует модуль Split, который разделяет одну ленту на две совершенно одинаковые.
Это чтобы была избыточность для отказоустойчивости?

Нет, это нужно для хитрой фильтрации: в левом канале отрезается все, что не нужно, а в правом остается только то, что нужно.

Фильтрация




Верхний модуль блокирует записи по двум RegExp'ам, а нижний разрешает записи по двум другим.
А что такое RegExp?

Про RegExp'ы eng, рус, а также хороший гайд по теме.

Чтобы наши модули фильтров не превращались в громадных монстров, наши ключевые слова для фильтрации подводятся отдельно (поле text [wired] c подозрительными серыми связями). А пока стоит остановиться на левой части модуля. Из выпадающего списка можно выбрать интересующий элемент записи. Для нашей задачи (блокировка записей) отлично подойдет поле item.title, ведь именно по заголовку в первую очередь записи и отсеиваются. Поле item.description содержит тело записи и используется в фильтре для оставления интересующих нас тем. Например ты, %username%, заблокировал слово Microsoft©, но разрешил слово Linux. В таком случае, если в посте с заголовком «Microsoft берет новые высоты» будет написано «linux то все равно круче», то данная запись попадет прямиком к тебе в rss читалку.

Оформление результата




После вырезания\оставления записей, необходимо две ленты снова объединить в одну. Делает это элемент Union, у которого аж 5 входов (так жалко растрачивать неиспользуемые входы). Теперь у нас снова одна лента, в которой вполне могли завестить дупликаты. Вывести этих нежелательных паразитов нам поможет модуль Unique: на основе поля item.link он просмотрит все записи и изымет лишние. Осталось только навести красоту, отсортировав записи по какому-нибудь критерию. На картинке записи сортируются по убыванию даты публикации (новые в начале). Самый главный модуль в конце любого пайпа — Output. Именно на нем должен закончится наш проект. Ну так собственно и получилось. Кликнув на модуль Output, можно насладиться результатом стараний:



Так, а где-же шаблоны для отсеивания записей?


Шаблоны





Так выглядят шаблоны для удаления постов. Три большие String Builder'a нужны просто для красоты (можно всё засунуть в один). Кроме того разделение помогает с некоторого рода систематизацией шаблонов. Все записи отделются друг от друга вертикальной чертой, и это очень важный момент. String Builder попросту берет все поля и соединяет их в одну строку. Маленький String Builder собирает всю информацию из больших, а затем оборазчивает в подходящую обертку. Как известно, заголовки постов выглядят на Хабре следующим образом: «блог / пост», поэтому в данном случае все шаблоны нацелены на фильтр определенных блогов. Слово «заглушка» помогает нам избежать ситуации, когда в конце блока ИЛИ не окажется ничего ( microsoft|linux|freebsd| ), что будет отфильтровывать абсолютно все посты. Посмотреть на получившийся RegExp можно в поле debugger после клика на маленьком string builder'e:



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



Разрешающий фильтр выглядит заметно меньше, но не менее важен:



Ключевые слова из String Builder'a он будет искать как в заголовке, так и в теле поста. Эти элементы помогут нам не упустить важный топик из-за жесткой фильтрации.
А дальше что?

Подписываемся на rss или atom получившейся ленты и конечно же PROFIT.

Вместо заключения


Надеюсь данная статья поможет тебе, %username%, освоить Yahoo.Pipes и реализовать там свои идеи.
Ссылка на пайп из статьи: habrapipe
@d3m1gd
карма
16,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое

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

  • +2
    красиво сделано =)
    • 0
      Спасибо =)
  • +9
    Pipes, один из самых интересных и замечательных продуктов от yahoo
  • 0
    Я себе год назад по похожему принципу сделал трубу для отслеживания блогов по Zend Framework. Труба открытая. Кто хочет, может использовать тут: pipes.yahoo.com/pipes/pipe.info?_id=aiTMhREL3hG5aJHA0j6skA
  • +14
    > в левом канале отрезается все, что не нужно, а в правом остается только то, что нужно
    На этой фразе я впал в ступор… :(
  • –1
    Картинки красивые! По ним и так все ясно! Так что можно тексты не читать!
  • +1
    Я в регекспах воспользовался ".*(?i:", для того чтобы не зависеть от регистра…
    • 0
      у меня отказывается принимать регистро-независимые шаблоны в V2 :(
      может быть для нее есть какие-то свои хитрости?
      • 0
        Странно у меня работает…
        • 0
          Работает только для английского языка похоже… :(
  • +1
    Когда я делал pipe для rss хабра в прошлый раз, администрация сообщила мне, что y!p слишком часто делает запросы. Будьте осторожны.
    • 0
      В этом пайпе rss берется не с хабра, а с feedburner'a, поэтому y!p тут не при чем. Если брать напрямую с хабра, то y!p выдает ошибку о недоступности сервиса.
  • 0
    Для составления и проверки регекспов могу посоветовать простой и удобный сервис.
  • 0
    Получилась такая себе Хабралента под конкретного человека…

    Спасибо за изложенный материал.
  • 0
    Отдельное спасибо за гайд по регулярным выражениям.
  • 0
    Интересно, хабр использует pubsubhubbub. Думаю может на appengine что-то такое сделать…
  • 0
    за ссылку на гайд по регекспу спасибо ))))
  • +1
    И все-таки интересно, почему YP не понимает RSS с хабра.

    Мне пришлось обойти это следующим образом:
    1) Скрипт не моем домашнем сервере периодически тянет 3 ленты с хабра (главную, хабраленту, и хабраленту 3.0) в DropBox-папку
    2) YP берет эти ленты, соединяет их и удаляет дубликаты

    Если бы хабр генерил такие ленты, которые понимает YP, можно было бы обойтись без первого шага.
  • 0
    Pipes v2 почему-то JSON импортирует неправильно (а может, и не только JSON). И ещё важный момент: если аккаунт перевести на v2, скорей всего все старые трубы (или большинство) работать перестанут.
  • 0
    Да, YP — замечательная штука.
    Вот только из-за тормознутости порой просто невозможно было пользоваться…
    Если v2 действительно не такой, то это здорово.
    Кто уже попробовал, чувствуется разница?
    • 0
      Пайп из статьи писался под V1. Тогда действительно были и тормоза, и глюки, и подвисания. Когда перевел на V2 ощущения от работы с пайпом заметно приятнее стали. Ни разу не вис, не тормозил, время реакции увеличилось.
      • 0
        Да. Вот из-за этих глюков и подвисаний забросил я его. Теперь будет повод при случае опять попробовать.

        Неслабый у вас фильтр получился…
        А как насчет Хабраленты? Сильно хуже?
        • 0
          Насколько я понимаю, Хабралентой могут пользоваться только зарегестрированные пользователи, а пайп работает для всех
  • 0
    Кстати, тут ещё вопрос рекламы на Хабре. Как я понимаю, Яндекс и другие платят за ведения блога на Хабре деньги. Читая Хабр через пайпс, пользователи обрезают денежный поток для сайта. Или я не прав?
    • 0
      В любом случае rss хабра доступна публично, значит ее можно использовать в rss читалках, во многих из которых есть свои фильтры. Кроме того, следя за новостями через rss вы не получаете большой дозы рекламы на сайте через различные баннеры, что тоже (как мне кажется) должно приносить ощутимый доход. Ну и чего уже говорить про различные AdBlock'еры, которые вообще сводят к нулю получение рекламной информации с сайтов.

      На сайтах, где данный вопрос критичен (блокировка рекламы), пользователей со включенным блокиратором предупреждают об этом и просят его выключить.
  • 0
    вопрос — а в yahoo pippes можно реализать выдирание полного содержимого статьи? (с помощью того же regex)
    • 0
      Теоретически — да. Есть модули, которые позволяют скачивать страницу целиком, однако я сам этого не делал. Используя поиск можно найти кучу гениальных примеров и реализаций
      • 0
        судя по всему не получится,
        только что смотрел что умеет pipes, там есть fetch page — как раз для этих целей, но хабр возвращает ответ «502: Service unavailable» :(
  • 0
    Спасибо! Ваш пост был отфильтрован с помощью Yahoo.Pipes.
  • 0
    А я для подобных целей использую Google App Engine. Несколько сложнее поначалу, но возможности гораздо шире. Тоже бесплатно, естественно.
  • 0
    У YP есть один недостаток — он разбивает ленту по страницам.
    Т.е. если в ленте больше 100 записей — он вернет только 100 остальные придется забирать по ссылке вида [pipe_url]&page=2 и т.д.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.