• php

    RSS + PHP + SimpleXML = пишем скрипт публикации новостей за 15 минут

    Попросил меня один очень хороший знакомый написать сценарий, позволяющий публиковать на главной странице его сайта компьютерные новости с сайта 3DNews.ru. При этом он высказал мне следующее пожелание – новости должны автоматически скачиваться с сайта донора и сохраняться на локальном сервере, дабы не замедлять загрузку страницы при каждом обращении к ней. К тому же обновление новостей должно происходить примерно 2 раза в сутки. И на последок – достаточно публиковать только 5 новостей из всего, что предлагает 3DNews.ru.

    И не то, что это было бы сложно сделать, но уж совсем времени свободного на такое жалко. А поскольку знакомый очень уж хороший, то решился я все же ему помочь, однако выбрал самый короткий путь к цели. В результате скрипт написался практически сам собой минут за 15-20.

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

    1. Адрес RSS-канала новостей (это была, кстати, самая сложная задача, так как на самом сайте 3DNews.ru этот адрес не так то и легко было отыскать)

    2. PHP5 под управлением сервера Apache

    3. Самый простой инструмент для работы с XML – модуль PHP SimpleXML (в PHP5 входит по умолчанию, о чем многие и не догадываются), удачно написанный в свое время замечательным программистом и превосходным человеком Стерлингом Хьюзом, кстати, если встретите его книгу о PHP, обязательно прикупите – очень советую.

    Почему именно PHP5? Ну, во-первых, из-за SimpleXML. Во-вторых, чтобы не очень возиться с файлами при чтении и записи, так как в пятерке PHP есть замечательные функции, которые позволяют выполнять стандартные операции с файлами за один оператор кода (например, file_put_contents()).

    Что получилось в результате – предлагаю ознакомиться с полным кодом сценария.

    // Трансляция новостей с 3DNews.ru 
    // http://www.3dnews.ru/news/rss/ 
    // Имя файла для хранения RSS на локальном сервере 
    $filename = 'rss/3dnews.xml'; 
    // URL RSS потока 
    $rss_url = 'http://www.3dnews.ru/news/rss/'; 
    // Закачка файлов XML 
    // Произвести проверку на то, что файл уже закачен 
    if (!file_exists($filename)) { 
      // Закачать и сохранить 
      download($rss_url, $filename); 
    } 
    // Создание объекта SIMPLEXML и загрузка документа 
    $xml = simplexml_load_file($filename); 
    $i = 1; 
    foreach ($xml->channel->item as $item) { 
      $title = $item->title; 
      $description = $item->description; 
      $link = $item->link; 
      echo iconv("UTF-8", "windows-1251", $title);
      echo iconv("UTF-8","windows-1251", $description);
      echo $link; 
      $i++; 
      if ($i > 5) break; // Не более 5 анонсов новостей 
    } 
    // Проверка на то, что если файл устарел более, чем на 12 часов - качать и сохранить новый 
    if (time() > filemtime($filename) + 60*60*12) { 
      // Закачать и сохранить 
      download($rss_url, $filename);    
    } 
    ############################################################################
    function download($url, $filename) { 
      // Закачать файл с указанного URL и сохранить с определенным именем 
      $file = file_get_contents($url); 
      if ($file) file_put_contents($filename, $file); 
    }

    И главное – не более 15 минут на все : )

    Примечание. Будите использовать этот код – убедитесь, что папка rss, которую я указал для хранения xml-документа новостей, имеет права на запись в нее PHP-сценарием.

    А информацию о том, что представляет из себя SimpleXML, можно почитать на сайте PHP.

    Опубликовано: Категория: phpКомментарии: 39

    Комментарии (оставить комментарий)

    Комментарий
    Иван Никитин

    А не проще из RSS делать HTML представление с помощью XSLT? В этом случае можно легко и без изменения кода менять внешний вид получаемых новостей? Да и быстро это... :)

    Ответить

    31.01.2007

    Комментарий
    Леонид

    То же вариант. Только, учитывая задачу кэширования, все равно пришлось бы php подключать. А к тому же нужно было бы подключать расширение XSL.

    Ответить

    01.02.2007

    Комментарий
    Sq.Piglet

    Спасибо, скрипт пригодился. Только одно, но для переменной $description нужно использовать strip_tags и htmlspecialchars, а для $link только htmlspecialchars. А то в RSS встречается много мусора.

    Ответить

    03.02.2007

    Комментарий
    Илья

    А у нас получилось так:
    Fatal error: Call to undefined function: file_put_contents()

    Ответить

    13.04.2007

    Комментарий
    Алексей Фёдоров

    Илья, а у вас точно стоит php 5-й версии?
    Для php4 можно воспользоваться такой реализацией - http://www.php.net/manual/ru/function.file-put-contents.php#68329

    Ответить

    16.04.2007

    Комментарий
    Илья

    Да, сорри, это Perl-версия у нас: 5.8.0, а PHP - Version 4.4.4 (Мне, дураку казалось, что PHP5 - это давно уже аксиома).
    Спасибо за поддержку.

    16.04.2007

    Комментарий
    Илья

    А функция simplexml_load_file ведь тоже для PHP5, альтернатива есть?

    16.04.2007

    Комментарий
    Леонид

    Тогда всю работу с XML надо будет вести через DOM. SimpleXML тоже только в PHP5.

    16.04.2007

    Комментарий
    Илья

    Всё пропало! Ладно, будуиспользовать корявый код не 29 кбайт. Вроде, работает.

    16.04.2007

    Комментарий
    iBaH

    а можно скинуть тот же скрип ..только для php4 )

    26.06.2007

    Комментарий
    Леонид

    Вообще-то есть такой скрипт... Я постараюсь на днях его опубликовать тут...

    Ответить

    26.06.2007

    Комментарий
    Станислав

    Всё же хотелось бы взглянуть на скрипт для PHP 4

    Ответить

    03.12.2007

    Комментарий
    Slv

    Отличный код. Не думал что там всё так просто... Нужна была ленточка новостей, страшно было подходить к этому. Этим кодом (с подгонкой силитей) решилось всё буквально за 5 минут.

    Ответить

    03.07.2007

    Комментарий
    Марат

    Отличный скрипт! Автор, уважуха :)))

    Ответить

    14.08.2007

    Комментарий
    Александр

    Это, конечно, не относится к RSS, но все же.
    Имеется:

    Как вытащить значение NUMRESULTS?

    Извиняюсь, если это тупой вопрос, но только начал работать с XML

    Ответить

    17.10.2007

    Комментарий
    Александр

    имеется:

    (Открывающий тег)SEARCHRESULTS QUERY="dvds" NUMRESULTS="10" TOTRESULTS="1813340" RESPONSETIME="12"(закрывающий тег)

    Ответить

    17.10.2007

    Комментарий
    halgerd

    Всё отлично, только как сделать, чтоб скрипт срабатывал в нужное время? Неужели нужно делать бесконечный цикл с проверкой времени обновления файла?

    Ответить

    25.10.2007

    Комментарий
    Леонид

    Ответ только один - Cron. Ни о каком бесконечном цикле не может быть и речи - максимальное время жизни сценария 30 сек.

    Ответить

    25.10.2007

    Комментарий
    Александр

    У меня вопрос?
    Есть доска объявлений у нее нет rss можноли как нибуть дописать это?

    Ответить

    18.11.2007

    Комментарий
    Evgeny

    А если нужно брать новости из нескольких источников, и выводить на сайт отсортированные по дате?

    Ответить

    20.11.2007

    Комментарий
    Леонид

    Элементарно. Парсим из XML все в массив. Парсим несколько источников. Массив сортируем как надо и выводим. Начальная школа PHP.

    Ответить

    21.11.2007

    Комментарий
    MPTron

    Спасибо! Очень помогло!

    Ответить

    19.02.2008

    Комментарий
    Сергей

    Очень полезная инфа! Респект автору!

    Ответить

    21.02.2008

    Комментарий
    Tooor

    Скрипт прост и удобен. Спасибо, что есть люди которые могут бескорыстно делиться. Но прошу прощения за наглость, т.к. я по природе не склонен к программированию. Если вдруг для вас не составляет труда написать импортер новостей с сайта news2.ru, сразу с картинками, то у меня не будет слов. Просьба не критиковать мою наглость, сам всё знаю. За спрос денег же не берут?!)) Спасибо за внимание.

    Ответить

    07.03.2008

    Комментарий
    Леонид

    Сорри! Нет времени...

    Ответить

    07.03.2008

    Комментарий
    SerpantiN

    О-г-р-о-м-н-о-е спасибо, Леонид.

    Ответить

    10.05.2008

    Комментарий
    Лена

    Спасибо, Леонид! Очень полезная прога. А подскажите, пжлста, как ищется RSS-канал, и если его нет - можно ли его как-то создать на своём сайте?

    Ответить

    13.05.2008

    Комментарий
    Леонид Лукин

    Поиск RSS осуществляется стандартными средствами. Можете посмотреть вот тут - http://www.kanban.ru/catalog.asp. Таких ресурсов в сети хватает. А создается RSS почти так же как и парсится. Единственная сложность - работа с источником новостей.

    Ответить

    13.05.2008

    Комментарий
    Николай

    Прмогите пожайлуста, всё вроде сделал:закинул скрипт на сервер,создал папку rss с файлом 3dnews.xml, поставил права доступа 777,не работает , может я что то не так сделал.

    Ответить

    26.11.2008

    Комментарий
    AS

    аааа, спасибо большой. Смог распарсить xml партнерки с помощью вашего примера)))

    Ответить

    16.02.2009

    Комментарий
    Акварели

    Спасибо! Отлично

    Ответить

    13.04.2009

    Комментарий
    Zergalius

    Кулл, работает, а то уж думал самаму сесть изучить :-) Спасибо!

    Ответить

    15.06.2009

    Комментарий
    Бакланов

    спасибо, помогло

    Ответить

    01.08.2009

    Комментарий
    Владимир

    Респект!!!
    Леонид, а как вывести из xml
    такой тег ?

    Ответить

    30.09.2009

    Комментарий
    Иваныч

    вот подборочка программок.будет интерестна для администраторов новостных сайтов http://depositfiles.com/files/s2ttm89uf

    Ответить

    21.11.2009

    Комментарий
    Вячеслав

    Спасибо. Отличный скрипт! Простой и надежный Единственная проблема. Нужно брать с одного адреса новости, а с другого статьи. Два скрипта не хотят дружить друг с другом. Есть ли решение?

    Ответить

    18.02.2010

    Комментарий
    Алексей

    Присоединяюсь к благодарностям. Огромное спасибо вам Леонид.
    Скрипт простой и удобный.

    Ответить

    29.10.2010

    Комментарий
    Палыч

    Спасибо за статью. С вашими подсказками получилось вот так:
    ...
    if (!file_exists($filename)) {
    if (time() > filemtime($filename) + 60*60*12) {
    copy($rss_url, $filename);
    }
    }
    ...

    Ответить

    24.03.2011

    Комментарий
    Палыч

    Извиняюсь, поправочка. Так скрипт работает только один раз:). Первый if надо вообще убрать и копировать только по времени, или использовать один if с ||.

    Ответить

    24.03.2011

    Оставьте свой комментарий

    Ваше имя: Email: Оставьте свой email, если хотите получать уведомления о комментариях на этой странице. Ваш email не будет опубликован на сайте.