Скрипт импорта RSS новостей

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

RSS — это разновидность XML. Изначально придуманный Netscape для их портала Netcenter, он быстро завоевал популярность и стал черезвычайно широко использоваться. Сегодня мы напишем скрипт для импорта RSS новостей с другого сайта.

Пример RSS-ленты:

<?xml version="1.0" encoding="Windows-1251"?>
<rss version="2.0">
  <channel>

  <title>Новости по системам безопасности</title>
  <link>http://www.secnews.ru</link>
  <description>
  Российские новости по техническим средствам и системам безопасности (видеонаблюдение, контроль доступа,
  охранно-пожарная сигализация...).
  </description>
  <lastBuildDate>Fri, 04 Jul 2008 09:58:29 +0400</lastBuildDate>
  <ttl>6</ttl>

  <item>
    <title>&quot;Техносила&quot; и СМ ТРЭЙД -- 37 магазинов за полгода</title>
    <link>http://www.secnews.ru/russian/11392.htm</link>
    <description>
    В I и II кварталах 2008 года компания СМ ТРЭЙД выполнила работы по оснащению противокражными
    антеннами и системами защиты товаров на стеллажах 37 магазинов &quot;Техносила&quot; в различных
    городах.
    </description>
    <enclosure url="http://www.secnews.ru/upload/iblock/5c7/5c7a8b666bcffb125c34bcabac4c9510.jpg"
    length="4438" type="image/jpeg" width="100" height="100"/>

    <category>Новости компаний/</category>
    <pubDate>Wed, 02 Jul 2008 00:00:00 +0400</pubDate>
  </item>

  <item>
    <title>CCTV от JVC -- подтверждено соответствие ГОСТ Р</title>
    <link>http://www.secnews.ru/russian/11382.htm</link>
    <description>
    В июне 2008 г компанией JVC получены сертификаты соответствия ГОСТ Р на все производимые
    продукты для профессионального использования. Это коснулось и компонентов систем безопасности.
    </description>
    <enclosure url="http://www.secnews.ru/upload/iblock/958/958b332757db459af234b994be125422.jpg"
    length="3772" type="image/jpeg" width="100" height="100"/>

    <category>Новости компаний/</category>
    <pubDate>Tue, 01 Jul 2008 00:00:00 +0400</pubDate>
  </item>

  <item>
    <title>Поддержка камер Arecont Vision в видеосерверах Domination</title>
    <link>http://www.secnews.ru/russian/11384.htm</link>
    <description>
    Привлекательность камер от Arecont Vision неоспорима: разрешение от 1,3 до 8 Мпикс, встроенные детекторы
    движения, подача электропитания по кабелям Ethernet и при этом -- весьма умеренная цена. А с июня 2008 г.
    у камер появляется еще одно преимущество -- способность работать с видеосерверами семейства Domination IP,
    производимыми и поставляемыми компанией ВИПАКС.
    </description>
    <enclosure url="http://www.secnews.ru/upload/iblock/ac3/ac370d5de67a7d543daf085698809611.jpg"
    length="3582" type="image/jpeg" width="100" height="100"/>

    <category>Новости компаний/</category>
    <pubDate>Tue, 01 Jul 2008 00:00:00 +0400</pubDate>
  </item>

</channel>
</rss>

Скрипт, читающий RSS-ленту со стороннего сайта:

<?php
$url = 'http://www.secnews.ru/russian/rss.php';

$reg_exp  = '#<item>.*?<title>(.*?)<\/title>.*?';
$reg_exp .='<link>(.*?)<\/link>.*?<description>';
$reg_exp .='(.*?)<\/description>.*?<\/item>#si';

$pattern = '<a href="%s">%s</a><br>%s<hr>';

if ( $xml_data = file_get_contents($url) ) {
    $rss_data = parse_rss($reg_exp, $xml_data);
    echo output_rss($pattern, $rss_data);
}

function parse_rss($reg_exp, $xml_data) {
    preg_match_all($reg_exp, $xml_data, $temp);
    return array(
        'count'=>count($temp[0]),
        'title'=>$temp[1],
        'link'=>$temp[2],
        'desc'=>$temp[3]
    );
}

function output_rss($pattern, $rss_data) {
    for($i=0; $i<$rss_data['count']; $i++) {
        $temp .= sprintf($pattern,
            $rss_data['link'][$i],
            html_entity_decode($rss_data['title'][$i]),
            html_entity_decode($rss_data['desc'][$i])
        );
    }
    return $temp;
}
?>

Как видите, для извлечения информации здесь используются регулярные выражения. Но использовать PCRE для решения такой задачи — это стрельба из пушки по воробьям. В PHP есть гораздо более удобные средства для работы с XML — например, SimpleXML:

<?php
$rss = simplexml_load_file ( 'http://www.secnews.ru/russian/rss.php' );
header("Content-Type: text/html; charset=utf-8");
// print_r( $rss );
echo '<h1><a href="'.$rss->channel->link.'">'.$rss->channel->title.'</a></h1>'."\n";
echo '<table>'."\n";
foreach ( $rss->channel->item as $item ) 
{
  echo '<tr valign="top">';
  $image = $item->enclosure;
  echo '<td>';
  echo '<img src="'.$image['url'].'" width="'.$image['width'].'" height="'.$image['height'].'" alt="" />';
  echo '</td>';
  echo '<td>';
  echo '<h3><a href="'.$item->link.'">'.$item->title.'</a></h3>';
  echo '<div>'.$item->description.'</div>';
  echo '</td>';
  echo '</tr>'."\n";
  echo '<tr><td colspan="2">&nbsp;</td></tr>'."\n"
 }
echo '</table>';
?>

Ниже показана структура, созданная после вызова функции simplexml_load_file()

SimpleXMLElement Object
(
    [@attributes] => Array
        (
            [version] => 2.0
        )

    [channel] => SimpleXMLElement Object
        (
            [title] => Новости по системам безопасности
            [link] => http://www.secnews.ru
            [description] =>
  Российские новости по техническим средствам и системам безопасности (видеонаблюдение, контроль доступа,
  охранно-пожарная сигализация...).
 
            [lastBuildDate] => Fri, 04 Jul 2008 09:58:29 +0400
            [ttl] => 6
            [item] => Array
                (
                    [0] => SimpleXMLElement Object
                        (
                            [title] => "Техносила" и СМ ТРЭЙД -- 37 магазинов за полгода
                            [link] => http://www.secnews.ru/russian/11392.htm
                            [description] =>
    В I и II кварталах 2008 года компания СМ ТРЭЙД выполнила работы по оснащению противокражными
    антеннами и системами защиты товаров на стеллажах 37 магазинов "Техносила" в различных
    городах.
   
                            [enclosure] => SimpleXMLElement Object
                                (
                                    [@attributes] => Array
                                        (
                                            [url] => http://www.secnews.ru/upload/iblock/5c7/5c7a8b666bcffb125c34bcabac4c9510.jpg
                                            [length] => 4438
                                            [type] => image/jpeg
                                            [width] => 100
                                            [height] => 100
                                        )

                                )

                            [category] => Новости компаний/
                            [pubDate] => Wed, 02 Jul 2008 00:00:00 +0400
                        )

                    [1] => SimpleXMLElement Object
                        (
                            [title] => CCTV от JVC -- подтверждено соответствие ГОСТ Р
                            [link] => http://www.secnews.ru/russian/11382.htm
                            [description] =>
    В июне 2008 г компанией JVC получены сертификаты соответствия ГОСТ Р на все производимые
    продукты для профессионального использования. Это коснулось и компонентов систем безопасности.
   
                            [enclosure] => SimpleXMLElement Object
                                (
                                    [@attributes] => Array
                                        (
                                            [url] => http://www.secnews.ru/upload/iblock/958/958b332757db459af234b994be125422.jpg
                                            [length] => 3772
                                            [type] => image/jpeg
                                            [width] => 100
                                            [height] => 100
                                        )

                                )

                            [category] => Новости компаний/
                            [pubDate] => Tue, 01 Jul 2008 00:00:00 +0400
                        )

                    [2] => SimpleXMLElement Object
                        (
                            [title] => Поддержка камер Arecont Vision в видеосерверах Domination
                            [link] => http://www.secnews.ru/russian/11384.htm
                            [description] =>
    Привлекательность камер от Arecont Vision неоспорима: разрешение от 1,3 до 8 Мпикс, встроенные детекторы
    движения, подача электропитания по кабелям Ethernet и при этом -- весьма умеренная цена. А с июня 2008 г.
    у камер появляется еще одно преимущество -- способность работать с видеосерверами семейства Domination IP,
    производимыми и поставляемыми компанией ВИПАКС.
   
                            [enclosure] => SimpleXMLElement Object
                                (
                                    [@attributes] => Array
                                        (
                                            [url] => http://www.secnews.ru/upload/iblock/ac3/ac370d5de67a7d543daf085698809611.jpg
                                            [length] => 3582
                                            [type] => image/jpeg
                                            [width] => 100
                                            [height] => 100
                                        )

                                )

                            [category] => Новости компаний/
                            [pubDate] => Tue, 01 Jul 2008 00:00:00 +0400
                        )

                )

        )

)

Разумеется, запрашивать каждый раз файл со стороннего сайта, парсить его, формировать html — дело накладное (и по времени и по нагрузке). Надо запросить этот XML-документ раз в сутки (для этого идеально подходит CRON), сформировать HTML и записать в файл или базу данных. А скрипт, который выводит RSS-ленту будет просто брать готовый HTML из файла или из БД.

Ссылки по теме:

Комментариев: 12

  1. Евгений:

    Скрипт хороший, спасибо! Вот только дату публикации новости не показывает. Может подскажете в чем дело.

  2. Евгений:

    И еще, как можно сделать чтобы импортировались допустим только две или три последние новости?

  3. admin:

    Евгений, а не пробовали голову включить? Если к заголовку новости мы обращаемся $item->title, а к описанию $item->description, то, наверное, нетрудно догадаться, как вывести дату: $item->pubDate

  4. multur:

    а как сделать чтобы показывался скрипт не в отдельном окне а в блоке на сайте

  5. admin:

    а как сделать чтобы показывался скрипт не в отдельном окне а в блоке на сайте
    Ну, это скорее вопрос HTML-верстки: PHP позволяет нам динамически формировать контент, а где и как его разместить на странице - дело вкуса

    <div style="position:absolute; width:300px; height:200px; top:100px; left:100px">
    <?php
    // Здесь код импорта RSS
    ?>
    </div>

    Вот еще вариант:
    Плагин jFrame для библиотеки jQuery

  6. перевозки:

    слушай я в этом вообще не волоку! мне бы сам крипт и то что нужно вставить в html :) выручай а :)

  7. admin:

    перевозки, давайте обсудим проблему на форуме

  8. Евгений:

    А как можно ли сделать в скрипте
    echo ”.$item->pubDate.”;
    чтобы дата выводилась в формате “13:00 30.07.2009″ а не “Thu, 30 Jul 2009 14:15:31 +0400″

  9. admin:

    Евгений:
    echo date( ‘H:i d.m.Y’, strtotime( ‘Thu, 30 Jul 2009 14:15:31 +0400′ ) );

  10. Сергей:

    Поставил SimpleXML все как написано, но выводится:
    Parse error: syntax error, unexpected T_STRING, expecting ‘,’ or ‘;’ in /sata1/home/users/piazzo/www/www.slavyansk.biz.ua/newstv.php on line 37

    В строке 37 стоит:
    header(”Content-Type: text/html; charset=utf-8″);

  11. admin:

    Сергей, это синтаксическая ошибка (syntax error), не ожидается строка (unexpected T_STRING), ожидается (expecting) ‘,’ (запятая) или ‘;’ (точка с запятой)
    Другие примеры:
    Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING
    Parse error: parse error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or ‘}’

  12. duh:

    блин админ спасибо бальшое наконец всё по человечески заработала

Оставьте свой отзыв