Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

Получение информации с веб-сайтов с помощью новостных лент RSS

Оригинал: Keep Tabs on the Web with RSS Feeds
Автор: Marco Fioretti
Дата публикации: 19 сентября 2016 г.
Перевод: А.Панин
Дата перевода: 28 ноября 2016 г.

Получение информации с веб-сайтов подобно питью из пожарного шланга - в обоих случаях лучше использовать фильтр!

Для чего это нужно?

  1. Вы сможете читать последние новости без необходимости открытия веб-сайта BBC через каждые 10 минут.
  2. Вы сможете группировать ленты новостей в соответствии со своими интересами.
  3. Вы сможете осуществлять фильтрацию, обработку и повторную публикацию полученных новостей настолько эффективно, насколько это возможно.

Наиболее негативным последствием появления Facebook и других социальных сетей является частичная потеря актуальности технологии RSS. Формат файлов лент новостей RSS (акроним, расшифровывающийся как Really Simple Syndication - поистине простой механизм синдикации), а также конкурирующий и более передовой формат Atom были спроектированы специально для передачи и распределения контента главным образом в сети Интернет. В данной статье мы обсудим структуры файлов лент новостей форматов RSS и Atom, ответим на вопрос о том, почему передача и распределение контента настолько важны, а также рассмотрим вопросы использования файлов лент новостей для чтения, создания, обработки, распределения и повторного использования контента.

Мы посчитали, что данная статья должна быть понятна даже пользователям, мало разбирающимся в программировании. Все, что вам понадобится для самостоятельного запуска примеров из данной статьи - это базовые знания в области создания сценариев и (возможно) компьютер, работающий под управлением одного из дистрибутивов Linux с текстовым редактором, терминалом и подключением к сети Интернет. Для того, чтобы сделать статью максимально понятной читателям, большинство приведенных в ней сценариев было максимально упрощено. Эти сценарии отлично работают на наших компьютерах со всеми тестовыми лентами новостей, но при этом они не являются оптимизированными в плане производительности и совместимости, поэтому могут не работать на компьютерах с локалями или с лентами новостей с кодировками, отличными от ASCII. При этом несмотря на то, что мы будем постоянно упоминать формат лент новостей RSS, вы должны понимать, что все приведенные утверждения будут справедливы и для формата лент новостей Atom.

Форматы новостных лент RSS и Atom основываются на формате XML (eXtensible Markup Languge - расширяемый язык разметки) - текстовом формате, предусматривающем использование не всегда очевидных тэгов разметки. Оба упомянутых формата были разработаны для того, чтобы пользователи могли получать информацию о новейших статьях определенных веб-сайтов, не открывая их с помощью веб-браузера. Файл ленты новостей RSS веб-сайта автоматически обновляется при добавлении нового контента и содержит заголовки, даты и ссылки на полные тексты новых статей. Да, мы знаем, что исходя из этого описания, лента новостей RSS является ничем иным, как урезанной версией домашней страницы веб-сайта, в существовании которой нет особого смысла. Но на самом деле лента новостей RSS является крайне важным элементом любого веб-сайта по трем следующим причинам:

  1. Эффективность. Разумеется, формат лент новостей был разработан для распространения заголовков новостей обычно с небольшими фрагментами их текстов, но ничто не мешает использовать их и для других целей. Как мы увидим немного позже, ленты новостей RSS могут использоваться для распространения практически любой текстовой информации. Да, именно любой текстовой информации! По этой же причине повторное использование информации, полученной посредством RSS, не представляет каких-либо сложностей.

    В то же время, при наличии соответствующего программного обеспечения, сбор, фильтрация и чтение такого количества независимых лент новостей, какое вам нужно, в рамках одного расположенного на экране окна приложения, не будет представлять каких-либо сложностей и позволит избежать лишних затрат ресурсов, отвлекающих факторов и других особенностей социальных сетей с аналогичными функциями. Поверьте, RSS поможет сэкономить ваше время.

  2. Вторая серьезная причина, по которой стоит использовать ленты новостей RSS, заключается в том, что вы можете контролировать то, что вы видите и то, как вы это видите. Неужели вы хотите получать лишь те новости, которые были отцензурированы персоналом Facebook? RSS позволяет получать информацию непосредственно от веб-сайтов, на которых она опубликована, минуя все промежуточные ресурсы.
  3. Третья причина, по которой стоит использовать ленты новостей RSS, заключается в возможности избавления от контроля извне - вы сможете читать все, что вам интересно, не передавая информацию об этом третьим лицам. Разумеется, вы не сможете полностью защититься от отслеживания исключительно с помощью RSS, но при этом использование данной технологии является неотъемлемой частью соответствующей защитной стратегии.

Это магический символ RSS - веб-сайты без него распространяют свой контент не так эффективно, как могли бы

Это магический символ RSS - веб-сайты без него распространяют свой контент не так эффективно, как могли бы.

Структура файла ленты новостей RSS

Текущая версия стандартна RSS 2.0 является достаточно ограниченной (обратитесь к разделу "Что нового в формате лент новостей Atom?", если вас интересуют отличия между данными стандартами), но при этом простой в реализации и последующем использовании. В то же время, она является наиболее популярной, так как все еще используется по умолчанию многими системами управления контентом. В Листинге 1 показаны некоторые разделы ленты новостей журнала LinuxVoice формата Atom, упрощенной для лучшего понимания и всегда доступной по адресу http://www.linuxvoice.com/feed/.

Листинг 1:

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

Чтение новостных лент с помощью различных приложений

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

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

Такие агрегаторы новостей, как Liferea, также иногда называемые программами для чтения лент новостей, уже созданы для различных платформ и различных групп пользователей. В Linux и связанных с Unix операционных системах, включая Mac OS X, вы можете использовать программу с интерфейсом командной строки под названием Newsbeuter (http://newsbeuter.org). Это минималистичная программа вполне обоснованно характеризуется разработчиками как "Mutt из мира программ для чтения новостных лент": вы можете полноценно управлять ею с помощью клавиатуры, при этом она поддерживает множество функций для фильтрации, сортировки, работы с тегами и поиска в содержимом каждой из новостных лент. Кроме нее существует множество приложений и сервисов для агрегации новостных лент для мобильных платформ, включая такие, как Reader+ или gReader. Веб-сервисы на основе свободного программного обеспечения, такие, как Tiny Tiny RSS (или TT-RSS, https://tt-rss.org) позволяют осуществлять агрегацию и чтение новостных лент непосредственно в вашем веб-браузере или в официальном приложении для Android. TT-RSS может работать на любом веб-сервере с интерпретатором сценариев PHP и сервером базы данных PostgreSQL или MySQL. В качестве такого веб-сервера может выступать как ваш ноутбук, работающий под управлением системы Linux, так и сервер начального уровня в датацентре.

Установка TT-RSS настолько проста, насколько может быть в случае веб-приложения. Вам нужно всего лишь распаковать исходный код приложения в директорию, доступную веб-серверу, отредактировать файл конфигурации, добавив в него параметры доступа к серверу базы данных, перейти с помощью веб-браузера в директорию с файлами приложения и следовать выводимым инструкциям. После окончания процесса установки приложения им смогут пользоваться столько пользователей, сколько вам нужно, причем каждый пользователь получит свой пароль, возможность установки своей темы оформления, доступ к системе тэгов и к коллекции новостных лент.

TT-RSS также может быть отличным помощником в деле наблюдения за новым контентом с помощью лент новостей. Фактически, его пользователи смогут обрабатывать и фильтровать все новостные ленты, загруженные силами TT-RSS. Результирующие списки новостей, которые, разумеется, могут изменяться каждый день, впоследствии могут публиковаться силами TT-RSS в форме новых новостных лент, которые могут быть загружены и прочитаны с помощью любого другого агрегатора.

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

Агрегаторы или приложения для чтения новостных лент, такие, как Liferea, сделали возможным получение и просмотр сотен новостей одновременно

Рисунок 1. Агрегаторы или приложения для чтения новостных лент, такие, как Liferea, сделали возможным получение и просмотр сотен новостей одновременно.

Создание собственных новостных лент

На данный момент мы рассмотрели стандартные способы использования новостных лент RSS, создаваемых на различных ресурсах. Теперь же приступим к самому интересному. Давайте рассмотрим вопрос преобразования информации любого типа в новостную ленту RSS с помощью специального сценария и ее последующего использования по вашему усмотрению. Начнем с рассмотрения сценария rssbuilder на языке Python, приведенного в Листинге 2.

Листинг 2:

Данный сценарий предназначен для преобразования списка новостей в текстовом формате из файла с заданным именем (данные каждой новости должны быть расположены в отдельной строке, причем поля должны разделяться с помощью символа программного канала (|)) в одну стандартную новостную ленту RSS, которую способен прочитать любой агрегатор.

В первых девяти строках сценария осуществляется загрузка нескольких модулей языка программирования Python и установка значений системных переменных, ответственных за такие необходимые для исполнения сценария параметры интерпретатора, как кодировка символов.

В строках 10-16 создается новый объект новостной ленты RSS, устанавливается ее заголовок, ссылка на источник, описание и дата создания. В цикле в строках 20-27 осуществляется чтение текстового файла с именем, переданным с помощью первого аргумента сценария (строка 18) и разделение каждой прочитанной из файла строки по символу программного канала (строка 21), после чего каждая результирующая подстрока используется при создании новости, а сама новость добавляется в новостную ленту RSS (строка 28).

Две последние строки сценария предназначены для закрытия файла с данными новостей и записи данных новостной ленты RSS в другой файл, имя которого передается с помощью второго аргумента сценария. Например, если вы запустите сценарий rssbuilder с помощью терминала следующим образом:

#> rssbuilder allmynews.txt output.xml

предварительно создав файл "allmynews.txt" со следующим содержимым:

Листинг 3:

Получившаяся в результате новостная лента будет отображаться в любом приложении для чтения новостных лент практически также, как в приложении Akregator, снимок окна которого приведен на Рисунке 3. Данный снимок наглядно демонстрирует гибкость технологии RSS. В нашей новостной ленте есть все: и уведомления о сообщениях электронной почты, и новости с веб-страниц, и информация о состоянии компьютера… Технология RSS позволяет упростить сбор, распространение и использование информации любых типов из любых мыслимых источников. Здорово, не правда ли?

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

Пришло время рассмотреть методику чтения и обработки существующих новостных лент. Один из способов выполнения данной операции заключается в использовании сценария rss-fetcher, приведенного в Листинге 4.

Листинг 4:

Как и в случае с предыдущим сценарием, в первых восьми строках осуществляется загрузка библиотек, которые устанавливаются с помощью обычных инструментов для управления пакетами программного обеспечения вашего дистрибутива Linux. Сценарий rss-fetcher должен принимать два аргумента (значения которых сохраняются в строках 11 и 12), являющихся произвольным именем новостной ленты и строкой URL новостной ленты с исходной информацией соответственно. В строке 13 осуществляется основная работа, заключающаяся в загрузке файла новостной ленты с исходной информацией и сохранении информации из нее в объекте myrss с методами, реализованными в рамках библиотеки feedparser языка программирования Python.

В цикле, начинающемся в строке 14, осуществляются форматирование и вывод наиболее важной информации из состава каждой новости.

Это веб-сайт? Это программа для чтения новостных лент? На самом деле, это и то, и другое. Tiny Tiny RSS является приложением для чтения, фильтрации, создания и распространения новостных лент множеством пользователей по их усмотрению

Рисунок 2: Это веб-сайт? Это программа для чтения новостных лент? На самом деле, это и то, и другое. Tiny Tiny RSS является приложением для чтения, фильтрации, создания и распространения новостных лент множеством пользователей по их усмотрению.

Загрузка, разбор и фильтрация новостных лент

В качестве практического примера рассмотрим результат использования приведенного выше сценария по отношению к новостной ленте веб-сайта журнала LinuxVoice (строки URL и заголовки статей были урезаны для лучшей читаемости):

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

  1. Сохранять информацию из множества новостных лент, доступных во множестве различных источников, в обычных текстовых файлах, отлично подходящих для последующей простой обработки;
  2. Комбинировать, фильтровать и/или сортировать содержимое всех этих файлов в соответствии с вашими предпочтениями;
  3. Форматировать результаты, полученные на шаге 2, с целью генерации новых стандартных новостных лент, подходящих для повторного использования или воспользоваться следующим альтернативным вариантом;
  4. Интегрировать результаты, полученные на шаге 2, в любое приложения для настольного компьютера или веб-сайт.

Вариант действия 4 описан в последнем разделе данной статьи, поэтому в первую очередь следует подробно рассмотреть вариант действия 2. Представьте, что вы сохранили значения множества различных полей строк новостей из текстовых файлов с именами feed-01.txt, feed-02.txt и так далее с помощью сценария rss-fetcher. В этом случае команды, аналогичные следующим:

#> grep '2015-10-15' feed*.txt | sort > today.txt
#> grep -i linux feed*.txt | sort > linux.txt
#> grep -i '|KEYWORD|' feed*.txt | sort > KEYWORD.txt

позволят извлечь, отсортировать по датам и сохранить информацию о сегодняшних событиях (в файле today.txt), информацию о событиях с определенным ключевым словом в заголовке (в файле linux.txt) и информацию, относящуюся к категории с именем, переданным сценарию rss-fetcher (в файле KEYWORD.txt). В данный момент должно быть достаточно просто передать эти файлы сценария rss-builder или использовать их для других описанных ниже целей с помощью одного сценария, который выполняет всю работу в автоматическом режиме. Самая сложная часть процесса фильтрации данных будет заключаться в выявлении с использованием листка бумаги и карандаша всех данных, которые должны быть отфильтрованы или обработаны, а также выборе подходящей методики выполнения этой операции.

Международные новости, уведомления о состоянии компьютера, уведомления о новых сообщениях электронной почты… каждый человек может интегрировать в новостные ленты любую информацию, отформатировав ее соответствующим образом

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

Использование новостных лент везде. На самом деле везде

Существует огромное количество приложений для загрузки и отображения содержимого лент новостей RSS. WordPress и другие популярные системы управления контентом имеют модули, позволяющие вебмастерам автоматически встраивать и отображать новостные ленты на страницах веб-сайта. Однако, возможность работы с новостными лентами RSS и Atom открывает гораздо большие перспективы. Кто сказал, что вы должны видеть новостные ленты исключительно в тех местах (а именно, в клиентах для настольных компьютеров и модулях веб-сайтов), для использования в которых они были изначально предназначены?

В качестве примера можете рассмотреть ваш настольный компьютер. В зависимости от ваших привычек, а также принципа работы вашего мозга, вам может быть удобнее читать новости из лент RSS в вашей панели задач или в меню, открывающемся по клику на рабочем столе. Или же вам будет удобнее, если компьютер будет проигрывать какой-либо звук при получении новости по какой-либо заданной теме. Последний вариант гораздо проще в реализации. Для этой цели может использоваться сценарий командной оболочки с аналогичным кодом:

Листинг 5:

#! /bin/bash
NEWS=`grep -i -c Linux today.txt`
if [ "$NEWS" -gt "0" ]
then
	paplay there-is-news.mp3
fi

который будет проигрывать заданный в строке 5 файл формата MP3 в том случае, если значение переменной $NEWS не будет нулевым, то есть, в том случае, если хотя бы одна из полученных новостей будет содержать ключевое слово "Linux". Разумеется, в этом виде сценарий не готов к практическому использованию, так как он будет постоянно проигрывать звуковой файл формата MP3 для одних и тех же новостей, но вы наверняка поняли идею.

Три веб-сайта с тремя кардинально отличающимися архитектурами, включающие блок новостей из одних и тех же новостных лент с функцией автоматической синхронизации по мере появления нового контента. Как такое возможно?

Рисунок 4: Три веб-сайта с тремя кардинально отличающимися архитектурами, включающие блок новостей из одних и тех же новостных лент с функцией автоматической синхронизации по мере появления нового контента. Как такое возможно?

Новостная лента RSS на каждой странице каждого веб-сайта

На Рисунке 4 слева направо расположены фрагменты трех реальных веб-страниц, каждая из которых обслуживается отличным образом. Слева расположена желтая боковая панель блога на основе системы управления контентом WordPress. В центре расположена белая боковая панель другого веб-сайта, созданного с помощью генератора статических веб-страниц Mynt (http://mynt.uhnomoli.com). Справа расположена основная часть статической HTML-страницы еще одного веб-сайта. Эти веб-сайты идеально подходят для данной статьи, так как часть их содержимого автоматически обновляется силами более сложных версий рассмотренных выше сценариев. Через каждые несколько часов исполняется задача cron, которая загружает ленты новостей RSS и обычные страницы с новостями и объединяет их в рамках одного текстового файла, отформатированного так же, как и файл в Листинге 2. После этого данный файл преобразуется в HTML-страницу с помощью сценария, аналогичного ранее рассмотренному сценарию rss-builder, которая, в свою очередь, добавляется в области веб-сайтов, приведенные на Рисунке 4 с помощью техник, являющихся приемлемыми для каждого отдельного веб-сайта. В первом случае HTML-код добавляется в предварительно описанный виджет с помощью утилиты с интерфейсом командной строки wp-cli, предназначенной для работы с системой управления контентом WordPress (http://wp-cli.org). В остальных случаях HTML-код добавляется в код страницы вместо специальной строки в шаблоне Mynt или теле статической HTML-страницы.

Что нового в формате лент новостей Atom?

Формат RSS начал использоваться в глобальной сети в начале 2000-х годов, так как он был достаточно простым в использовании и решал большую проблему эры, в которой не было Facebook и Twitter: невозможность отслеживания новостей без открытия сотен различных веб-сайтов. Несмотря на успех формата RSS, были выявлены некоторые недоработки, допущенные его авторами.

Решением возникших проблем стал новый формат новостных лент Atom (Atom Syndication Format, описанный в рамках документа https://tools.ietf.org/html/rfc4287). По сути, но является стандартом IETF, обладает зарегистрированным типом MIME и предполагает обязательное добавление заголовка и строки URL источника ленты новостей. Типы MIME являются стандартным способом классификации типов файлов. Наличие отдельного типа MIME в совокупности с обязательным включением строки URL источника гарантируют возможность автоматического обнаружения новостной ленты, то есть, в том случае, если вы используете любой соответствующий стандартам веб-браузер или агрегатор, он будет без каких-либо проблем обнаруживать путь к ленте новостей формата Atom даже в том случае, если вы передадите ему лишь путь к домашней странице веб-сайта или локальной копии файла ленты новостей на жестком диске вашего компьютера.

Разработчикам следует знать, что библиотеки для работы с новостными лентами формата Atom являются гораздо более модульными, чем аналогичные библиотеки для работы с новостными лентами формата RSS, следовательно, их проще использовать в различных сторонних проектах. Формат Atom предпочтительнее формата RSS ввиду наличия улучшений в плане методики обработки кодировки символов, методики описания формата контента, а также методики установки меток времени последующей модификации. В случае использования новостной ленты формата Atom гораздо проще передавать не-ASCII символы и избегать ситуаций, при которых пользователь будет получать новые версии уже прочитанной новости. Улучшенная методика описания контента позволяет передавать в рамках новостной ленты данные различных типов (аудио, изображения, и.т.д.), которые не могли передаваться в рамках новостной ленты формата RSS, не вводя в ступор различные приложения для агрегации новостей.

Заключение? Разумеется, вам тоже стоит использовать новостные ленты RSS!

После прочтения данной статьи вы наверняка согласитесь с утверждением о том, что большая часть информации со стены в Facebook или из ленты в Twitter является ничем иным, как незначительно переработанными новостями из нескольких не связанных друг с другом источников (или значительно переработанными и дополненными новостями, уверяем вас в этом). В любом случае, мы надеемся, что прочитав эти несколько страниц, вы убедились в мощи и гибкости форматов новостных лент RSS и Atom и прониклись идеями для последующих экспериментов. Хотелось бы, чтобы вы рассказали нам о них в разделе комментариев!