[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Добавление RSS в базу данных
Ринальдус
Доброе время суток всем! smile.gif
Задумал я добавить на свой сайт содержимое пары своих блогов и еще создать раздел интересных новостей с других сайтов. Собрался реализовать это через RSS. В качестве парсера выбрал готовый: RSS Fetch 0.4.3. Отчасти из-за того, что я знаком с XML и взаимодействием PHP с ним лишь поверхностно. Кроме того, требуется знать сам стандарт RSS, к тому же их несколько. У меня нет на все это времени, есть еще основная работа. Вот и взял готовый парсер. Вроде все нормально парсирует. smile.gif
Я бы хотел написать скрипт, который активизируется через Cron каждую 1 минуту и сканирует все RSS-ленты, которые в нем прописаны. Если в этих лентах есть новые записи, он их добавляет в базу данных. Если в базе данных уже есть такие записи, то он соответственно ничего не делает. Суть проблемы вот в чем. RSS ленты бывают разные. RSS моего блога, к примеру, выводит все мои записи. RSS других сайтов обновляются например каждые 24 часа. Т.е RSS ленты каждого конкретного сайта обновляются как настроил владелец этого конкретного сайта. Если бы они все обновлялись раз в сутки, я бы запускал этот скрипт в 23:59 каждого дня и был бы уверен, что никаких дублирующихся записей в базе данных нет. А так, наверное придется запускать скрипт каждую 1 минуту, чтобы быть уверенным, что ничего из RSS ленты не упущено, да еще и вводить проверку на наличие аналогичных записей в базе данных. Вот эта проверка и является проблемой, а точнее как это делать? Ведь id записи у RSS ленты нет. Дата публикации опять же может быть отдельным XML-тегом, который несложно выделить, а может быть внутри заголовка новости, к примеру. Да и вообще, где угодно. По каком критерию выполнять эту проверку? У меня идей нет. Может есть идеи у вас, более опытных программистов? Подскажите мне только идею, с программным кодом я справлюсь сам. smile.gif



Спустя 6 дней, 2 часа, 33 минуты, 46 секунд (14.11.2007 - 16:29) lenich написал(а):
Ну можно для каждой ленты держать в базе время последнего обновления и промежуток через который она обновляется у ее хозяина - тогда вы простым запросом отсечете все обновленные ленты. - после обновления сохраните время обновлеия в базе и все заново. Я сравнивал по имени записи в рсс. Либо лучше сравнивать по дате записи. Если дата записи в разных рсс лентах разная - то нужно соответственно делать для разных лент разные парсеры и все. Но вот что то акитвизация крона раз в минуту меня смущает. Вам там хостеры разрешат стока ресурсов тратить то?

Спустя 8 часов, 14 минут, 25 секунд (15.11.2007 - 00:44) Ринальдус написал(а):
Цитата
и промежуток через который она обновляется у ее хозяина

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

Вот с этого места поподробнее, пожалуйста. Предположим, каждая запись RSS в базе данных имеет некий id. Я выбираю последний id и присваиваю переменной $x имя записи из базы данных, которая соответсвует этому id. Потом говорю парсеру выдать мне с сайта самую последнюю новость и присваиваю переменной $y имя записи из RSS ленты. Если $x==y, значит такая запись в базе данных есть, ее игнорим. Если $x != $y, значит такой записи нет и мы ее добавляем.
P.S. Пока писал все это, все понял и родился алгоритм. smile.gif Правильно?

Спустя 1 день, 12 часов, 57 минут, 5 секунд (16.11.2007 - 13:41) lenich написал(а):
Правильно. Берем последнюю запись из базы и начиная с последней записи в рсс начинаем их сравнивать . Пока записи не равны - мы их добавляем. Как только произошло первое совпадение с последней записью из базы - значит мы уже добавили все новые записи в ленте и цикл можно завершать. Удачи)

Спустя 9 минут, 41 секунда (16.11.2007 - 13:50) lenich написал(а):
А вот еще чето сразу не дошло до меня: вы же можете сами генерить уникальные id для каждой записи. Т.е. просто вы генерите crc или md5 от каких-нибудь данных для каждого блока (например с контента - он же всегда разный) - и запоминаете этот хешь базе - это и будет уникальным id. Когда к вам приходит новый блок с рсс - вы делаете его хешь опять же и ищите по базе. Если такой хешь уже есть - значит писать не надо. Тут у вас на 100% отсеятся совпадения т.к. будет полностью уникальный идентификатор для каждой записи - но вот насчет производительности я не знаю. Я бы попробовал)


_____________
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.