Анализатор Ruby Rss и триггер событий - PullRequest
3 голосов
/ 18 апреля 2010

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

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

Ответы [ 3 ]

10 голосов
/ 18 апреля 2010

ОК, вот сделка.

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

  2. Autodiscovery?

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

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

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

  4. Если вы запрашиваете изменения, вам следует проверить последнее изменение или etag из заголовка, а не анализировать весь канал снова. Спасает вас от траты ресурсов. Feedzirra позаботится об этом за вас.

1 голос
/ 18 апреля 2010

Очень простым решением является использование Динамические искатели на основе атрибутов

Когда вы заполняете вашу модель данными RSS-канала, вместо Model.create (...) используйте Model.find_or_create_by_column(value, :other_column => other_value).

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

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

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

1 голос
/ 18 апреля 2010

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

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

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

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

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

Помогает ли это кому-нибудь?

...