Yahoo Pipes: собираем данные из нескольких источников

Владимир | | Web разработка, Yahoo Pipes.

Логотип yahoo pipes

Это завершающий выпуск моего миницикла о Yahoo Pipes. Сегодня мы сделаем RSS ленту блога Тыманчи Ыргын действительно удобной для чтения 🙂 .

Для тех, кто не читал предыдущие разделы, привожу ссылки:

1) Yahoo pipes. Cоздаем RSS ленту интересного сайта

2) Yahoo pipes: усложняем задачу

Как известно, лучшая RSS лента – это та, которая позволяет не заходить на сайт. Попросту говоря, она должна содержать полный текст статьи.

Оба наших предыдущих примера создавали ленту на основе данных с главной страницы блога, которая содержит только аннотации статей. Полный текст находится на отдельных страницах.

Теперь подумаем, каким образом должна работать наша «труба» чтобы получить данные из этих страниц. Решений может быть много, но, наиболее простым мне кажется такой вариант.

1) Получаем главную страницу.

2) Находим на ней все заголовки статей и ссылки на них.

3) Для каждой статьи формируем запись в RSS ленте.

4) Получаем страницу с полным текстом статьи (используя ссылки на главной).

5) Вырезаем из страницы нужный текст.

6) Добавляем текст статьи в RSS ленту.

7) Повторяем пункты 4-6 для каждой записи в ленте.

С принципом, работы разобрались, переходим к реализации.

Как выполнить первые три пункта я рассказывал в предыдущей части. Поэтому я только кратко повторю настройки блоков.

Fetch Page – получаем главную страницу и разбиваем ее на записи.
Split using delimeter <div class='date'>

Rename – формируем ленту
item.content Copy As link
item.content Copy As description
item.content Rename title

Filter – удаляем первую запись из ленты, т.к. она содержит не статью, а заголовок блога.
Block items that match all of the following
item.description Contains Tymanchi

Truncate – ограничивает количество записей в ленте.
Truncate feed after 8
Этот блок я в прошлой части не использовал. Дело в том, что лента с полными текстами 10 статей оказалась больше 200КБ, и Yahoo pipes выдал ошибку. Поэтому я ограничил число записей восемью.

Regex – заменяет данные в ленте на основе регулярных выражений. Мы его используем для вырезания заголовков и ссылок из текста.
item.title replace .*<h1>.*>(.*)</a>.*<\/h1>.* with $1
item.link replace .*href\s*=\s*"?(.*?)".* with $1

Теперь переходим к пунктам 4-7. Думаю, очевидно, что для решения задачи нужно использовать цикл. Поэтому перетягиваем на рабочее поле блок Loop (вкладка Operators).

Сам по себе этот блок работать не будет, нужно создать «тело цикла». Нам необходимо получить полный текст статей по ссылкам в записях. Поэтому перетаскиваем внутрь Loop блок Fetch Page.

Обратите внимание на параметр URL этого блока. После размещения его внутри Loop, Yahoo pipes проанализирует, какие данные поступают на его вход, и создаст выпадающий список с доступными вариантами. Нам нужно выбрать item.link, т.е. ссылку на страницу с полным текстом статьи.

Теперь смотрим html разметку страницы и определяем, по каким тегам можно вырезать статью. У меня получилось так:
Cut content from </h1> to <div class='pager'>

Заканчиваем настройку блока Loop. Присваиваем текст статьи параметру description ленты.
assign first results to item.description

После этого, с помощью блока Rename переименовываем параметр item.description.content в description и подключаем Pipe Output

Готовая «труба» показана на рисунке.

RSS лента блога Тыманчи Ыргын (миниатюра)

Нажимаем на кнопочки Save и Run pipe… и можем подписываться на готовую RSS ленту.

Заключение. На этом я оставлю в покое блог Тыманчи Ыргын, но не Yahoo pipes 🙂 . Сервис действительно интересный. Всем советую посмотреть примеры из их документации. Гарантированный способ убить пару часиков (или деньков) 🙂

До встречи!

Спонсор статьи:
Staffcop — система мониторинга работы персонала, контроля рабочего времени сотрудник и обеспечения информационной безопасности организации

P.S. По большому счету еще можно было бы еще добавить дату публикации статьи (параметр pubDate ленты)… Но, думаю, при желании вы и без меня справитесь 🙂

  • Очень интересно и поучительно) Спасибо за поучительную информацию!

  • Очень интересно и поучительно) Спасибо за поучительную информацию!

  • Надо попробовать что-нибудь такое сделать.

  • Надо попробовать что-нибудь такое сделать.

  • phillip

    автор, подскажи! я весь мозг себе уже изломал((( дело в том что у меня есть rss фид новостей гугла. или другой rss фид, неважно. мне нужно из него вырезать все ссылки и вверху добавить свою картинку. и все. как это смастерить? ну не получается у меня на основе твоего примера(((((

    • Что-то я тоже запутался 🙂
      Первую ссылку в статье вырезать получается, но с остальными проблема.
      Самое главное, что задача довольно легко решается на том же php с помощью циклов. Но в Yahoo Pipes внутрь блока Loop нельзя вставлять блоки операторов.
      В общем, чувствую, что должно быть простое решение, но пока найти не могу.
      Если сделаю, сразу напишу.

  • phillip

    автор, подскажи! я весь мозг себе уже изломал((( дело в том что у меня есть rss фид новостей гугла. или другой rss фид, неважно. мне нужно из него вырезать все ссылки и вверху добавить свою картинку. и все. как это смастерить? ну не получается у меня на основе твоего примера(((((

    • Что-то я тоже запутался 🙂
      Первую ссылку в статье вырезать получается, но с остальными проблема.
      Самое главное, что задача довольно легко решается на том же php с помощью циклов. Но в Yahoo Pipes внутрь блока Loop нельзя вставлять блоки операторов.
      В общем, чувствую, что должно быть простое решение, но пока найти не могу.
      Если сделаю, сразу напишу.

  • phillip

    обязательно пиши, важные штуки пишешь

  • phillip

    обязательно пиши, важные штуки пишешь

  • Dede

    Что-то я тоже запутался 🙂
    Первую ссылку в статье вырезать получается, но с остальными проблема.
    Самое главное, что задача довольно легко решается на том же php с помощью циклов. Но в Yahoo Pipes внутрь блока Loop нельзя вставлять блоки операторов.

  • Если вы можете решить задачу на PHP, то зачем Pipes?
    curl + php всегда дадут больше возможностей, фактически с их помощью вы можете решить любую задачу.
    Pipes удобно использовать для несложных задач или когда нет возможности / желания написать свою программу (перетащить и настроить блоки все-таки быстрее).