2010-04-18 3 views
3

Я использую библиотеку RSS, чтобы я мог анализировать Atom и RSS в Ruby и Rails и хранить их в модели. Я просмотрел стандартную библиотеку RSS, но есть ли одна библиотека, которая автоматически обнаружит, что есть новый rss-канал, чтобы я мог обновлять мою базу данных?Ruby Rss синтаксический анализатор и триггер события

Какова наилучшая практика запуска инструкции для хранения новой RSS-ленты? Должен ли я использовать потоки для решения этой проблемы? Это будет медленно? благодарит вас за помощь

ответ

10

OK сделка.

  1. Если вы хотите, чтобы настоящий быстрый анализатор кормов отправлялся на Feedzirra. Не работает на окнах. http://github.com/pauldix/feedzirra

  2. Autodiscovery?

    -Терш трюфель-боров, если вы не хотите перенаправлять GET. http://github.com/pauldix/truffle-hog

    -Theres feedbag, если вы хотите сделать GET перенаправления, чтобы найти каналы из заданных URL-адресов. Это медленнее, хотя. http://github.com/damog/feedbag

  3. Feedzirra - лучшая ставка, если вы хотите опросить новые записи для своего канала. Но если вы хотите больше не опросить решение своей проблемы, я бы предложил пройти через спецификацию pubsubhubbub. Убедитесь, что во время разбора ваших каналов они разрешены pubsubhubbub. Проверьте тег ссылки. Если он указывает на pubsubhubbub.appspot.com или какой-либо другой хаб-концентратор, назначенный pubsub, просто подпишитесь на канал, отправив запрос на подписку на концентратор. Затем вы можете определить конечную точку в своем приложении, которая, в свою очередь, получит обновленные записи для подписки на канал с концентратора.Просто прочитайте необработанные данные POST и сохраните их в своей базе данных. Статистика состоит в том, что 95% блогов блогеров включены в pubsub. Это уже много данных в ваших руках. :)

  4. Если вы делаете опрос для изменений, вы должны проверить последний измененный или этаг из заголовка, а не снова разобрать весь фид. Экономит вас от траты ресурсов. Фиджирра позаботится об этом для вас.

+2

Я забыл про использование головы() по URL-адресу и поиск заголовков etag и last-modified. Я должен был написать агрегатор около двух лет назад и шел из моей сильно поврежденной памяти. +1 за ваш ответ! –

+0

Спасибо, Грег :) –

1

Я не уверен, что вы подразумеваете под «автоматическим определением» нового фида?

Вы ищете код, который может обнаружить, когда кто-то создает новый канал на сайте? Или, вы хотите узнать, когда в существующем фиде есть новая статья?

Первый жесткий, потому что ваш код должен знать, на каком сайте смотреть, поэтому ему нужно какое-то автоматическое обнаружение сайтов с новыми фидами. Поиск google для «новых rss-каналов» не возвращает ничего полезного, по крайней мере, не на первой странице. Если вы или ваши пользователи знаете новый сайт, вы можете иметь интерфейс для добавления новых сайтов для поиска. Затем вы захватываете страницу по этому URL-адресу, ищите ссылки для автоматического обнаружения RSS/Atom и оттуда. Соединения автообнаружения могут открывать банку червей из-за дублирования контента, который используется с использованием разных протоколов (RDF, RSS и Atom), поэтому вам нужно определить, какие из них использовать, или несколько каналов с указанным альтернативным содержимым.

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

Как правило, для этой задачи я создаю запись crontab в производственной Linux или Unix-системе и периодически запускаю работу, просматривая в базе данных те фиды, чье время последнего запуска, а также сохраненное время от времени, живое значение в прошлом.

Это помогает?

1

Очень простое решение заключается в использовании Dynamic attribute-based finders

При заполнении вашей модели с данными RSS подачи, а Model.create (...) использовать Model.find_or_create_by_column(value, :other_column => other_value).

Вы можете указать дату в качестве уникального значения или названия RSS сообщений ... (все, что вы хотите)

Я думаю, что это довольно легко. Например, вы можете выполнить некоторую задачу cron для заполнения вашей модели один раз в час. Будут добавлены только новые каналы.

Невозможно получить какое-либо «событие» при обновлении RSS без повторной загрузки всего RSS-канала.

+0

Нет, вы ошибаетесь. Вы можете просто получить заголовок RSS-канала, а не загружать весь канал. Заголовок содержит тег e или тег последнего изменения, с которым вы можете сравнить тот, который уже был сохранен в вашей базе данных. Только если вы можете загрузить любую загрузку всего фида. –

+0

И вы можете получить «событие», когда RSS обновляется, подписавшись на сервер с поддержкой pubsub. Прочтите мой первый ответ. Вы получаете обновленную подачу в виде толстых писем. Затем вы можете просто прочитать необработанные данные POST и извлечь контент. Прочитайте спецификацию pubsubhubbub. –

+0

Мы говорим о простой общей ленте RSS, а не о сервере с поддержкой pubsub! Ваше решение не является общим решением для RSS-каналов. – retro

Смежные вопросы